View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
4    */
5   package mockit.internal.injection.full;
6   
7   import static java.util.Collections.enumeration;
8   
9   import edu.umd.cs.findbugs.annotations.NonNull;
10  
11  import java.io.InputStream;
12  import java.net.URL;
13  import java.security.SecureRandom;
14  import java.util.Enumeration;
15  import java.util.EventListener;
16  import java.util.HashMap;
17  import java.util.Map;
18  import java.util.Set;
19  
20  import javax.servlet.Filter;
21  import javax.servlet.FilterRegistration;
22  import javax.servlet.RequestDispatcher;
23  import javax.servlet.Servlet;
24  import javax.servlet.ServletContext;
25  import javax.servlet.ServletRegistration;
26  import javax.servlet.ServletRegistration.Dynamic;
27  import javax.servlet.SessionCookieConfig;
28  import javax.servlet.SessionTrackingMode;
29  import javax.servlet.descriptor.JspConfigDescriptor;
30  import javax.servlet.http.HttpSession;
31  import javax.servlet.http.HttpSessionContext;
32  
33  import mockit.internal.injection.InjectionPoint;
34  import mockit.internal.injection.InjectionState;
35  
36  /**
37   * Detects and resolves dependencies belonging to the <code>javax.servlet</code> API, namely <code>ServletContext</code>
38   * and <code>HttpSession</code>.
39   */
40  final class ServletDependencies {
41      static boolean isApplicable(@NonNull Class<?> dependencyType) {
42          return dependencyType == HttpSession.class || dependencyType == ServletContext.class;
43      }
44  
45      @NonNull
46      private final InjectionState injectionState;
47  
48      ServletDependencies(@NonNull InjectionState injectionState) {
49          this.injectionState = injectionState;
50      }
51  
52      @NonNull
53      Object createAndRegisterDependency(@NonNull Class<?> dependencyType) {
54          if (dependencyType == ServletContext.class) {
55              return createAndRegisterServletContext();
56          }
57  
58          return createAndRegisterHttpSession();
59      }
60  
61      @NonNull
62      private ServletContext createAndRegisterServletContext() {
63          ServletContext context = new ServletContext() {
64              private final Map<String, String> init = new HashMap<>();
65              private final Map<String, Object> attrs = new HashMap<>();
66  
67              @Override
68              public String getContextPath() {
69                  return "";
70              }
71  
72              @Override
73              public ServletContext getContext(String uriPath) {
74                  return null;
75              }
76  
77              @Override
78              public int getMajorVersion() {
79                  return 3;
80              }
81  
82              @Override
83              public int getMinorVersion() {
84                  return 0;
85              }
86  
87              @Override
88              public int getEffectiveMajorVersion() {
89                  return 3;
90              }
91  
92              @Override
93              public int getEffectiveMinorVersion() {
94                  return 0;
95              }
96  
97              @Override
98              public String getMimeType(String file) {
99                  return null;
100             }
101 
102             @Override
103             public String getRealPath(String path) {
104                 return null;
105             }
106 
107             @Override
108             public Set<String> getResourcePaths(String path) {
109                 return null;
110             }
111 
112             @Override
113             public URL getResource(String path) {
114                 return getClass().getResource(path);
115             }
116 
117             @Override
118             public InputStream getResourceAsStream(String path) {
119                 return getClass().getResourceAsStream(path);
120             }
121 
122             @Override
123             public RequestDispatcher getRequestDispatcher(String path) {
124                 return null;
125             }
126 
127             @Override
128             public RequestDispatcher getNamedDispatcher(String name) {
129                 return null;
130             }
131 
132             @Override
133             public String getServletContextName() {
134                 return null;
135             }
136 
137             @Override
138             public String getServerInfo() {
139                 return "JMockit 1.x";
140             }
141 
142             @Override
143             public ClassLoader getClassLoader() {
144                 return getClass().getClassLoader();
145             }
146 
147             // Deprecated/logging methods: do nothing.
148             @Override
149             public Servlet getServlet(String name) {
150                 return null;
151             }
152 
153             @Override
154             public Enumeration<Servlet> getServlets() {
155                 return null;
156             }
157 
158             @Override
159             public Enumeration<String> getServletNames() {
160                 return null;
161             }
162 
163             @Override
164             public void log(String msg) {
165             }
166 
167             @Override
168             public void log(Exception exception, String msg) {
169             }
170 
171             @Override
172             public void log(String message, Throwable throwable) {
173             }
174 
175             // Context initialization parameters.
176             @Override
177             public Enumeration<String> getInitParameterNames() {
178                 return enumeration(init.keySet());
179             }
180 
181             @Override
182             public String getInitParameter(String name) {
183                 return init.get(name);
184             }
185 
186             @Override
187             public boolean setInitParameter(String name, String value) {
188                 return init.put(name, value) == null;
189             }
190 
191             // Context attributes.
192             @Override
193             public Enumeration<String> getAttributeNames() {
194                 return enumeration(attrs.keySet());
195             }
196 
197             @Override
198             public Object getAttribute(String name) {
199                 return attrs.get(name);
200             }
201 
202             @Override
203             public void setAttribute(String name, Object value) {
204                 attrs.put(name, value);
205             }
206 
207             @Override
208             public void removeAttribute(String name) {
209                 attrs.remove(name);
210             }
211 
212             // Un-implemented methods, which may get a non-empty implementation eventually.
213             @Override
214             public ServletRegistration.Dynamic addServlet(String name, String className) {
215                 return null;
216             }
217 
218             @Override
219             public ServletRegistration.Dynamic addServlet(String name, Servlet servlet) {
220                 return null;
221             }
222 
223             @Override
224             public ServletRegistration.Dynamic addServlet(String nm, Class<? extends Servlet> c) {
225                 return null;
226             }
227 
228             @Override
229             public <T extends Servlet> T createServlet(Class<T> clazz) {
230                 return null;
231             }
232 
233             @Override
234             public ServletRegistration getServletRegistration(String servletName) {
235                 return null;
236             }
237 
238             @Override
239             public Map<String, ? extends ServletRegistration> getServletRegistrations() {
240                 return null;
241             }
242 
243             @Override
244             public FilterRegistration.Dynamic addFilter(String name, String className) {
245                 return null;
246             }
247 
248             @Override
249             public FilterRegistration.Dynamic addFilter(String name, Filter filter) {
250                 return null;
251             }
252 
253             @Override
254             public FilterRegistration.Dynamic addFilter(String name, Class<? extends Filter> cl) {
255                 return null;
256             }
257 
258             @Override
259             public <T extends Filter> T createFilter(Class<T> clazz) {
260                 return null;
261             }
262 
263             @Override
264             public FilterRegistration getFilterRegistration(String filterName) {
265                 return null;
266             }
267 
268             @Override
269             public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
270                 return null;
271             }
272 
273             @Override
274             public SessionCookieConfig getSessionCookieConfig() {
275                 return null;
276             }
277 
278             @Override
279             public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes) {
280             }
281 
282             @Override
283             public Set<SessionTrackingMode> getDefaultSessionTrackingModes() {
284                 return null;
285             }
286 
287             @Override
288             public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() {
289                 return null;
290             }
291 
292             @Override
293             public void addListener(String className) {
294             }
295 
296             @Override
297             public <T extends EventListener> void addListener(T t) {
298             }
299 
300             @Override
301             public void addListener(Class<? extends EventListener> listenerClass) {
302             }
303 
304             @Override
305             public <T extends EventListener> T createListener(Class<T> clazz) {
306                 return null;
307             }
308 
309             @Override
310             public JspConfigDescriptor getJspConfigDescriptor() {
311                 return null;
312             }
313 
314             @Override
315             public void declareRoles(String... roleNames) {
316             }
317 
318             @Override
319             public String getVirtualServerName() {
320                 return null;
321             }
322 
323             // Allow older servlet still (no overrides)
324             @Override
325             public Dynamic addJspFile(String servletName, String jspFile) {
326                 return null;
327             }
328 
329             @Override
330             public int getSessionTimeout() {
331                 return 0;
332             }
333 
334             @Override
335             public void setSessionTimeout(int sessionTimeout) {
336             }
337 
338             @Override
339             public String getRequestCharacterEncoding() {
340                 return null;
341             }
342 
343             @Override
344             public void setRequestCharacterEncoding(String encoding) {
345             }
346 
347             @Override
348             public String getResponseCharacterEncoding() {
349                 return null;
350             }
351 
352             @Override
353             public void setResponseCharacterEncoding(String encoding) {
354             }
355         };
356 
357         InjectionPoint injectionPoint = new InjectionPoint(ServletContext.class);
358         InjectionState.saveGlobalDependency(injectionPoint, context);
359         return context;
360     }
361 
362     @NonNull
363     private HttpSession createAndRegisterHttpSession() {
364         HttpSession session = new HttpSession() {
365             private final String id = String.valueOf(new SecureRandom().nextInt(Integer.MAX_VALUE));
366             private final long creationTime = System.currentTimeMillis();
367             private final Map<String, Object> attrs = new HashMap<>();
368             private int maxInactiveInterval;
369             private boolean invalidated;
370 
371             @Override
372             public String getId() {
373                 return id;
374             }
375 
376             @Override
377             public int getMaxInactiveInterval() {
378                 return maxInactiveInterval;
379             }
380 
381             @Override
382             public void setMaxInactiveInterval(int interval) {
383                 maxInactiveInterval = interval;
384             }
385 
386             @Override
387             public long getCreationTime() {
388                 checkValid();
389                 return creationTime;
390             }
391 
392             @Override
393             public long getLastAccessedTime() {
394                 checkValid();
395                 return creationTime;
396             }
397 
398             @Override
399             public boolean isNew() {
400                 checkValid();
401                 return false;
402             }
403 
404             @Override
405             public Enumeration<String> getAttributeNames() {
406                 checkValid();
407                 return enumeration(attrs.keySet());
408             }
409 
410             @Override
411             public Object getAttribute(String name) {
412                 checkValid();
413                 return attrs.get(name);
414             }
415 
416             @Override
417             public void setAttribute(String name, Object value) {
418                 checkValid();
419                 attrs.put(name, value);
420             }
421 
422             @Override
423             public void removeAttribute(String name) {
424                 checkValid();
425                 attrs.remove(name);
426             }
427 
428             @Override
429             public void invalidate() {
430                 checkValid();
431                 attrs.clear();
432                 invalidated = true;
433             }
434 
435             private void checkValid() {
436                 if (invalidated) {
437                     throw new IllegalStateException("Session is invalid");
438                 }
439             }
440 
441             @Override
442             public ServletContext getServletContext() {
443                 ServletContext context = InjectionState.getGlobalDependency(new InjectionPoint(ServletContext.class));
444 
445                 if (context == null) {
446                     context = createAndRegisterServletContext();
447                 }
448 
449                 return context;
450             }
451 
452             // Deprecated methods: do nothing.
453             @Override
454             public Object getValue(String name) {
455                 return null;
456             }
457 
458             @Override
459             public void putValue(String name, Object value) {
460             }
461 
462             @Override
463             public void removeValue(String name) {
464             }
465 
466             @Override
467             public String[] getValueNames() {
468                 return null;
469             }
470 
471             @SuppressWarnings("deprecation")
472             @Override
473             public HttpSessionContext getSessionContext() {
474                 return null;
475             }
476         };
477 
478         InjectionPoint injectionPoint = new InjectionPoint(HttpSession.class);
479         injectionState.saveInstantiatedDependency(injectionPoint, session);
480         return session;
481     }
482 }