001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    package org.apache.geronimo.webservices;
018    
019    import java.io.IOException;
020    import javax.servlet.Servlet;
021    import javax.servlet.ServletConfig;
022    import javax.servlet.ServletContext;
023    import javax.servlet.ServletException;
024    import javax.servlet.ServletRequest;
025    import javax.servlet.ServletResponse;
026    import javax.xml.rpc.server.ServiceLifecycle;
027    
028    /**
029     * Delegates requests to a WebServiceContainer which is presumably for a POJO WebService
030     * Nothing stopping us from using this for EJBs or other types of webservices other than
031     * it is more than we need.  EJB webservices use the JettyEJBWebServiceContext.
032     * <p/>
033     * From a 10,000 foot view the Jetty architecture has:
034     * Container -> Context -> Holder -> Servlet
035     * <p/>
036     * A Container has multiple Contexts, typically webapps
037     * A Context provides the JNDI, TX, and Security for the webapp and has many Holders
038     * A Holder simply wraps each Servlet
039     * <p/>
040     * The POJO Web Service architecture on Jetty looks like this:
041     * Container -> WebApp Context -> JettyPOJOWebServiceHolder -> POJOWebServiceServlet
042     * <p/>
043     * The EJB Web Service architecure, on the other hand, creates one Context for each EJB:
044     * Container -> JettyEJBWebServiceContext
045     *
046     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
047     */
048    public class POJOWebServiceServlet implements Servlet {
049        public static final String POJO_CLASS = POJOWebServiceServlet.class.getName()+"@pojoClassName";
050        private Servlet stack;
051    
052        public void init(ServletConfig config) throws ServletException {
053            ServletContext context = config.getServletContext();
054    
055            String pojoClassID = config.getInitParameter(POJO_CLASS);
056            Class pojoClass = (Class) context.getAttribute(pojoClassID);
057    
058            Object pojo;
059            try {
060                pojo = pojoClass.newInstance();
061            } catch (Exception e) {
062                throw new ServletException("Unable to instantiate POJO WebService class: " + pojoClass.getName(), e);
063            }
064    
065            stack = new WebServiceContainerInvoker(pojo);
066            if (pojo instanceof ServiceLifecycle) {
067                stack = new ServiceLifecycleManager(stack,(ServiceLifecycle)pojo);
068            }
069    
070    
071            stack.init(config);
072        }
073    
074        public ServletConfig getServletConfig() {
075            return stack.getServletConfig();
076        }
077    
078        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
079            stack.service(servletRequest, servletResponse);
080        }
081    
082        public String getServletInfo() {
083            return stack.getServletInfo();
084        }
085    
086        public void destroy() {
087            stack.destroy();
088        }
089    }