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    
018    package org.apache.geronimo.axis2.ejb;
019    
020    import java.net.URL;
021    
022    import javax.naming.Context;
023    import javax.naming.InitialContext;
024    import javax.naming.NamingException;
025    import javax.xml.ws.WebServiceContext;
026    import javax.xml.ws.WebServiceException;
027    
028    import org.apache.axis2.util.JavaUtils;
029    import org.apache.geronimo.axis2.Axis2WebServiceContainer;
030    import org.apache.geronimo.axis2.AxisServiceGenerator;
031    import org.apache.geronimo.jaxws.JAXWSAnnotationProcessor;
032    import org.apache.geronimo.jaxws.JNDIResolver;
033    import org.apache.geronimo.jaxws.PortInfo;
034    import org.apache.openejb.DeploymentInfo;
035    
036    /**
037     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
038     */
039    public class EJBWebServiceContainer extends Axis2WebServiceContainer {
040    
041        private DeploymentInfo deploymnetInfo;
042        
043        public EJBWebServiceContainer(PortInfo portInfo,
044                                      String endpointClassName,
045                                      ClassLoader classLoader,
046                                      Context context,
047                                      URL configurationBaseUrl,
048                                      DeploymentInfo deploymnetInfo) {
049            super(portInfo, endpointClassName, classLoader, context, configurationBaseUrl);
050            this.deploymnetInfo = deploymnetInfo;
051        }
052        
053        @Override
054        public void init() throws Exception { 
055            super.init();
056            
057            String rootContext = null;
058            String servicePath = null;
059            String location = trimContext(this.portInfo.getLocation());
060            int pos = location.indexOf('/');     
061            if (pos > 0) {
062                rootContext = location.substring(0, pos);
063                servicePath = location.substring(pos + 1);
064            } else {
065                rootContext = "/";
066                servicePath = location;
067            }
068                  
069            this.configurationContext.setServicePath(servicePath);
070            //need to setContextRoot after servicePath as cachedServicePath is only built 
071            //when setContextRoot is called.
072            this.configurationContext.setContextRoot(rootContext); 
073            
074            // configure handlers
075            try {
076                configureHandlers();
077            } catch (Exception e) {
078                throw new WebServiceException("Error configuring handlers", e);
079            }
080        }
081        
082        @Override
083        protected AxisServiceGenerator createServiceGenerator() {
084            AxisServiceGenerator serviceGenerator = super.createServiceGenerator();
085            EJBMessageReceiver messageReceiver = 
086                new EJBMessageReceiver(this, this.endpointClass, this.deploymnetInfo);
087            serviceGenerator.setMessageReceiver(messageReceiver);
088            return serviceGenerator;
089        }
090            
091        public synchronized void injectHandlers() {
092            if (this.annotationProcessor != null) {
093                // assume injection was already done
094                return;
095            }
096            
097            WebServiceContext wsContext = null;
098            try {
099                InitialContext ctx = new InitialContext();
100                wsContext = (WebServiceContext) ctx.lookup("java:comp/WebServiceContext");
101            } catch (NamingException e) {
102                throw new WebServiceException("Failed to lookup WebServiceContext", e);
103            }
104            
105            this.annotationProcessor = new JAXWSAnnotationProcessor(new JNDIResolver(), wsContext);
106            super.injectHandlers();
107        }
108        
109        @Override
110        public void destroy() {
111            // call handler preDestroy
112            destroyHandlers();
113            
114            super.destroy();
115        }
116    }