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.pojo;
019
020 import java.net.URL;
021
022 import javax.naming.Context;
023 import javax.xml.ws.WebServiceException;
024
025 import org.apache.axis2.context.ConfigurationContext;
026 import org.apache.axis2.context.MessageContext;
027 import org.apache.axis2.context.ServiceContext;
028 import org.apache.axis2.description.AxisService;
029 import org.apache.axis2.jaxws.registry.FactoryRegistry;
030 import org.apache.axis2.jaxws.server.endpoint.lifecycle.factory.EndpointLifecycleManagerFactory;
031 import org.apache.axis2.transport.http.HTTPConstants;
032 import org.apache.axis2.transport.http.HTTPTransportUtils;
033 import org.apache.axis2.util.JavaUtils;
034 import org.apache.commons.logging.Log;
035 import org.apache.commons.logging.LogFactory;
036 import org.apache.geronimo.axis2.Axis2WebServiceContainer;
037 import org.apache.geronimo.jaxws.JAXWSAnnotationProcessor;
038 import org.apache.geronimo.jaxws.PortInfo;
039 import org.apache.geronimo.jaxws.annotations.AnnotationException;
040
041 /**
042 * @version $Rev$ $Date$
043 */
044 public class POJOWebServiceContainer extends Axis2WebServiceContainer {
045
046 private static final Log LOG = LogFactory.getLog(POJOWebServiceContainer.class);
047
048 private Object endpointInstance;
049 private String contextRoot = null;
050
051 public POJOWebServiceContainer(PortInfo portInfo,
052 String endpointClassName,
053 ClassLoader classLoader,
054 Context context,
055 URL configurationBaseUrl) {
056 super(portInfo, endpointClassName, classLoader, context, configurationBaseUrl);
057 }
058
059 @Override
060 public void init() throws Exception {
061 super.init();
062
063 /*
064 * This replaces EndpointLifecycleManagerFactory for all web services.
065 * This should be ok as we do our own endpoint instance management and injection.
066 */
067 FactoryRegistry.setFactory(EndpointLifecycleManagerFactory.class,
068 new POJOEndpointLifecycleManagerFactory());
069
070 this.endpointInstance = this.endpointClass.newInstance();
071
072 this.configurationContext.setServicePath(this.portInfo.getLocation());
073 this.annotationProcessor =
074 new JAXWSAnnotationProcessor(this.jndiResolver, new POJOWebServiceContext());
075
076 // configure and inject handlers
077 try {
078 configureHandlers();
079 injectHandlers();
080 } catch (Exception e) {
081 throw new WebServiceException("Error configuring handlers", e);
082 }
083
084 // inject resources into service
085 try {
086 injectResources(this.endpointInstance);
087 } catch (AnnotationException e) {
088 throw new WebServiceException("Service resource injection failed", e);
089 }
090 }
091
092 @Override
093 protected void processPOSTRequest(Request request, Response response, AxisService service, MessageContext msgContext) throws Exception {
094 String contentType = request.getHeader(HTTPConstants.HEADER_CONTENT_TYPE);
095 String soapAction = request.getHeader(HTTPConstants.HEADER_SOAP_ACTION);
096 if (soapAction == null) {
097 soapAction = "\"\"";
098 }
099
100 ConfigurationContext configurationContext = msgContext.getConfigurationContext();
101 configurationContext.fillServiceContextAndServiceGroupContext(msgContext);
102
103 setMsgContextProperties(request, response, service, msgContext);
104
105 ServiceContext serviceContext = msgContext.getServiceContext();
106 serviceContext.setProperty(ServiceContext.SERVICE_OBJECT, this.endpointInstance);
107
108 try {
109 HTTPTransportUtils.processHTTPPostRequest(msgContext,
110 request.getInputStream(),
111 response.getOutputStream(),
112 contentType,
113 soapAction,
114 request.getURI().getPath());
115 } finally {
116 // de-associate JAX-WS MessageContext with the thread
117 // (association happens in POJOEndpointLifecycleManager.createService() call)
118 POJOWebServiceContext.clear();
119 }
120 }
121
122 protected void initContextRoot(Request request) {
123 if (contextRoot == null || "".equals(contextRoot)) {
124 String[] parts = JavaUtils.split(request.getContextPath(), '/');
125 if (parts != null) {
126 for (int i = 0; i < parts.length; i++) {
127 if (parts[i].length() > 0) {
128 contextRoot = parts[i];
129 break;
130 }
131 }
132 }
133 if (contextRoot == null || request.getContextPath().equals("/")) {
134 contextRoot = "/";
135 }
136 //need to setContextRoot after servicePath as cachedServicePath is only built
137 //when setContextRoot is called.
138 configurationContext.setContextRoot(contextRoot);
139 }
140 }
141
142 @Override
143 public void destroy() {
144 // call handler preDestroy
145 destroyHandlers();
146
147 // call service preDestroy
148 if (this.endpointInstance != null) {
149 this.annotationProcessor.invokePreDestroy(this.endpointInstance);
150 }
151
152 super.destroy();
153 }
154 }