View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 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;
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.AnnotationTest/maxAmount="+ic.lookup("java:comp/env/com.acme.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.AnnotationTest/avgAmount="+ic.lookup("java:comp/env/com.acme.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.AnnotationTest/myDatasource="+ic.lookup("java:comp/env/com.acme.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.AnnotationTest/myUserTransaction="+ic.lookup("java:comp/env/com.acme.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("<br/><b>Result: "+("xyz".equals(config.getInitParameter("fromAnnotation"))? "<span class=\"pass\">PASS": "<span class=\"fail\">FAIL")+"</span>");
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("<br/><b>Result: "+(fragInitParamResult? "<span class=\"pass\">PASS": "<span class=\"fail\">FAIL")+"</span>");
208 
209 
210              __HandlesTypes = Arrays.asList( "javax.servlet.GenericServlet", 
211                                              "javax.servlet.http.HttpServlet", 
212                                              "com.acme.AnnotationTest", 
213                                              "com.acme.RoleAnnotationTest", 
214                                              "com.acme.MultiPartTest", 
215                                              "com.acme.FragmentServlet", 
216                                              "com.acme.TestListener",
217                                              "com.acme.SecuredServlet",
218                                              "com.acme.Bar");
219              out.println("<h2>@ContainerInitializer</h2>");
220              out.println("<pre>");
221              out.println("@HandlesTypes({javax.servlet.Servlet.class, Foo.class})");
222              out.println("</pre>");
223              out.print("<br/><b>Result: ");
224              List<Class> classes = (List<Class>)config.getServletContext().getAttribute("com.acme.Foo");
225              List<String> classNames = new ArrayList<String>();
226              if (classes != null)
227              {
228                  for (Class c: classes)
229                  {
230                      classNames.add(c.getName());
231                      out.print(c.getName()+" ");
232                  }
233                 
234                  if (classNames.size() != __HandlesTypes.size())
235                      out.println("<br/><span class=\"fail\">FAIL</span>");
236                  else if (!classNames.containsAll(__HandlesTypes))
237                      out.println("<br/><span class=\"fail\">FAIL</span>");
238                  else
239                      out.println("<br/><span class=\"pass\">PASS</span>");
240              }
241              else
242                  out.print("<br/><span class=\"fail\">FAIL</span> (No such attribute com.acme.Foo)");
243              out.println("</b>");
244 
245             out.println("<h2>Complete Servlet Registration</h2>");
246             Boolean complete = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.complete");
247             out.println("<br/><b>Result: "+(complete.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b>");
248             
249             out.println("<h2>ServletContextListener Programmatic Registration from ServletContainerInitializer</h2>");
250             Boolean programmaticListener = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.listenerTest");
251             out.println("<br/><b>Result: "+(programmaticListener.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b>");
252             
253             out.println("<h2>ServletContextListener Programmatic Registration Prevented from ServletContextListener</h2>");
254             Boolean programmaticListenerPrevention = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.listenerRegoTest");
255             out.println("<br/><b>Result: "+(programmaticListenerPrevention.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b>");
256             
257             out.println("<h2>@PostConstruct Callback</h2>");
258             out.println("<pre>");
259             out.println("@PostConstruct");
260             out.println("private void myPostConstructMethod ()");
261             out.println("{}"); 
262             out.println("</pre>");
263             out.println("<br/><b>Result: "+postConstructResult+"</b>");
264            
265             
266             out.println("<h2>@Resource Injection for DataSource</h2>");    
267             out.println("<pre>");         
268             out.println("@Resource(mappedName=\"jdbc/mydatasource\");");
269             out.println("public void setMyDatasource(DataSource ds)");
270             out.println("{");
271             out.println("myDS=ds;");
272             out.println("}");
273             out.println("</pre>");
274             out.println("<br/><b>Result: "+dsResult+"</b>");
275             out.println("<br/><b>JNDI Lookup Result: "+dsLookupResult+"</b>");
276 
277             
278             out.println("<h2>@Resource Injection for env-entry </h2>");
279             out.println("<pre>");
280             out.println("@Resource(mappedName=\"maxAmount\")");
281             out.println("private Double maxAmount;");
282             out.println("@Resource(name=\"minAmount\")");
283             out.println("private Double minAmount;");
284             out.println("</pre>");
285             out.println("<br/><b>Result: "+envResult+": "+(maxAmount.compareTo(new Double(55))==0?" <span class=\"pass\">PASS":" <span class=\"fail\">FAIL")+"</span></b>");     
286             out.println("<br/><b>JNDI Lookup Result: "+envLookupResult+"</b>");
287             out.println("<br/><b>Result: "+envResult2+": "+(minAmount.compareTo(new Double("0.99"))==0?" <span class=\"pass\">PASS":" <span class=\"fail\">FAIL")+"</span></b>");     
288             out.println("<br/><b>JNDI Lookup Result: "+envLookupResult2+"</b>");
289             out.println("<br/><b>Result: "+envResult3+": "+(avgAmount.compareTo(new Double("1.25"))==0?" <span class=\"pass\">PASS":" <span class=\"fail\">FAIL")+"</span></b>");     
290             out.println("<br/><b>JNDI Lookup Result: "+envLookupResult3+"</b>");          
291             out.println("<h2>@Resource Injection for UserTransaction </h2>");
292             out.println("<pre>");
293             out.println("@Resource(mappedName=\"UserTransaction\")");
294             out.println("private UserTransaction myUserTransaction;");
295             out.println("</pre>");
296             out.println("<br/><b>Result: "+txResult+"</b>");
297             out.println("<br/><b>JNDI Lookup Result: "+txLookupResult+"</b>");
298 
299             out.println("</body>");            
300             out.println("</html>");
301             out.flush();
302         }
303         catch (Exception e)
304         {
305             throw new ServletException(e);
306         }
307     }
308     
309 
310   
311    
312 }