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$ $Date$
038 */
039 public class EJBWebServiceContainer extends Axis2WebServiceContainer {
040
041 private String contextRoot = null;
042 private DeploymentInfo deploymnetInfo;
043
044 public EJBWebServiceContainer(PortInfo portInfo,
045 String endpointClassName,
046 ClassLoader classLoader,
047 Context context,
048 URL configurationBaseUrl,
049 DeploymentInfo deploymnetInfo) {
050 super(portInfo, endpointClassName, classLoader, context, configurationBaseUrl);
051 this.deploymnetInfo = deploymnetInfo;
052 }
053
054 @Override
055 public void init() throws Exception {
056 super.init();
057
058 // configure handlers
059 try {
060 configureHandlers();
061 } catch (Exception e) {
062 throw new WebServiceException("Error configuring handlers", e);
063 }
064 }
065
066 @Override
067 protected AxisServiceGenerator createServiceGenerator() {
068 AxisServiceGenerator serviceGenerator = super.createServiceGenerator();
069 EJBMessageReceiver messageReceiver =
070 new EJBMessageReceiver(this, this.endpointClass, this.deploymnetInfo);
071 serviceGenerator.setMessageReceiver(messageReceiver);
072 return serviceGenerator;
073 }
074
075 @Override
076 protected void initContextRoot(Request request) {
077 String servicePath = portInfo.getLocation();
078
079 if (contextRoot == null || "".equals(contextRoot)) {
080 String[] parts = JavaUtils.split(request.getContextPath(), '/');
081 if (parts != null) {
082 for (int i = 0; i < parts.length; i++) {
083 if (parts[i].length() > 0) {
084 contextRoot = parts[i];
085 break;
086 }
087 }
088 }
089 if (contextRoot == null || request.getContextPath().equals("/")) {
090 contextRoot = "/";
091 } else { //when contextRoot is not "/"
092 //set the servicePath here for EJB.
093 //check if portInfo.getLocation() contains contextRoot, if so, strip it.
094 int i = servicePath.indexOf(contextRoot);
095 if (i > -1) {
096 servicePath = servicePath.substring(i + contextRoot.length() + 1);
097 servicePath.trim();
098 }
099 }
100 configurationContext.setServicePath(servicePath);
101
102 //need to setContextRoot after servicePath as cachedServicePath is only built
103 //when setContextRoot is called.
104 configurationContext.setContextRoot(contextRoot);
105 }
106 }
107
108 public synchronized void injectHandlers() {
109 if (this.annotationProcessor != null) {
110 // assume injection was already done
111 return;
112 }
113
114 WebServiceContext wsContext = null;
115 try {
116 InitialContext ctx = new InitialContext();
117 wsContext = (WebServiceContext) ctx.lookup("java:comp/WebServiceContext");
118 } catch (NamingException e) {
119 throw new WebServiceException("Failed to lookup WebServiceContext", e);
120 }
121
122 this.annotationProcessor = new JAXWSAnnotationProcessor(new JNDIResolver(), wsContext);
123 super.injectHandlers();
124 }
125
126 @Override
127 public void destroy() {
128 // call handler preDestroy
129 destroyHandlers();
130
131 super.destroy();
132 }
133 }