View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package com.acme.test;
20  
21  import java.io.IOException;
22  import java.util.ArrayList;
23  import java.util.Arrays;
24  import java.util.List;
25  
26  import javax.annotation.PostConstruct;
27  import javax.annotation.PreDestroy;
28  import javax.annotation.Resource;
29  import javax.annotation.security.DeclareRoles;
30  import javax.annotation.security.RunAs;
31  import javax.naming.InitialContext;
32  import javax.servlet.ServletConfig;
33  import javax.servlet.ServletException;
34  import javax.servlet.ServletOutputStream;
35  import javax.servlet.annotation.WebInitParam;
36  import javax.servlet.annotation.WebServlet;
37  import javax.servlet.http.HttpServlet;
38  import javax.servlet.http.HttpServletRequest;
39  import javax.servlet.http.HttpServletResponse;
40  import javax.sql.DataSource;
41  import javax.transaction.UserTransaction;
42  
43  /**
44   * AnnotationTest
45   * 
46   * Use Annotations from within Jetty.
47   * 
48   * Also, use servlet spec 2.5 resource injection and lifecycle callbacks from within the web.xml
49   * to set up some of the JNDI resources.
50   *
51   */
52  
53  @RunAs("special")
54  @WebServlet(urlPatterns = {"/","/test/*"}, name="AnnotationTest", initParams={@WebInitParam(name="fromAnnotation", value="xyz")})
55  @DeclareRoles({"user","client"})
56  public class AnnotationTest extends HttpServlet 
57  {
58      static List<String> __HandlesTypes; 
59      private String postConstructResult = "";
60      private String dsResult = "";
61      private String envResult = "";
62      private String envLookupResult = "";
63      private String envResult2 ="";
64      private String envLookupResult2 = "";
65      private String envResult3 = "";
66      private String envLookupResult3 = "";
67      private String dsLookupResult = "";
68      private String txResult = "";
69      private String txLookupResult = "";
70      private DataSource myDS;
71      private ServletConfig config;
72      
73      @Resource(mappedName="UserTransaction")
74      private UserTransaction myUserTransaction;
75  
76  
77      @Resource(mappedName="maxAmount")
78      private Double maxAmount;
79      
80      @Resource(name="someAmount")
81      private Double minAmount;
82  
83      @Resource
84      private Double avgAmount;
85  
86     
87      @Resource(mappedName="jdbc/mydatasource")
88      public void setMyDatasource(DataSource ds)
89      {
90          myDS=ds;
91      }
92    
93      
94      @PostConstruct
95      private void myPostConstructMethod ()
96      {       
97          postConstructResult = "<span class=\"pass\">PASS</span>";
98         try 
99         {
100            dsResult = (myDS==null?"<span class=\"fail\">FAIL</span>":"<span class=\"pass\">myDS="+myDS.toString()+"</span>");
101        }
102        catch (Exception e)
103        {
104            dsResult = "<span class=\"fail\">FAIL:</span> "+e;
105        }
106 
107 
108        envResult = (maxAmount==null?"FAIL</span>":"<span class=\"pass\">maxAmount="+maxAmount.toString()+"</span>");
109        
110        try
111        {
112            InitialContext ic = new InitialContext();
113            envLookupResult = "java:comp/env/com.acme.test.AnnotationTest/maxAmount="+ic.lookup("java:comp/env/com.acme.test.AnnotationTest/maxAmount");
114        }
115        catch (Exception e)
116        {
117            envLookupResult = "<span class=\"fail\">FAIL:</span> "+e;
118        }
119 
120       envResult2 = (minAmount==null?"<span class=\"fail\">FAIL</span>":"<span class=\"pass\">minAmount="+minAmount.toString()+"</span>");
121       try
122       {
123           InitialContext ic = new InitialContext();
124           envLookupResult2 = "java:comp/env/someAmount="+ic.lookup("java:comp/env/someAmount");
125       }
126       catch (Exception e)
127       {
128           envLookupResult2 = "<span class=\"fail\">FAIL:</span> "+e;
129       }
130       envResult3 = (minAmount==null?"<span class=\"fail\">FAIL</span>":"<span class=\"pass\">avgAmount="+avgAmount.toString()+"</span>");
131       try
132       {
133           InitialContext ic = new InitialContext();
134           envLookupResult3 = "java:comp/env/com.acme.test.AnnotationTest/avgAmount="+ic.lookup("java:comp/env/com.acme.test.AnnotationTest/avgAmount");
135       }
136       catch (Exception e)
137       {
138           envLookupResult3 = "<span class=\"fail\">FAIL:</span> "+e;
139       }
140       
141       
142       
143        try
144        {
145            InitialContext ic = new InitialContext();
146            dsLookupResult = "java:comp/env/com.acme.test.AnnotationTest/myDatasource="+ic.lookup("java:comp/env/com.acme.test.AnnotationTest/myDatasource");
147        }
148        catch (Exception e)
149        {
150            dsLookupResult = "<span class=\"fail\">FAIL:</span> "+e;
151        }
152        
153        txResult = (myUserTransaction==null?"<span class=\"fail\">FAIL</span>":"<span class=\"pass\">myUserTransaction="+myUserTransaction+"</span>");
154        try
155        {
156            InitialContext ic = new InitialContext();
157            txLookupResult = "java:comp/env/com.acme.test.AnnotationTest/myUserTransaction="+ic.lookup("java:comp/env/com.acme.test.AnnotationTest/myUserTransaction");
158        }
159        catch (Exception e)
160        {
161            txLookupResult = "<span class=\"fail\">FAIL:</span> "+e;
162        }
163     }
164     
165     @PreDestroy
166     private void myPreDestroyMethod()
167     {
168     }
169     
170     public void init(ServletConfig config) throws ServletException
171     {
172         super.init(config);
173         this.config = config;
174     }
175 
176     
177     
178     /* ------------------------------------------------------------ */
179     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
180     {
181         doGet(request, response);
182     }
183 
184     /* ------------------------------------------------------------ */
185     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
186     {      
187         try
188         {
189             response.setContentType("text/html");
190             ServletOutputStream out = response.getOutputStream();
191             out.println("<html>");
192             out.println("<HEAD><link rel=\"stylesheet\" type=\"text/css\"  href=\"stylesheet.css\"/></HEAD>");
193             out.println("<body>");
194             out.println("<h1>Results</h1>");
195 
196             out.println("<h2>Init Params from Annotation</h2>");
197             out.println("<pre>");
198             out.println("initParams={@WebInitParam(name=\"fromAnnotation\", value=\"xyz\")}");
199             out.println("</pre>");
200             out.println("<p><b>Result: "+("xyz".equals(config.getInitParameter("fromAnnotation"))? "<span class=\"pass\">PASS": "<span class=\"fail\">FAIL")+"</span></p>");
201 
202             out.println("<h2>Init Params from web-fragment</h2>");
203             out.println("<pre>");
204             out.println("extra1=123, extra2=345");
205             out.println("</pre>");
206             boolean fragInitParamResult = "123".equals(config.getInitParameter("extra1")) && "345".equals(config.getInitParameter("extra2"));
207             out.println("<p><b>Result: "+(fragInitParamResult? "<span class=\"pass\">PASS": "<span class=\"fail\">FAIL")+"</span></p>");
208 
209 
210              __HandlesTypes = Arrays.asList( "javax.servlet.GenericServlet", 
211                                              "javax.servlet.http.HttpServlet", 
212                                              "com.acme.test.AsyncListenerServlet",
213                                              "com.acme.test.AnnotationTest", 
214                                              "com.acme.test.RoleAnnotationTest", 
215                                              "com.acme.test.MultiPartTest", 
216                                              "com.acme.fragment.FragmentServlet", 
217                                              "com.acme.test.TestListener",
218                                              "com.acme.test.SecuredServlet",
219                                              "com.acme.test.Bar");
220              out.println("<h2>@ContainerInitializer</h2>");
221              out.println("<pre>");
222              out.println("@HandlesTypes({javax.servlet.Servlet.class, Foo.class})");
223              out.println("</pre>");
224              out.print("<p><b>Result: ");
225              List<Class> classes = (List<Class>)config.getServletContext().getAttribute("com.acme.Foo");
226              List<String> classNames = new ArrayList<String>();
227              if (classes != null)
228              {
229                  for (Class c: classes)
230                  {
231                      classNames.add(c.getName());
232                      out.print(c.getName()+" ");
233                  }
234                 
235                  if (classNames.size() != __HandlesTypes.size())
236                      out.println("<br/><span class=\"fail\">FAIL</span>");
237                  else if (!classNames.containsAll(__HandlesTypes))
238                      out.println("<br/><span class=\"fail\">FAIL</span>");
239                  else
240                      out.println("<br/><span class=\"pass\">PASS</span>");
241              }
242              else
243                  out.print("<br/><span class=\"fail\">FAIL</span> (No such attribute com.acme.Foo)");
244              out.println("</b></p>");
245 
246             out.println("<h2>Complete Servlet Registration</h2>");
247             Boolean complete = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.complete");
248             out.println("<p><b>Result: "+(complete.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>");
249             
250             out.println("<h2>ServletContextListener Programmatic Registration from ServletContainerInitializer</h2>");
251             Boolean programmaticListener = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.listenerTest");
252             out.println("<p><b>Result: "+(programmaticListener.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>");
253             
254             out.println("<h2>ServletContextListener Programmatic Registration Prevented from ServletContextListener</h2>");
255             Boolean programmaticListenerPrevention = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.listenerRegoTest");
256             out.println("<p><b>Result: "+(programmaticListenerPrevention.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>");
257             
258             out.println("<h2>ServletContextListener Registration Prevented from ServletContextListener</h2>");
259             Boolean webListenerPrevention = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.sclFromSclRegoTest");
260             out.println("<p><b>Result: "+(webListenerPrevention.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>");
261             
262             out.println("<h2>ServletContextListener In web.xml Injected</h2>");
263             Boolean listenerInject = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.sclInjectTest");
264             out.println("<p><b>Result: "+(listenerInject.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>");
265             
266             out.println("<h2>ServletContextListener as @WebListener Injected</h2>");
267             Boolean annotatedListenerInject = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.sclInjectWebListenerTest");
268             out.println("<p><b>Result: "+(annotatedListenerInject.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>");
269             
270             out.println("<h2>Programmatic Listener Injected</h2>");
271             Boolean programListenerInject = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.programListenerInjectTest");
272             out.println("<p><b>Result: "+(programListenerInject.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>");
273             
274             out.println("<h2>Invalid Type for Listener Detection</h2>");         
275             Boolean badListener = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.invalidListenerRegoTest");
276             out.println("<p><b>Result: "+(badListener.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>");
277             
278             
279             out.println("<h2>@PostConstruct Callback</h2>");
280             out.println("<pre>");
281             out.println("@PostConstruct");
282             out.println("private void myPostConstructMethod ()");
283             out.println("{}"); 
284             out.println("</pre>");
285             out.println("<p><b>Result: "+postConstructResult+"</b></p>");
286            
287             
288             out.println("<h2>@Resource Injection for DataSource</h2>");    
289             out.println("<pre>");         
290             out.println("@Resource(mappedName=\"jdbc/mydatasource\");");
291             out.println("public void setMyDatasource(DataSource ds)");
292             out.println("{");
293             out.println("myDS=ds;");
294             out.println("}");
295             out.println("</pre>");
296             out.println("<p><b>Result: "+dsResult+"</b>");
297             out.println("<br/><b>JNDI Lookup Result: "+dsLookupResult+"</b></p>");
298 
299             
300             out.println("<h2>@Resource Injection for env-entry </h2>");
301             out.println("<pre>");
302             out.println("@Resource(mappedName=\"maxAmount\")");
303             out.println("private Double maxAmount;");
304             out.println("@Resource(name=\"minAmount\")");
305             out.println("private Double minAmount;");
306             out.println("</pre>");
307             if (maxAmount==null)
308                 out.println("<p><b>Result: "+envResult+":  <span class=\"fail\">FAIL");
309             else
310                 out.println("<p><b>Result: "+envResult+": "+(maxAmount.compareTo(new Double(55))==0?" <span class=\"pass\">PASS":" <span class=\"fail\">FAIL")+"</span></b>");     
311             out.println("<br/><b>JNDI Lookup Result: "+envLookupResult+"</b>");
312 
313             if (minAmount==null)
314                 out.println("<p><b>Result: "+envResult2+":  <span class=\"fail\">FAIL");
315             else
316                 out.println("<br/><b>Result: "+envResult2+": "+(minAmount.compareTo(new Double("0.99"))==0?" <span class=\"pass\">PASS":" <span class=\"fail\">FAIL")+"</span></b>");     
317             out.println("<br/><b>JNDI Lookup Result: "+envLookupResult2+"</b>");
318 
319             if (avgAmount==null)
320                 out.println("<p><b>Result: "+envResult3+":  <span class=\"fail\">FAIL");
321             else
322                 out.println("<br/><b>Result: "+envResult3+": "+(avgAmount.compareTo(new Double("1.25"))==0?" <span class=\"pass\">PASS":" <span class=\"fail\">FAIL")+"</span></b>");     
323             out.println("<br/><b>JNDI Lookup Result: "+envLookupResult3+"</b></p>");     
324             
325             out.println("<h2>@Resource Injection for UserTransaction </h2>");
326             out.println("<pre>");
327             out.println("@Resource(mappedName=\"UserTransaction\")");
328             out.println("private UserTransaction myUserTransaction;");
329             out.println("</pre>");
330             out.println("<p><b>Result: "+txResult+"</b>");
331             out.println("<br/><b>JNDI Lookup Result: "+txLookupResult+"</b></p>");
332 
333             out.println("</body>");            
334             out.println("</html>");
335             out.flush();
336         }
337         catch (Exception e)
338         {
339             throw new ServletException(e);
340         }
341     }
342     
343 
344   
345    
346 }