View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2012 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.lang.reflect.Method;
23  import java.util.List;
24  import java.util.ArrayList;
25  import java.util.Arrays;
26  
27  import javax.naming.InitialContext;
28  import javax.servlet.ServletConfig;
29  import javax.servlet.ServletException;
30  import javax.servlet.ServletOutputStream;
31  import javax.servlet.http.HttpServlet;
32  import javax.servlet.http.HttpServletRequest;
33  import javax.servlet.http.HttpServletResponse;
34  import javax.sql.DataSource;
35  import javax.transaction.UserTransaction;
36  import javax.annotation.Resource;
37  import javax.annotation.PostConstruct;
38  import javax.annotation.PreDestroy;
39  import javax.annotation.security.RunAs;
40  import javax.servlet.annotation.WebServlet;
41  import javax.servlet.annotation.WebInitParam;
42  import javax.annotation.security.DeclareRoles;
43  
44  /**
45   * AnnotationTest
46   * 
47   * Use Annotations from within Jetty.
48   * 
49   * Also, use servlet spec 2.5 resource injection and lifecycle callbacks from within the web.xml
50   * to set up some of the JNDI resources.
51   *
52   */
53  
54  @RunAs("special")
55  @WebServlet(urlPatterns = {"/","/test/*"}, name="AnnotationTest", initParams={@WebInitParam(name="fromAnnotation", value="xyz")})
56  @DeclareRoles({"user","client"})
57  public class AnnotationTest extends HttpServlet 
58  {
59      static List<String> __HandlesTypes; 
60      private String postConstructResult = "";
61      private String dsResult = "";
62      private String envResult = "";
63      private String envLookupResult = "";
64      private String envResult2 ="";
65      private String envLookupResult2 = "";
66      private String envResult3 = "";
67      private String envLookupResult3 = "";
68      private String dsLookupResult = "";
69      private String txResult = "";
70      private String txLookupResult = "";
71      private DataSource myDS;
72      private ServletConfig config;
73      
74      @Resource(mappedName="UserTransaction")
75      private UserTransaction myUserTransaction;
76  
77  
78      @Resource(mappedName="maxAmount")
79      private Double maxAmount;
80      
81      @Resource(name="someAmount")
82      private Double minAmount;
83  
84      @Resource
85      private Double avgAmount;
86  
87     
88      @Resource(mappedName="jdbc/mydatasource")
89      public void setMyDatasource(DataSource ds)
90      {
91          myDS=ds;
92      }
93    
94      
95      @PostConstruct
96      private void myPostConstructMethod ()
97      {       
98          postConstructResult = "Called";
99         try 
100        {
101            dsResult = (myDS==null?"FAIL":"myDS="+myDS.toString());
102        }
103        catch (Exception e)
104        {
105            dsResult = "FAIL: "+e;
106        }
107 
108 
109        envResult = (maxAmount==null?"FAIL":"maxAmount="+maxAmount.toString());
110        
111        try
112        {
113            InitialContext ic = new InitialContext();
114            envLookupResult = "java:comp/env/com.acme.AnnotationTest/maxAmount="+ic.lookup("java:comp/env/com.acme.AnnotationTest/maxAmount");
115        }
116        catch (Exception e)
117        {
118            envLookupResult = "FAIL: "+e;
119        }
120 
121       envResult2 = (minAmount==null?"FAIL":"minAmount="+minAmount.toString());
122       try
123       {
124           InitialContext ic = new InitialContext();
125           envLookupResult2 = "java:comp/env/someAmount="+ic.lookup("java:comp/env/someAmount");
126       }
127       catch (Exception e)
128       {
129           envLookupResult2 = "FAIL: "+e;
130       }
131       envResult3 = (minAmount==null?"FAIL":"avgAmount="+avgAmount.toString());
132       try
133       {
134           InitialContext ic = new InitialContext();
135           envLookupResult3 = "java:comp/env/com.acme.AnnotationTest/avgAmount="+ic.lookup("java:comp/env/com.acme.AnnotationTest/avgAmount");
136       }
137       catch (Exception e)
138       {
139           envLookupResult3 = "FAIL: "+e;
140       }
141       
142       
143       
144        try
145        {
146            InitialContext ic = new InitialContext();
147            dsLookupResult = "java:comp/env/com.acme.AnnotationTest/myDatasource="+ic.lookup("java:comp/env/com.acme.AnnotationTest/myDatasource");
148        }
149        catch (Exception e)
150        {
151            dsLookupResult = "FAIL: "+e;
152        }
153        
154        txResult = (myUserTransaction==null?"FAIL":"myUserTransaction="+myUserTransaction);
155        try
156        {
157            InitialContext ic = new InitialContext();
158            txLookupResult = "java:comp/env/com.acme.AnnotationTest/myUserTransaction="+ic.lookup("java:comp/env/com.acme.AnnotationTest/myUserTransaction");
159        }
160        catch (Exception e)
161        {
162            txLookupResult = "FAIL: "+e;
163        }
164     }
165     
166     @PreDestroy
167     private void myPreDestroyMethod()
168     {
169     }
170     
171     public void init(ServletConfig config) throws ServletException
172     {
173         super.init(config);
174         this.config = config;
175     }
176 
177     
178     
179     /* ------------------------------------------------------------ */
180     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
181     {
182         doGet(request, response);
183     }
184 
185     /* ------------------------------------------------------------ */
186     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
187     {      
188         try
189         {
190             response.setContentType("text/html");
191             ServletOutputStream out = response.getOutputStream();
192             out.println("<html>");
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"))? "PASS": "FAIL"));
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? "PASS": "FAIL"));
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/>FAIL");
236                  else if (!classNames.containsAll(__HandlesTypes))
237                      out.println("<br/>FAIL");
238                  else
239                      out.println("<br/>PASS");
240              }
241              else
242                  out.print("<br/>FAIL (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()?"PASS":"FAIL")+"</b>");
248             
249             out.println("<h2>@PostConstruct Callback</h2>");
250             out.println("<pre>");
251             out.println("@PostConstruct");
252             out.println("private void myPostConstructMethod ()");
253             out.println("{}"); 
254             out.println("</pre>");
255             out.println("<br/><b>Result: "+postConstructResult+"</b>");
256            
257             
258             out.println("<h2>@Resource Injection for DataSource</h2>");    
259             out.println("<pre>");         
260             out.println("@Resource(mappedName=\"jdbc/mydatasource\");");
261             out.println("public void setMyDatasource(DataSource ds)");
262             out.println("{");
263             out.println("myDS=ds;");
264             out.println("}");
265             out.println("</pre>");
266             out.println("<br/><b>Result: "+dsResult+"</b>");
267             out.println("<br/><b>JNDI Lookup Result: "+dsLookupResult+"</b>");
268 
269             
270             out.println("<h2>@Resource Injection for env-entry </h2>");
271             out.println("<pre>");
272             out.println("@Resource(mappedName=\"maxAmount\")");
273             out.println("private Double maxAmount;");
274             out.println("@Resource(name=\"minAmount\")");
275             out.println("private Double minAmount;");
276             out.println("</pre>");
277             out.println("<br/><b>Result: "+envResult+": "+(maxAmount.compareTo(new Double(55))==0?" PASS":" FAIL")+"</b>");     
278             out.println("<br/><b>JNDI Lookup Result: "+envLookupResult+"</b>");
279             out.println("<br/><b>Result: "+envResult2+": "+(minAmount.compareTo(new Double("0.99"))==0?" PASS":" FAIL")+"</b>");     
280             out.println("<br/><b>JNDI Lookup Result: "+envLookupResult2+"</b>");
281             out.println("<br/><b>Result: "+envResult3+": "+(avgAmount.compareTo(new Double("1.25"))==0?" PASS":" FAIL")+"</b>");     
282             out.println("<br/><b>JNDI Lookup Result: "+envLookupResult3+"</b>");          
283             out.println("<h2>@Resource Injection for UserTransaction </h2>");
284             out.println("<pre>");
285             out.println("@Resource(mappedName=\"UserTransaction\")");
286             out.println("private UserTransaction myUserTransaction;");
287             out.println("</pre>");
288             out.println("<br/><b>Result: "+txResult+"</b>");
289             out.println("<br/><b>JNDI Lookup Result: "+txLookupResult+"</b>");
290             out.println("<h2>DeclaresRoles</h2>");
291             out.println("<p>Login as user \"admin\" with password \"admin\" when prompted after clicking the button below to test @DeclareRoles annotation</p>");
292             String context = request.getContextPath();
293             if (!context.endsWith("/"))
294                 context += "/";
295             context += "role/";
296             out.println("<form action="+context+" method=\"post\"><button type=\"submit\">Test Role Annotations</button></form>");
297 
298             out.println("<h2>ServletSecurity</h2>");
299             out.println("<p>Login as user \"admin\" with password \"admin\" when prompted after clicking the button below to test @ServletSecurity annotation</p>");
300             context = request.getContextPath();
301             if (!context.endsWith("/"))
302                 context += "/";
303             context += "sec/foo";
304             out.println("<form action="+context+" method=\"post\"><button type=\"submit\">Test ServletSecurity Annotation</button></form>");
305 
306 
307             out.println("</body>");            
308             out.println("</html>");
309             out.flush();
310         }
311         catch (Exception e)
312         {
313             throw new ServletException(e);
314         }
315     }
316     
317 
318   
319    
320 }