1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.directwebremoting.guice;
17
18 import com.google.inject.Key;
19 import com.google.inject.Injector;
20 import com.google.inject.Provider;
21
22 import java.util.Collection;
23 import java.util.Iterator;
24 import java.util.Map;
25
26 import org.directwebremoting.AjaxFilter;
27 import org.directwebremoting.impl.DefaultAjaxFilterManager;
28 import org.directwebremoting.extend.*;
29 import org.directwebremoting.util.Logger;
30
31 import static org.directwebremoting.guice.DwrGuiceUtil.getInjector;
32 import static org.directwebremoting.guice.DwrGuiceUtil.getServletContext;
33
34 /**
35 * Extends an existing ajax filter manager with an injected list of ajax filters
36 * specified at Guice bind-time. Only to be used in conjection with
37 * {@link DwrGuiceServlet}.
38 * @author Tim Peierls [tim at peierls dot net]
39 */
40 public class InternalAjaxFilterManager implements AjaxFilterManager
41 {
42 /**
43 * Retrieves an underlying ajaxFilter manager from thread-local state
44 * to which this class delegates {@link AjaxFilterManager} calls.
45 */
46 public InternalAjaxFilterManager()
47 {
48 this.ajaxFilterManager = getAjaxFilterManager();
49 addAjaxFilters();
50 }
51
52 public Iterator<AjaxFilter> getAjaxFilters(String scriptname)
53 {
54 return (Iterator<AjaxFilter>) ajaxFilterManager.getAjaxFilters(scriptname);
55 }
56
57 public void addAjaxFilter(AjaxFilter filter)
58 {
59 ajaxFilterManager.addAjaxFilter(filter);
60 }
61
62 public void addAjaxFilter(AjaxFilter filter, String scriptname)
63 {
64 ajaxFilterManager.addAjaxFilter(filter, scriptname);
65 }
66
67
68 private final AjaxFilterManager ajaxFilterManager;
69
70 private void addAjaxFilters()
71 {
72 Injector injector = getInjector();
73 for (Key<?> key : injector.getBindings().keySet())
74 {
75 Class<?> atype = key.getAnnotationType();
76 if (atype != null && Filtering.class.isAssignableFrom(atype))
77 {
78 String scriptName = Filtering.class.cast(key.getAnnotation()).value();
79 Provider<AjaxFilter> provider = injector.getProvider((Key<AjaxFilter>) key);
80 if ("".equals(scriptName))
81 {
82 addAjaxFilter(new InternalAjaxFilter(provider));
83 }
84 else
85 {
86 addAjaxFilter(new InternalAjaxFilter(provider), scriptName);
87 }
88 }
89 }
90 }
91
92
93 /**
94 * Stores a type name in a thread-local variable for later retrieval by
95 * {@code getAjaxFilterManager}.
96 */
97 static void setTypeName(String name)
98 {
99 typeName.set(name);
100 }
101
102 private static AjaxFilterManager getAjaxFilterManager()
103 {
104 String name = typeName.get();
105 try
106 {
107 Class<? extends AjaxFilterManager> cls =
108 (Class<? extends AjaxFilterManager>) Class.forName(name);
109 return cls.newInstance();
110 }
111 catch (Exception e)
112 {
113 if (name != null && !"".equals(name)) {
114 log.warn("Couldn't make AjaxFilterManager from type: " + name);
115 }
116 return new DefaultAjaxFilterManager();
117 }
118 }
119
120
121 /**
122 * Place to stash a type name for retrieval in same thread.
123 */
124 private static final ThreadLocal<String> typeName = new ThreadLocal<String>();
125
126
127 /**
128 * The log stream
129 */
130 private static final Logger log = Logger.getLogger(InternalAjaxFilterManager.class);
131 }