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: */package org.apache.openejb.server.axis2.pojo;
017:
018: import org.apache.axis2.context.ConfigurationContext;
019: import org.apache.axis2.context.MessageContext;
020: import org.apache.axis2.context.ServiceContext;
021: import org.apache.axis2.description.AxisService;
022: import org.apache.axis2.jaxws.registry.FactoryRegistry;
023: import org.apache.axis2.jaxws.server.endpoint.lifecycle.factory.EndpointLifecycleManagerFactory;
024: import org.apache.axis2.transport.http.HTTPConstants;
025: import org.apache.axis2.transport.http.HTTPTransportUtils;
026: import org.apache.openejb.InjectionProcessor;
027: import org.apache.openejb.core.webservices.PortData;
028: import org.apache.openejb.server.axis2.Axis2WsContainer;
029: import org.apache.openejb.server.httpd.HttpRequest;
030: import org.apache.openejb.server.httpd.HttpResponse;
031:
032: import javax.naming.Context;
033: import javax.xml.ws.WebServiceException;
034:
035: public class PojoWsContainer extends Axis2WsContainer {
036: private Object endpointInstance;
037: private String contextRoot;
038: private InjectionProcessor<Object> injectionProcessor;
039:
040: public PojoWsContainer(PortData port, Class<?> endpointClass,
041: Context context, String contextRoot) {
042: super (port, endpointClass, context);
043: this .contextRoot = contextRoot;
044: }
045:
046: public void start() throws Exception {
047: super .start();
048:
049: /*
050: * This replaces EndpointLifecycleManagerFactory for all web services.
051: * This should be ok as we do our own endpoint instance management and injection.
052: */
053: FactoryRegistry.setFactory(
054: EndpointLifecycleManagerFactory.class,
055: new PojoEndpointLifecycleManagerFactory());
056:
057: String servicePath = trimContext(getServicePath(this .contextRoot));
058: this .configurationContext.setServicePath(servicePath);
059: //need to setContextRoot after servicePath as cachedServicePath is only built
060: //when setContextRoot is called.
061: String rootContext = trimContext(this .contextRoot);
062: this .configurationContext.setContextRoot(rootContext);
063:
064: // instantiate and inject resources into service
065: try {
066: injectionProcessor = new InjectionProcessor<Object>(
067: endpointClass, port.getInjections(), null, null,
068: context);
069: injectionProcessor.createInstance();
070: injectionProcessor.postConstruct();
071: endpointInstance = injectionProcessor.getInstance();
072: } catch (Exception e) {
073: throw new WebServiceException(
074: "Service resource injection failed", e);
075: }
076:
077: // configure and inject handlers
078: try {
079: configureHandlers();
080: } catch (Exception e) {
081: throw new WebServiceException("Error configuring handlers",
082: e);
083: }
084:
085: }
086:
087: protected void processPOSTRequest(HttpRequest request,
088: HttpResponse response, AxisService service,
089: MessageContext msgContext) throws Exception {
090: String contentType = request
091: .getHeader(HTTPConstants.HEADER_CONTENT_TYPE);
092: String soapAction = request
093: .getHeader(HTTPConstants.HEADER_SOAP_ACTION);
094: if (soapAction == null) {
095: soapAction = "\"\"";
096: }
097:
098: ConfigurationContext configurationContext = msgContext
099: .getConfigurationContext();
100: configurationContext
101: .fillServiceContextAndServiceGroupContext(msgContext);
102:
103: setMsgContextProperties(request, response, service, msgContext);
104:
105: ServiceContext serviceContext = msgContext.getServiceContext();
106: serviceContext.setProperty(ServiceContext.SERVICE_OBJECT,
107: this .endpointInstance);
108:
109: try {
110: HTTPTransportUtils.processHTTPPostRequest(msgContext,
111: request.getInputStream(), response
112: .getOutputStream(), contentType,
113: soapAction, request.getURI().getPath());
114: } finally {
115: // de-associate JAX-WS MessageContext with the thread
116: // (association happens in POJOEndpointLifecycleManager.createService() call)
117: PojoWsContext.clear();
118: }
119: }
120:
121: public void destroy() {
122: // call handler preDestroy
123: destroyHandlers();
124:
125: // call service preDestroy
126: if (injectionProcessor != null) {
127: injectionProcessor.preDestroy();
128: }
129:
130: super.destroy();
131: }
132: }
|