| // |
| // ======================================================================== |
| // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| // |
| |
| package com.acme.test; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| import javax.annotation.PostConstruct; |
| import javax.annotation.PreDestroy; |
| import javax.annotation.Resource; |
| import javax.annotation.security.DeclareRoles; |
| import javax.annotation.security.RunAs; |
| import javax.naming.InitialContext; |
| import javax.servlet.ServletConfig; |
| import javax.servlet.ServletException; |
| import javax.servlet.ServletOutputStream; |
| import javax.servlet.annotation.WebInitParam; |
| import javax.servlet.annotation.WebServlet; |
| import javax.servlet.http.HttpServlet; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| import javax.sql.DataSource; |
| import javax.transaction.UserTransaction; |
| |
| /** |
| * AnnotationTest |
| * |
| * Use Annotations from within Jetty. |
| * |
| * Also, use servlet spec 2.5 resource injection and lifecycle callbacks from within the web.xml |
| * to set up some of the JNDI resources. |
| * |
| */ |
| |
| @RunAs("special") |
| @WebServlet(urlPatterns = {"/","/test/*"}, name="AnnotationTest", initParams={@WebInitParam(name="fromAnnotation", value="xyz")}) |
| @DeclareRoles({"user","client"}) |
| public class AnnotationTest extends HttpServlet |
| { |
| static List<String> __HandlesTypes; |
| private String postConstructResult = ""; |
| private String dsResult = ""; |
| private String envResult = ""; |
| private String envLookupResult = ""; |
| private String envResult2 =""; |
| private String envLookupResult2 = ""; |
| private String envResult3 = ""; |
| private String envLookupResult3 = ""; |
| private String dsLookupResult = ""; |
| private String txResult = ""; |
| private String txLookupResult = ""; |
| private DataSource myDS; |
| private ServletConfig config; |
| |
| @Resource(mappedName="UserTransaction") |
| private UserTransaction myUserTransaction; |
| |
| |
| @Resource(mappedName="maxAmount") |
| private Double maxAmount; |
| |
| @Resource(name="someAmount") |
| private Double minAmount; |
| |
| @Resource |
| private Double avgAmount; |
| |
| |
| @Resource(mappedName="jdbc/mydatasource") |
| public void setMyDatasource(DataSource ds) |
| { |
| myDS=ds; |
| } |
| |
| |
| @PostConstruct |
| private void myPostConstructMethod () |
| { |
| postConstructResult = "<span class=\"pass\">PASS</span>"; |
| try |
| { |
| dsResult = (myDS==null?"<span class=\"fail\">FAIL</span>":"<span class=\"pass\">myDS="+myDS.toString()+"</span>"); |
| } |
| catch (Exception e) |
| { |
| dsResult = "<span class=\"fail\">FAIL:</span> "+e; |
| } |
| |
| |
| envResult = (maxAmount==null?"FAIL</span>":"<span class=\"pass\">maxAmount="+maxAmount.toString()+"</span>"); |
| |
| try |
| { |
| InitialContext ic = new InitialContext(); |
| envLookupResult = "java:comp/env/com.acme.test.AnnotationTest/maxAmount="+ic.lookup("java:comp/env/com.acme.test.AnnotationTest/maxAmount"); |
| } |
| catch (Exception e) |
| { |
| envLookupResult = "<span class=\"fail\">FAIL:</span> "+e; |
| } |
| |
| envResult2 = (minAmount==null?"<span class=\"fail\">FAIL</span>":"<span class=\"pass\">minAmount="+minAmount.toString()+"</span>"); |
| try |
| { |
| InitialContext ic = new InitialContext(); |
| envLookupResult2 = "java:comp/env/someAmount="+ic.lookup("java:comp/env/someAmount"); |
| } |
| catch (Exception e) |
| { |
| envLookupResult2 = "<span class=\"fail\">FAIL:</span> "+e; |
| } |
| envResult3 = (minAmount==null?"<span class=\"fail\">FAIL</span>":"<span class=\"pass\">avgAmount="+avgAmount.toString()+"</span>"); |
| try |
| { |
| InitialContext ic = new InitialContext(); |
| envLookupResult3 = "java:comp/env/com.acme.test.AnnotationTest/avgAmount="+ic.lookup("java:comp/env/com.acme.test.AnnotationTest/avgAmount"); |
| } |
| catch (Exception e) |
| { |
| envLookupResult3 = "<span class=\"fail\">FAIL:</span> "+e; |
| } |
| |
| |
| |
| try |
| { |
| InitialContext ic = new InitialContext(); |
| dsLookupResult = "java:comp/env/com.acme.test.AnnotationTest/myDatasource="+ic.lookup("java:comp/env/com.acme.test.AnnotationTest/myDatasource"); |
| } |
| catch (Exception e) |
| { |
| dsLookupResult = "<span class=\"fail\">FAIL:</span> "+e; |
| } |
| |
| txResult = (myUserTransaction==null?"<span class=\"fail\">FAIL</span>":"<span class=\"pass\">myUserTransaction="+myUserTransaction+"</span>"); |
| try |
| { |
| InitialContext ic = new InitialContext(); |
| txLookupResult = "java:comp/env/com.acme.test.AnnotationTest/myUserTransaction="+ic.lookup("java:comp/env/com.acme.test.AnnotationTest/myUserTransaction"); |
| } |
| catch (Exception e) |
| { |
| txLookupResult = "<span class=\"fail\">FAIL:</span> "+e; |
| } |
| } |
| |
| @PreDestroy |
| private void myPreDestroyMethod() |
| { |
| } |
| |
| public void init(ServletConfig config) throws ServletException |
| { |
| super.init(config); |
| this.config = config; |
| } |
| |
| |
| |
| /* ------------------------------------------------------------ */ |
| public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException |
| { |
| doGet(request, response); |
| } |
| |
| /* ------------------------------------------------------------ */ |
| public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException |
| { |
| try |
| { |
| response.setContentType("text/html"); |
| ServletOutputStream out = response.getOutputStream(); |
| out.println("<html>"); |
| out.println("<HEAD><link rel=\"stylesheet\" type=\"text/css\" href=\"stylesheet.css\"/></HEAD>"); |
| out.println("<body>"); |
| out.println("<h1>Results</h1>"); |
| |
| out.println("<h2>Init Params from Annotation</h2>"); |
| out.println("<pre>"); |
| out.println("initParams={@WebInitParam(name=\"fromAnnotation\", value=\"xyz\")}"); |
| out.println("</pre>"); |
| out.println("<p><b>Result: "+("xyz".equals(config.getInitParameter("fromAnnotation"))? "<span class=\"pass\">PASS": "<span class=\"fail\">FAIL")+"</span></p>"); |
| |
| out.println("<h2>Init Params from web-fragment</h2>"); |
| out.println("<pre>"); |
| out.println("extra1=123, extra2=345"); |
| out.println("</pre>"); |
| boolean fragInitParamResult = "123".equals(config.getInitParameter("extra1")) && "345".equals(config.getInitParameter("extra2")); |
| out.println("<p><b>Result: "+(fragInitParamResult? "<span class=\"pass\">PASS": "<span class=\"fail\">FAIL")+"</span></p>"); |
| |
| |
| __HandlesTypes = Arrays.asList( "javax.servlet.GenericServlet", |
| "javax.servlet.http.HttpServlet", |
| "com.acme.test.AsyncListenerServlet", |
| "com.acme.test.AnnotationTest", |
| "com.acme.test.RoleAnnotationTest", |
| "com.acme.test.MultiPartTest", |
| "com.acme.fragment.FragmentServlet", |
| "com.acme.test.TestListener", |
| "com.acme.test.SecuredServlet", |
| "com.acme.test.Bar"); |
| out.println("<h2>@ContainerInitializer</h2>"); |
| out.println("<pre>"); |
| out.println("@HandlesTypes({javax.servlet.Servlet.class, Foo.class})"); |
| out.println("</pre>"); |
| out.print("<p><b>Result: "); |
| List<Class> classes = (List<Class>)config.getServletContext().getAttribute("com.acme.Foo"); |
| List<String> classNames = new ArrayList<String>(); |
| if (classes != null) |
| { |
| for (Class c: classes) |
| { |
| classNames.add(c.getName()); |
| out.print(c.getName()+" "); |
| } |
| |
| if (classNames.size() != __HandlesTypes.size()) |
| out.println("<br/><span class=\"fail\">FAIL</span>"); |
| else if (!classNames.containsAll(__HandlesTypes)) |
| out.println("<br/><span class=\"fail\">FAIL</span>"); |
| else |
| out.println("<br/><span class=\"pass\">PASS</span>"); |
| } |
| else |
| out.print("<br/><span class=\"fail\">FAIL</span> (No such attribute com.acme.Foo)"); |
| out.println("</b></p>"); |
| |
| out.println("<h2>Complete Servlet Registration</h2>"); |
| Boolean complete = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.complete"); |
| out.println("<p><b>Result: "+(complete.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>"); |
| |
| out.println("<h2>ServletContextListener Programmatic Registration from ServletContainerInitializer</h2>"); |
| Boolean programmaticListener = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.listenerTest"); |
| out.println("<p><b>Result: "+(programmaticListener.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>"); |
| |
| out.println("<h2>ServletContextListener Programmatic Registration Prevented from ServletContextListener</h2>"); |
| Boolean programmaticListenerPrevention = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.listenerRegoTest"); |
| out.println("<p><b>Result: "+(programmaticListenerPrevention.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>"); |
| |
| out.println("<h2>ServletContextListener Registration Prevented from ServletContextListener</h2>"); |
| Boolean webListenerPrevention = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.sclFromSclRegoTest"); |
| out.println("<p><b>Result: "+(webListenerPrevention.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>"); |
| |
| out.println("<h2>ServletContextListener In web.xml Injected</h2>"); |
| Boolean listenerInject = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.sclInjectTest"); |
| out.println("<p><b>Result: "+(listenerInject.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>"); |
| |
| out.println("<h2>ServletContextListener as @WebListener Injected</h2>"); |
| Boolean annotatedListenerInject = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.sclInjectWebListenerTest"); |
| out.println("<p><b>Result: "+(annotatedListenerInject.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>"); |
| |
| out.println("<h2>Programmatic Listener Injected</h2>"); |
| Boolean programListenerInject = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.programListenerInjectTest"); |
| out.println("<p><b>Result: "+(programListenerInject.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>"); |
| |
| out.println("<h2>Invalid Type for Listener Detection</h2>"); |
| Boolean badListener = (Boolean)config.getServletContext().getAttribute("com.acme.AnnotationTest.invalidListenerRegoTest"); |
| out.println("<p><b>Result: "+(badListener.booleanValue()?"<span class=\"pass\">PASS":"<span class=\"fail\">FAIL")+"</span></b></p>"); |
| |
| |
| out.println("<h2>@PostConstruct Callback</h2>"); |
| out.println("<pre>"); |
| out.println("@PostConstruct"); |
| out.println("private void myPostConstructMethod ()"); |
| out.println("{}"); |
| out.println("</pre>"); |
| out.println("<p><b>Result: "+postConstructResult+"</b></p>"); |
| |
| |
| out.println("<h2>@Resource Injection for DataSource</h2>"); |
| out.println("<pre>"); |
| out.println("@Resource(mappedName=\"jdbc/mydatasource\");"); |
| out.println("public void setMyDatasource(DataSource ds)"); |
| out.println("{"); |
| out.println("myDS=ds;"); |
| out.println("}"); |
| out.println("</pre>"); |
| out.println("<p><b>Result: "+dsResult+"</b>"); |
| out.println("<br/><b>JNDI Lookup Result: "+dsLookupResult+"</b></p>"); |
| |
| |
| out.println("<h2>@Resource Injection for env-entry </h2>"); |
| out.println("<pre>"); |
| out.println("@Resource(mappedName=\"maxAmount\")"); |
| out.println("private Double maxAmount;"); |
| out.println("@Resource(name=\"minAmount\")"); |
| out.println("private Double minAmount;"); |
| out.println("</pre>"); |
| if (maxAmount==null) |
| out.println("<p><b>Result: "+envResult+": <span class=\"fail\">FAIL"); |
| else |
| out.println("<p><b>Result: "+envResult+": "+(maxAmount.compareTo(new Double(55))==0?" <span class=\"pass\">PASS":" <span class=\"fail\">FAIL")+"</span></b>"); |
| out.println("<br/><b>JNDI Lookup Result: "+envLookupResult+"</b>"); |
| |
| if (minAmount==null) |
| out.println("<p><b>Result: "+envResult2+": <span class=\"fail\">FAIL"); |
| else |
| out.println("<br/><b>Result: "+envResult2+": "+(minAmount.compareTo(new Double("0.99"))==0?" <span class=\"pass\">PASS":" <span class=\"fail\">FAIL")+"</span></b>"); |
| out.println("<br/><b>JNDI Lookup Result: "+envLookupResult2+"</b>"); |
| |
| if (avgAmount==null) |
| out.println("<p><b>Result: "+envResult3+": <span class=\"fail\">FAIL"); |
| else |
| out.println("<br/><b>Result: "+envResult3+": "+(avgAmount.compareTo(new Double("1.25"))==0?" <span class=\"pass\">PASS":" <span class=\"fail\">FAIL")+"</span></b>"); |
| out.println("<br/><b>JNDI Lookup Result: "+envLookupResult3+"</b></p>"); |
| |
| out.println("<h2>@Resource Injection for UserTransaction </h2>"); |
| out.println("<pre>"); |
| out.println("@Resource(mappedName=\"UserTransaction\")"); |
| out.println("private UserTransaction myUserTransaction;"); |
| out.println("</pre>"); |
| out.println("<p><b>Result: "+txResult+"</b>"); |
| out.println("<br/><b>JNDI Lookup Result: "+txLookupResult+"</b></p>"); |
| |
| out.println("</body>"); |
| out.println("</html>"); |
| out.flush(); |
| } |
| catch (Exception e) |
| { |
| throw new ServletException(e); |
| } |
| } |
| |
| |
| |
| |
| } |