1   /**
2    *
3    *  Licensed to the Apache Software Foundation (ASF) under one or more
4    *  contributor license agreements.  See the NOTICE file distributed with
5    *  this work for additional information regarding copyright ownership.
6    *  The ASF licenses this file to You under the Apache License, Version 2.0
7    *  (the "License"); you may not use this file except in compliance with
8    *  the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   *  Unless required by applicable law or agreed to in writing, software
13   *  distributed under the License is distributed on an "AS IS" BASIS,
14   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   *  See the License for the specific language governing permissions and
16   *  limitations under the License.
17   */
18  package org.apache.geronimo.jetty;
19  
20  import java.io.IOException;
21  import java.util.Map;
22  import java.util.Set;
23  
24  import javax.security.jacc.PolicyContext;
25  import javax.servlet.ServletContext;
26  import javax.servlet.ServletException;
27  import javax.servlet.ServletRequest;
28  import javax.servlet.ServletResponse;
29  import javax.servlet.UnavailableException;
30  
31  import org.apache.geronimo.gbean.GBeanInfo;
32  import org.apache.geronimo.gbean.GBeanInfoBuilder;
33  import org.apache.geronimo.gbean.GBeanLifecycle;
34  import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
35  import org.apache.geronimo.webservices.POJOWebServiceServlet;
36  import org.apache.geronimo.webservices.WebServiceContainer;
37  import org.apache.geronimo.webservices.WebServiceContainerInvoker;
38  import org.apache.geronimo.webservices.WebServiceContainerFactory;
39  import org.mortbay.jetty.servlet.ServletHolder;
40  import org.mortbay.jetty.servlet.ServletHttpRequest;
41  
42  
43  /**
44   * This is intended to hold the web service stack for an axis POJO web service.
45   * It is starting life as a copy of JettyServletHolder.
46   *
47   * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
48   */
49  public class JettyPOJOWebServiceHolder extends ServletHolder implements GBeanLifecycle {
50      private WebServiceContainer webServiceContainer;
51      private Set servletMappings;
52      private JettyServletRegistration context;
53      private String pojoClassName;
54  
55      
56      public JettyPOJOWebServiceHolder() {
57  
58      }
59  
60      public JettyPOJOWebServiceHolder(String pojoClassName,
61                                       String servletName,
62                                       Map initParams,
63                                       Integer loadOnStartup,
64                                       Set servletMappings,
65                                       WebServiceContainerFactory webServiceContainerFactory,
66                                       ServletHolder previous,    
67                                       JettyServletRegistration context) throws Exception {
68          super(context == null ? null : context.getServletHandler(), servletName, POJOWebServiceServlet.class.getName(), null);
69          
70  
71          this.pojoClassName = pojoClassName;
72          this.context = context;
73          this.webServiceContainer = webServiceContainerFactory == null? null: webServiceContainerFactory.getWebServiceContainer();
74          if (context != null) {
75              putAll(initParams);
76              if (loadOnStartup != null) {
77                  setInitOrder(loadOnStartup.intValue());
78              }
79              this.servletMappings = servletMappings;
80          }
81      }
82  
83      
84      
85  
86      public String getServletName() {
87          return getName();
88      }
89  
90      /**
91       * Service a request with this servlet.  Set the ThreadLocal to hold the
92       * current JettyServletHolder.
93       */
94      public void handle(ServletRequest request, ServletResponse response)
95              throws ServletException, UnavailableException, IOException {
96  
97          
98  
99  
100         JettyServletHolder.setCurrentServletName(getServletName());
101         PolicyContext.setHandlerData(ServletHttpRequest.unwrap(request));
102 
103         super.handle(request, response);
104     }
105 
106     public void doStart() throws Exception {
107         if (context != null) {
108             Class pojoClass = context.getWebClassLoader().loadClass(pojoClassName);
109 
110             
111 
112 
113             ServletContext servletContext = this.context.getServletHandler().getServletContext();
114 
115             
116             
117             
118             String webServicecontainerID = getServletName() + WebServiceContainerInvoker.WEBSERVICE_CONTAINER + webServiceContainer.hashCode();
119             put(WebServiceContainerInvoker.WEBSERVICE_CONTAINER, webServicecontainerID);
120             servletContext.setAttribute(webServicecontainerID, webServiceContainer);
121 
122             
123             String pojoClassID = getServletName() + POJOWebServiceServlet.POJO_CLASS + pojoClass.hashCode();
124             put(POJOWebServiceServlet.POJO_CLASS, pojoClassID);
125             servletContext.setAttribute(pojoClassID, pojoClass);
126 
127             
128             
129             context.registerServletHolder(this, getServletName(), this.servletMappings, null);
130 
131         }
132     }
133 
134     public void doStop() throws Exception {
135     }
136 
137     public void doFail() {
138     }
139 
140     public static final GBeanInfo GBEAN_INFO;
141 
142     static {
143         GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(JettyPOJOWebServiceHolder.class, NameFactory.SERVLET_WEB_SERVICE_TEMPLATE);
144         
145         infoBuilder.addInterface(ServletHolder.class);
146 
147         infoBuilder.addAttribute("pojoClassName", String.class, true);
148         infoBuilder.addAttribute("servletName", String.class, true);
149         infoBuilder.addAttribute("initParams", Map.class, true);
150         infoBuilder.addAttribute("loadOnStartup", Integer.class, true);
151         infoBuilder.addAttribute("servletMappings", Set.class, true);
152         infoBuilder.addReference("WebServiceContainerFactory", WebServiceContainerFactory.class);
153         infoBuilder.addReference("Previous", ServletHolder.class, NameFactory.SERVLET);
154         infoBuilder.addReference("JettyServletRegistration", JettyServletRegistration.class);
155 
156         infoBuilder.setConstructor(new String[]{"pojoClassName",
157                                                 "servletName",
158                                                 "initParams",
159                                                 "loadOnStartup",
160                                                 "servletMappings",
161                                                 "WebServiceContainerFactory",
162                                                 "Previous",
163                                                 "JettyServletRegistration"});
164 
165         GBEAN_INFO = infoBuilder.getBeanInfo();
166     }
167 
168     public static GBeanInfo getGBeanInfo() {
169         return GBEAN_INFO;
170     }
171 
172 
173 }