Author: ngallardo Date: Wed Jan 23 13:54:02 2008 New Revision: 614697 URL: http://svn.apache.org/viewvc?rev=614697&view=rev Log: Making the InvocationController pluggable.
Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationControllerFactory.java webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/AxisInvocationController.java - copied, changed from r614254, webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/AxisInvocationController.java webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerFactoryImpl.java webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerImpl.java webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/client/dispatch/ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/client/dispatch/InvocationControllerTest.java Removed: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/AxisInvocationController.java Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/dispatch/BaseDispatch.java webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationController.java webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/dispatch/BaseDispatch.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/dispatch/BaseDispatch.java?rev=614697&r1=614696&r2=614697&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/dispatch/BaseDispatch.java (original) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/dispatch/BaseDispatch.java Wed Jan 23 13:54:02 2008 @@ -45,14 +45,15 @@ import org.apache.axis2.jaxws.core.InvocationContext; import org.apache.axis2.jaxws.core.InvocationContextFactory; import org.apache.axis2.jaxws.core.MessageContext; -import org.apache.axis2.jaxws.core.controller.AxisInvocationController; import org.apache.axis2.jaxws.core.controller.InvocationController; +import org.apache.axis2.jaxws.core.controller.InvocationControllerFactory; import org.apache.axis2.jaxws.description.EndpointDescription; import org.apache.axis2.jaxws.i18n.Messages; import org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils; import org.apache.axis2.jaxws.message.Message; import org.apache.axis2.jaxws.message.Protocol; import org.apache.axis2.jaxws.message.util.XMLFaultUtils; +import org.apache.axis2.jaxws.registry.FactoryRegistry; import org.apache.axis2.jaxws.spi.Constants; import org.apache.axis2.jaxws.spi.ServiceDelegate; import org.apache.axis2.jaxws.spi.migrator.ApplicationContextMigratorUtil; @@ -74,7 +75,8 @@ protected BaseDispatch(ServiceDelegate svcDelgate, EndpointDescription epDesc) { super(svcDelgate, epDesc); - ic = new AxisInvocationController(); + InvocationControllerFactory icf = (InvocationControllerFactory) FactoryRegistry.getFactory(InvocationControllerFactory.class); + ic = icf.getInvocationController(); } /** Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java?rev=614697&r1=614696&r2=614697&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java (original) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/proxy/JAXWSProxyHandler.java Wed Jan 23 13:54:02 2008 @@ -25,8 +25,8 @@ import org.apache.axis2.jaxws.core.InvocationContext; import org.apache.axis2.jaxws.core.InvocationContextFactory; import org.apache.axis2.jaxws.core.MessageContext; -import org.apache.axis2.jaxws.core.controller.AxisInvocationController; import org.apache.axis2.jaxws.core.controller.InvocationController; +import org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController; import org.apache.axis2.jaxws.description.EndpointDescription; import org.apache.axis2.jaxws.description.OperationDescription; import org.apache.axis2.jaxws.description.ServiceDescription; Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationController.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationController.java?rev=614697&r1=614696&r2=614697&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationController.java (original) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationController.java Wed Jan 23 13:54:02 2008 @@ -18,29 +18,18 @@ */ package org.apache.axis2.jaxws.core.controller; -import org.apache.axis2.jaxws.ExceptionFactory; import org.apache.axis2.jaxws.core.InvocationContext; -import org.apache.axis2.jaxws.core.MessageContext; -import org.apache.axis2.jaxws.core.util.MessageContextUtils; -import org.apache.axis2.jaxws.handler.AttachmentsAdapter; -import org.apache.axis2.jaxws.handler.HandlerChainProcessor; -import org.apache.axis2.jaxws.handler.HandlerInvokerUtils; -import org.apache.axis2.jaxws.handler.TransportHeadersAdapter; -import org.apache.axis2.jaxws.i18n.Messages; -import org.apache.axis2.jaxws.util.Constants; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import javax.xml.ws.AsyncHandler; import javax.xml.ws.Response; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; /** - * The <tt>InvocationController</tt> is an abstract implementation modeling the invocation of a - * target web service. All of the information that the InvocationController needs should exist - * within the InvocatonContext that is passed in to the various invoke methods. + * The <tt>InvocationController</tt> is an interface modeling the invocation of a + * target web service. All of the information that the InvocationController needs + * should exist within the InvocatonContext that is passed in to the various invoke + * methods. * <p/> * The request information is passed in within the InvocationContext. The InvocationController * assumes that there is a MessageContext within that InvocationContext that is populated with all @@ -61,9 +50,7 @@ * <p/> * 4) asynchronous (polling) - [EMAIL PROTECTED] #invokeAsync(InvocationContext)} */ -public abstract class InvocationController { - - private static final Log log = LogFactory.getLog(InvocationController.class); +public interface InvocationController { /** * Performs a synchronous (blocking) invocation of a target service. The InvocationContext @@ -74,77 +61,7 @@ * @param ic * @return */ - public InvocationContext invoke(InvocationContext ic) { - if (log.isDebugEnabled()) { - log.debug("Invocation pattern: synchronous"); - } - - // Check to make sure we at least have a valid InvocationContext - // and request MessageContext - if (ic == null) { - throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr1")); - } - if (ic.getRequestMessageContext() == null) { - throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr2")); - } - - MessageContext request = ic.getRequestMessageContext(); - MessageContext response = null; - - request.setProperty(Constants.INVOCATION_PATTERN, InvocationPattern.SYNC); - - // Invoke outbound handlers. - boolean success = - HandlerInvokerUtils.invokeOutboundHandlers(request.getMEPContext(), - ic.getHandlers(), - HandlerChainProcessor.MEP.REQUEST, - false); - - if (success) { - prepareRequest(request); - response = doInvoke(request); - prepareResponse(response); - - // make sure request and response contexts share a single parent - response.setMEPContext(request.getMEPContext()); - - /* - * TODO TODO TODO review - * - * In most cases we are adding the endpointDesc to the - * MessageContext. Notice here that the "response" object is set by - * the call to doInvoke. It's a new context we are now working with. - * The invokeInboundHandlers uses that context way down in - * createMessageContext --> ContextUtils.addProperties() - * - * This may also occur in the AsyncResponse class when calling - * invokeInboundHandlers - * - * For now, make sure the endpointDesc is set on the response - * context. - */ - response.setEndpointDescription(request.getEndpointDescription()); - - // Invoke inbound handlers. - TransportHeadersAdapter.install(response); - AttachmentsAdapter.install(response); - HandlerInvokerUtils.invokeInboundHandlers(response.getMEPContext(), - ic.getHandlers(), - HandlerChainProcessor.MEP.RESPONSE, - false); - } else { // the outbound handler chain must have had a problem, and - // we've reversed directions - response = MessageContextUtils.createMinimalResponseMessageContext(request); - // since we've reversed directions, the message has "become a - // make sure request and response contexts share a single parent - response.setMEPContext(request.getMEPContext()); - response.setMessage(request.getMessage()); - } - ic.setResponseMessageContext(response); - return ic; - } - - protected abstract MessageContext doInvoke(MessageContext request); + public InvocationContext invoke(InvocationContext ic); /** * Performs a one-way invocation of the client. This is SHOULD NOT be a robust invocation, so @@ -154,45 +71,7 @@ * * @param ic */ - public void invokeOneWay(InvocationContext ic) throws Exception { - if (log.isDebugEnabled()) { - log.debug("Invocation pattern: one-way"); - } - - // Check to make sure we at least have a valid InvocationContext - // and request MessageContext - if (ic == null) { - throw ExceptionFactory.makeWebServiceException("ICErr1"); - } - if (ic.getRequestMessageContext() == null) { - throw ExceptionFactory.makeWebServiceException("ICErr2"); - } - - MessageContext request = ic.getRequestMessageContext(); - request.setProperty(Constants.INVOCATION_PATTERN, InvocationPattern.ONEWAY); - - // Invoke outbound handlers. - boolean success = - HandlerInvokerUtils.invokeOutboundHandlers(request.getMEPContext(), - ic.getHandlers(), - HandlerChainProcessor.MEP.REQUEST, - true); - - if (success) { - prepareRequest(request); - doInvokeOneWay(request); - } else { // the outbound handler chain must have had a problem, and we've reversed directions - // check to see if problem is due to a handler throwing an exception. If so, throw it, - // even in this oneWay invoke. - Exception e = request.getCausedByException(); - if (e != null) { - throw (Exception)e.getCause(); - } - } - return; - } - - protected abstract void doInvokeOneWay(MessageContext mc); + public void invokeOneWay(InvocationContext ic) throws Exception; /** * Performs an asynchronous (non-blocking) invocation of the client based on a callback model. @@ -203,50 +82,7 @@ * @param callback * @return */ - public Response invokeAsync(InvocationContext ic) { - if (log.isDebugEnabled()) { - log.debug("Invocation pattern: asynchronous(polling)"); - } - - // Check to make sure we at least have a valid InvocationContext - // and request MessageContext - if (ic == null) { - throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr1")); - } - if (ic.getRequestMessageContext() == null) { - throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr2")); - } - - MessageContext request = ic.getRequestMessageContext(); - request.setProperty(Constants.INVOCATION_PATTERN, InvocationPattern.ASYNC_POLLING); - - Response resp = null; - - // Invoke outbound handlers. - // TODO uncomment, and get the EndpointDescription from the request context, which should soon be available - boolean success = - HandlerInvokerUtils.invokeOutboundHandlers(request.getMEPContext(), - ic.getHandlers(), - HandlerChainProcessor.MEP.REQUEST, - false); - if (success) { - prepareRequest(request); - resp = doInvokeAsync(request); - } else - { // the outbound handler chain must have had a problem, and we've reversed directions - // since we've reversed directions, the message has "become a response message" (section 9.3.2.1, footnote superscript 2) - - // TODO we know the message is a fault message, we should - // convert it to an exception and throw it. - // something like: - - //throw new AxisFault(request.getMessage()); - } - - return resp; - } - - public abstract Response doInvokeAsync(MessageContext mc); + public Response invokeAsync(InvocationContext ic); /** * Performs an asynchronous (non-blocking) invocation of the client based on a polling model. @@ -256,82 +92,6 @@ * @param ic * @return */ - public Future<?> invokeAsync(InvocationContext ic, AsyncHandler asyncHandler) { - if (log.isDebugEnabled()) { - log.debug("Invocation pattern: asynchronous(callback)"); - } - - // Check to make sure we at least have a valid InvocationContext - // and request MessageContext - if (ic == null) { - throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr1")); - } - if (ic.getRequestMessageContext() == null) { - throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr2")); - } - if ((ic.getExecutor() != null) && (ic.getExecutor() instanceof ExecutorService)) { - ExecutorService es = (ExecutorService) ic.getExecutor(); - if (es.isShutdown()) { - // the executor service is shutdown and won't accept new tasks - // so return an error back to the client - throw ExceptionFactory.makeWebServiceException(Messages - .getMessage("ExecutorShutdown")); - } - } - - MessageContext request = ic.getRequestMessageContext(); - request.setProperty(Constants.INVOCATION_PATTERN, InvocationPattern.ASYNC_CALLBACK); - - Future<?> future = null; - - // Invoke outbound handlers. - boolean success = - HandlerInvokerUtils.invokeOutboundHandlers(request.getMEPContext(), - ic.getHandlers(), - HandlerChainProcessor.MEP.REQUEST, - false); - if (success) { - prepareRequest(request); - future = doInvokeAsync(request, asyncHandler); - } else { // the outbound handler chain must have had a problem, and - // we've reversed directions - // since we've reversed directions, the message has "become a - // response message" (section 9.3.2.1, footnote superscript 2) - - // TODO: how do we deal with this? The response message may or may - // not be a fault - // message. We do know that the direction has reversed, so somehow - // we need to - // flow immediately out of the async and give the exception and/or - // response object - // back to the client app without calling - // AsyncResponse.processResponse or processFault - - throw ExceptionFactory.makeWebServiceException(Messages.getMessage("invokeAsyncErr")); - - // throw new AxisFault(request.getMessage()); - } - return future; - } - - public abstract Future<?> doInvokeAsync(MessageContext mc, AsyncHandler asyncHandler); - - /** - * Abstract method that must be implemented by whoever is providing the specific client binding. - * Once this is called, everything that is needed to invoke the operation must be available in - * the MessageContext. - * - * @param mc - */ - protected abstract void prepareRequest(MessageContext mc); - - /** - * Abstract method that must be implemented by whoever is providing the specific client binding. - * This is called after the response has come back and allows the client binding to put - * whatever info it has in the response MessageContext. - * - * @param mc - */ - protected abstract void prepareResponse(MessageContext mc); + public Future<?> invokeAsync(InvocationContext ic, AsyncHandler asyncHandler); } Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationControllerFactory.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationControllerFactory.java?rev=614697&view=auto ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationControllerFactory.java (added) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/InvocationControllerFactory.java Wed Jan 23 13:54:02 2008 @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.axis2.jaxws.core.controller; + +public interface InvocationControllerFactory { + + /** + * Used to obtain an instance of the InvocationController currently + * configured for the runtime. + * + * @return A valid InvocationController instance. + */ + public InvocationController getInvocationController(); + +} Copied: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/AxisInvocationController.java (from r614254, webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/AxisInvocationController.java) URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/AxisInvocationController.java?p2=webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/AxisInvocationController.java&p1=webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/AxisInvocationController.java&r1=614254&r2=614697&rev=614697&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/AxisInvocationController.java (original) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/AxisInvocationController.java Wed Jan 23 13:54:02 2008 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.axis2.jaxws.core.controller; +package org.apache.axis2.jaxws.core.controller.impl; import org.apache.axis2.AxisFault; import org.apache.axis2.Constants.Configuration; @@ -37,6 +37,7 @@ import org.apache.axis2.jaxws.client.async.PollingFuture; import org.apache.axis2.jaxws.core.InvocationContext; import org.apache.axis2.jaxws.core.MessageContext; +import org.apache.axis2.jaxws.core.controller.InvocationController; import org.apache.axis2.jaxws.description.OperationDescription; import org.apache.axis2.jaxws.handler.MEPContext; import org.apache.axis2.jaxws.i18n.Messages; @@ -72,7 +73,7 @@ * For more information on how to invoke this class, please see the InvocationController interface * comments. */ -public class AxisInvocationController extends InvocationController { +public class AxisInvocationController extends InvocationControllerImpl { private static Log log = LogFactory.getLog(AxisInvocationController.class); Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerFactoryImpl.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerFactoryImpl.java?rev=614697&view=auto ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerFactoryImpl.java (added) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerFactoryImpl.java Wed Jan 23 13:54:02 2008 @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.axis2.jaxws.core.controller.impl; + +import org.apache.axis2.jaxws.core.controller.InvocationController; +import org.apache.axis2.jaxws.core.controller.InvocationControllerFactory; + +public class InvocationControllerFactoryImpl implements InvocationControllerFactory { + + public InvocationController getInvocationController() { + return new AxisInvocationController(); + } + +} Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerImpl.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerImpl.java?rev=614697&view=auto ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerImpl.java (added) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/core/controller/impl/InvocationControllerImpl.java Wed Jan 23 13:54:02 2008 @@ -0,0 +1,300 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.axis2.jaxws.core.controller.impl; + +import org.apache.axis2.jaxws.ExceptionFactory; +import org.apache.axis2.jaxws.core.InvocationContext; +import org.apache.axis2.jaxws.core.MessageContext; +import org.apache.axis2.jaxws.core.controller.InvocationController; +import org.apache.axis2.jaxws.core.controller.InvocationPattern; +import org.apache.axis2.jaxws.core.util.MessageContextUtils; +import org.apache.axis2.jaxws.handler.AttachmentsAdapter; +import org.apache.axis2.jaxws.handler.HandlerChainProcessor; +import org.apache.axis2.jaxws.handler.HandlerInvokerUtils; +import org.apache.axis2.jaxws.handler.TransportHeadersAdapter; +import org.apache.axis2.jaxws.i18n.Messages; +import org.apache.axis2.jaxws.util.Constants; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.xml.ws.AsyncHandler; +import javax.xml.ws.Response; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +/** + * An abstract implementation of the InvocationController interface. + */ +public abstract class InvocationControllerImpl implements InvocationController { + + private static final Log log = LogFactory.getLog(InvocationControllerImpl.class); + + /* + * (non-Javadoc) + * @see org.apache.axis2.jaxws.core.controller.InvocationController#invoke(org.apache.axis2.jaxws.core.InvocationContext) + */ + public InvocationContext invoke(InvocationContext ic) { + if (log.isDebugEnabled()) { + log.debug("Invocation pattern: synchronous"); + } + + // Check to make sure we at least have a valid InvocationContext + // and request MessageContext + if (ic == null) { + throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr1")); + } + if (ic.getRequestMessageContext() == null) { + throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr2")); + } + + MessageContext request = ic.getRequestMessageContext(); + MessageContext response = null; + + request.setProperty(Constants.INVOCATION_PATTERN, InvocationPattern.SYNC); + + // Invoke outbound handlers. + boolean success = + HandlerInvokerUtils.invokeOutboundHandlers(request.getMEPContext(), + ic.getHandlers(), + HandlerChainProcessor.MEP.REQUEST, + false); + + if (success) { + prepareRequest(request); + response = doInvoke(request); + prepareResponse(response); + + // make sure request and response contexts share a single parent + response.setMEPContext(request.getMEPContext()); + + /* + * TODO TODO TODO review + * + * In most cases we are adding the endpointDesc to the + * MessageContext. Notice here that the "response" object is set by + * the call to doInvoke. It's a new context we are now working with. + * The invokeInboundHandlers uses that context way down in + * createMessageContext --> ContextUtils.addProperties() + * + * This may also occur in the AsyncResponse class when calling + * invokeInboundHandlers + * + * For now, make sure the endpointDesc is set on the response + * context. + */ + response.setEndpointDescription(request.getEndpointDescription()); + + // Invoke inbound handlers. + TransportHeadersAdapter.install(response); + AttachmentsAdapter.install(response); + HandlerInvokerUtils.invokeInboundHandlers(response.getMEPContext(), + ic.getHandlers(), + HandlerChainProcessor.MEP.RESPONSE, + false); + } else { // the outbound handler chain must have had a problem, and + // we've reversed directions + response = MessageContextUtils.createMinimalResponseMessageContext(request); + // since we've reversed directions, the message has "become a + // make sure request and response contexts share a single parent + response.setMEPContext(request.getMEPContext()); + response.setMessage(request.getMessage()); + } + ic.setResponseMessageContext(response); + return ic; + } + + protected abstract MessageContext doInvoke(MessageContext request); + + /* + * (non-Javadoc) + * @see org.apache.axis2.jaxws.core.controller.InvocationController#invokeOneWay(org.apache.axis2.jaxws.core.InvocationContext) + */ + public void invokeOneWay(InvocationContext ic) throws Exception { + if (log.isDebugEnabled()) { + log.debug("Invocation pattern: one-way"); + } + + // Check to make sure we at least have a valid InvocationContext + // and request MessageContext + if (ic == null) { + throw ExceptionFactory.makeWebServiceException("ICErr1"); + } + if (ic.getRequestMessageContext() == null) { + throw ExceptionFactory.makeWebServiceException("ICErr2"); + } + + MessageContext request = ic.getRequestMessageContext(); + request.setProperty(Constants.INVOCATION_PATTERN, InvocationPattern.ONEWAY); + + // Invoke outbound handlers. + boolean success = + HandlerInvokerUtils.invokeOutboundHandlers(request.getMEPContext(), + ic.getHandlers(), + HandlerChainProcessor.MEP.REQUEST, + true); + + if (success) { + prepareRequest(request); + doInvokeOneWay(request); + } else { // the outbound handler chain must have had a problem, and we've reversed directions + // check to see if problem is due to a handler throwing an exception. If so, throw it, + // even in this oneWay invoke. + Exception e = request.getCausedByException(); + if (e != null) { + throw (Exception)e.getCause(); + } + } + return; + } + + protected abstract void doInvokeOneWay(MessageContext mc); + + /* + * (non-Javadoc) + * @see org.apache.axis2.jaxws.core.controller.InvocationController#invokeAsync(org.apache.axis2.jaxws.core.InvocationContext) + */ + public Response invokeAsync(InvocationContext ic) { + if (log.isDebugEnabled()) { + log.debug("Invocation pattern: asynchronous(polling)"); + } + + // Check to make sure we at least have a valid InvocationContext + // and request MessageContext + if (ic == null) { + throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr1")); + } + if (ic.getRequestMessageContext() == null) { + throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr2")); + } + + MessageContext request = ic.getRequestMessageContext(); + request.setProperty(Constants.INVOCATION_PATTERN, InvocationPattern.ASYNC_POLLING); + + Response resp = null; + + // Invoke outbound handlers. + // TODO uncomment, and get the EndpointDescription from the request context, which should soon be available + boolean success = + HandlerInvokerUtils.invokeOutboundHandlers(request.getMEPContext(), + ic.getHandlers(), + HandlerChainProcessor.MEP.REQUEST, + false); + if (success) { + prepareRequest(request); + resp = doInvokeAsync(request); + } else + { // the outbound handler chain must have had a problem, and we've reversed directions + // since we've reversed directions, the message has "become a response message" (section 9.3.2.1, footnote superscript 2) + + // TODO we know the message is a fault message, we should + // convert it to an exception and throw it. + // something like: + + //throw new AxisFault(request.getMessage()); + } + + return resp; + } + + public abstract Response doInvokeAsync(MessageContext mc); + + /* + * (non-Javadoc) + * @see org.apache.axis2.jaxws.core.controller.InvocationController#invokeAsync(org.apache.axis2.jaxws.core.InvocationContext, javax.xml.ws.AsyncHandler) + */ + public Future<?> invokeAsync(InvocationContext ic, AsyncHandler asyncHandler) { + if (log.isDebugEnabled()) { + log.debug("Invocation pattern: asynchronous(callback)"); + } + + // Check to make sure we at least have a valid InvocationContext + // and request MessageContext + if (ic == null) { + throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr1")); + } + if (ic.getRequestMessageContext() == null) { + throw ExceptionFactory.makeWebServiceException(Messages.getMessage("ICErr2")); + } + if ((ic.getExecutor() != null) && (ic.getExecutor() instanceof ExecutorService)) { + ExecutorService es = (ExecutorService) ic.getExecutor(); + if (es.isShutdown()) { + // the executor service is shutdown and won't accept new tasks + // so return an error back to the client + throw ExceptionFactory.makeWebServiceException(Messages + .getMessage("ExecutorShutdown")); + } + } + + MessageContext request = ic.getRequestMessageContext(); + request.setProperty(Constants.INVOCATION_PATTERN, InvocationPattern.ASYNC_CALLBACK); + + Future<?> future = null; + + // Invoke outbound handlers. + boolean success = + HandlerInvokerUtils.invokeOutboundHandlers(request.getMEPContext(), + ic.getHandlers(), + HandlerChainProcessor.MEP.REQUEST, + false); + if (success) { + prepareRequest(request); + future = doInvokeAsync(request, asyncHandler); + } else { // the outbound handler chain must have had a problem, and + // we've reversed directions + // since we've reversed directions, the message has "become a + // response message" (section 9.3.2.1, footnote superscript 2) + + // TODO: how do we deal with this? The response message may or may + // not be a fault + // message. We do know that the direction has reversed, so somehow + // we need to + // flow immediately out of the async and give the exception and/or + // response object + // back to the client app without calling + // AsyncResponse.processResponse or processFault + + throw ExceptionFactory.makeWebServiceException(Messages.getMessage("invokeAsyncErr")); + + // throw new AxisFault(request.getMessage()); + } + return future; + } + + public abstract Future<?> doInvokeAsync(MessageContext mc, AsyncHandler asyncHandler); + + /** + * Abstract method that must be implemented by whoever is providing the specific client binding. + * Once this is called, everything that is needed to invoke the operation must be available in + * the MessageContext. + * + * @param mc + */ + protected abstract void prepareRequest(MessageContext mc); + + /** + * Abstract method that must be implemented by whoever is providing the specific client binding. + * This is called after the response has come back and allows the client binding to put + * whatever info it has in the response MessageContext. + * + * @param mc + */ + protected abstract void prepareResponse(MessageContext mc); + +} Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java?rev=614697&r1=614696&r2=614697&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java (original) +++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java Wed Jan 23 13:54:02 2008 @@ -19,6 +19,8 @@ package org.apache.axis2.jaxws.registry; +import org.apache.axis2.jaxws.core.controller.InvocationControllerFactory; +import org.apache.axis2.jaxws.core.controller.impl.InvocationControllerFactoryImpl; import org.apache.axis2.jaxws.handler.lifecycle.factory.HandlerLifecycleManagerFactory; import org.apache.axis2.jaxws.message.databinding.impl.JAXBBlockFactoryImpl; import org.apache.axis2.jaxws.message.databinding.impl.OMBlockFactoryImpl; @@ -94,6 +96,7 @@ table.put(ClassFinderFactory.class, new ClassFinderFactory()); table.put(ExecutorFactory.class, new JAXWSExecutorFactory()); table.put(ServiceInstanceFactory.class, new ServiceInstanceFactoryImpl()); + table.put(InvocationControllerFactory.class, new InvocationControllerFactoryImpl()); // register the implementation responsible for both WebServiceContext // injection and the updating of the WebServiceContext instances that Added: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/client/dispatch/InvocationControllerTest.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/client/dispatch/InvocationControllerTest.java?rev=614697&view=auto ============================================================================== --- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/client/dispatch/InvocationControllerTest.java (added) +++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/client/dispatch/InvocationControllerTest.java Wed Jan 23 13:54:02 2008 @@ -0,0 +1,74 @@ +package org.apache.axis2.jaxws.client.dispatch; + +import org.apache.axis2.jaxws.core.InvocationContext; +import org.apache.axis2.jaxws.core.controller.InvocationController; +import org.apache.axis2.jaxws.core.controller.InvocationControllerFactory; +import org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController; +import org.apache.axis2.jaxws.registry.FactoryRegistry; + +import javax.xml.namespace.QName; +import javax.xml.transform.Source; +import javax.xml.ws.AsyncHandler; +import javax.xml.ws.Dispatch; +import javax.xml.ws.Response; +import javax.xml.ws.Service; +import javax.xml.ws.soap.SOAPBinding; + +import java.util.concurrent.Future; + +import junit.framework.TestCase; + +public class InvocationControllerTest extends TestCase { + + private QName svcQname = new QName("http://test", "TestService"); + private QName portQname = new QName("http://test", "TestPort"); + + public void testDefaultInvocationController() { + Service svc = Service.create(svcQname); + svc.addPort(portQname, SOAPBinding.SOAP11HTTP_BINDING, "http://localhost"); + Dispatch d = svc.createDispatch(portQname, Source.class, Service.Mode.PAYLOAD); + + BaseDispatch bd = (BaseDispatch) d; + + assertTrue("An InvocationController instance was not created", bd.ic != null); + assertTrue("The default InvocationController type was incorrect.", + AxisInvocationController.class.isAssignableFrom(bd.ic.getClass())); + } + + public void testPluggableInvocationController() { + FactoryRegistry.setFactory(InvocationControllerFactory.class, new TestInvocationControllerFactory()); + + Service svc = Service.create(svcQname); + svc.addPort(portQname, SOAPBinding.SOAP11HTTP_BINDING, "http://localhost"); + Dispatch d = svc.createDispatch(portQname, Source.class, Service.Mode.PAYLOAD); + + BaseDispatch bd = (BaseDispatch) d; + + assertTrue("An InvocationController instance was not created", bd.ic != null); + assertTrue("The default InvocationController type was incorrect.", + TestInvocationController.class.isAssignableFrom(bd.ic.getClass())); + } +} + +class TestInvocationControllerFactory implements InvocationControllerFactory { + public InvocationController getInvocationController() { + return new TestInvocationController(); + } +} + +class TestInvocationController implements InvocationController { + + public InvocationContext invoke(InvocationContext ic) { + return null; + } + + public Future<?> invokeAsync(InvocationContext ic, AsyncHandler asyncHandler) { + return null; + } + + public Response invokeAsync(InvocationContext ic) { + return null; + } + + public void invokeOneWay(InvocationContext ic) throws Exception {} +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]