You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by ba...@apache.org on 2006/11/03 20:23:38 UTC
svn commit: r470960 - in /webservices/axis2/trunk/java/modules/jaxws:
src/org/apache/axis2/jaxws/core/controller/
test/org/apache/axis2/jaxws/sample/
Author: barrettj
Date: Fri Nov 3 11:23:37 2006
New Revision: 470960
URL: http://svn.apache.org/viewvc?view=rev&rev=470960
Log:
AXIS2-1599
Contributed by Mike Rheinheimer
Modified:
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/InvocationController.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/FaultyWebServiceTests.java
Modified: 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/AxisInvocationController.java?view=diff&rev=470960&r1=470959&r2=470960
==============================================================================
--- 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/AxisInvocationController.java Fri Nov 3 11:23:37 2006
@@ -29,6 +29,7 @@
import javax.xml.namespace.QName;
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Response;
+import javax.xml.ws.WebServiceException;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
@@ -51,6 +52,7 @@
import org.apache.axis2.jaxws.i18n.Messages;
import org.apache.axis2.jaxws.impl.AsyncListener;
import org.apache.axis2.jaxws.impl.AsyncListenerWrapper;
+import org.apache.axis2.jaxws.marshaller.ClassUtils;
import org.apache.axis2.jaxws.message.Message;
import org.apache.axis2.jaxws.message.MessageException;
import org.apache.axis2.jaxws.message.factory.MessageFactory;
@@ -156,7 +158,7 @@
* (non-Javadoc)
* @see org.apache.axis2.jaxws.core.controller.InvocationController#invokeOneWay(org.apache.axis2.jaxws.core.InvocationContext)
*/
- public void doInvokeOneWay(MessageContext request) {
+ public void doInvokeOneWay(MessageContext request) throws WebServiceException {
// We need the qname of the operation being invoked to know which
// AxisOperation the OperationClient should be based on.
// Note that the OperationDesc is only set through use of the Proxy. Dispatch
@@ -184,12 +186,13 @@
try {
execute(opClient, true, axisRequestMsgCtx);
} catch(AxisFault af) {
- // TODO MIKE revisit?
- // do nothing here. The exception we get is from the endpoint,
- // and will be sitting on the message context. We need to save it
- // to process it through jaxws
- System.out.println("Swallowed Exception =" + af);
- af.printStackTrace(System.out);
+ // JAXWS 6.4.2 says to throw it...
+ // Whatever exception we get here will not be from the server since a one-way
+ // invocation has no response. This will always be a SENDER fault
+ if (log.isDebugEnabled()) {
+ log.debug("AxisFault received from client: " + af.getMessage());
+ }
+ throw ExceptionFactory.makeWebServiceException(ClassUtils.getRootCause(af));
}
return;
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?view=diff&rev=470960&r1=470959&r2=470960
==============================================================================
--- 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 Fri Nov 3 11:23:37 2006
@@ -1,203 +1,204 @@
-/*
- * Copyright 2006 The Apache Software Foundation.
- * Copyright 2006 International Business Machines Corp.
- *
- * Licensed 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;
-
-import java.util.concurrent.Future;
-
-import javax.xml.ws.AsyncHandler;
-import javax.xml.ws.Response;
-
-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.i18n.Messages;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * 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 request information is passed in within the InvocationContext. The
- * InvocationController assumes that there is a MessageContext within that
- * InvocationContext that is populated with all of the information that it
- * needs to invoke. If not, an error will be returned. Once the response
- * comes back, the information for that response will be held inside of the
- * MessageContext representing the response, that exists in the
- * InvocationContext.
- *
- * The InvocationController supports four different invocation patterns:
- *
- * 1) synchronous - This is represented by the {@link #invoke(InvocationContext)}
- * method. This is a blocking, request/response call to the web service.
- *
- * 2) one-way - This is represented by the {@link #invokeOneWay(InvocationContext)}
- * method. This is a one-way invocation that only returns errors related
- * to sending the message. If an error occurs while processing, the client
- * will not be notified.
- *
- * 3) asynchronous (callback) - {@link #invokeAsync(InvocationContext, AsyncHandler)}
- *
- * 4) asynchronous (polling) - {@link #invokeAsync(InvocationContext)}
- */
-public abstract class InvocationController {
-
- private static final Log log = LogFactory.getLog(InvocationController.class);
-
- /**
- * Performs a synchronous (blocking) invocation of a target service. The
- * InvocationContext passed in should contain a valid MessageContext
- * containing the properties and message to be sent for the request. The
- * response contents will be processed and placed in the InvocationContext
- * as well.
- *
- * @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;
-
- // TODO: Place-holder for running the JAX-WS request handler chain
-
- prepareRequest(request);
-
- response = doInvoke(request);
- prepareResponse(response);
- ic.setResponseMessageContext(response);
-
- // TODO: Place-holder for running the JAX-WS response handler chain
-
- return ic;
- }
-
- protected abstract MessageContext doInvoke(MessageContext request);
-
- /**
- * Performs a one-way invocation of the client. This is SHOULD NOT be a
- * robust invocation, so any fault that occurs during the processing of
- * the request will not be returned to the client. Errors returned to the
- * client are problems that occurred during the sending of the message to
- * the server.
- *
- * @param ic
- */
- public void invokeOneWay(InvocationContext ic) {
- 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();
-
- // TODO: Place-holder to run the JAX-WS request handler chain
-
- prepareRequest(request);
- doInvokeOneWay(request);
- return;
- }
-
- protected abstract void doInvokeOneWay(MessageContext mc);
-
- /**
- * Performs an asynchronous (non-blocking) invocation of the client based
- * on a callback model. The AsyncHandler that is passed in is the callback
- * that the client programmer supplied when they invoked their JAX-WS
- * Dispatch or their SEI-based dynamic proxy.
- *
- * @param ic
- * @param callback
- * @return
- */
- public abstract Response invokeAsync(InvocationContext ic);
-
- /**
- * Performs an asynchronous (non-blocking) invocation of the client based
- * on a polling model. The Response object that is returned allows the
- * client programmer to poll against it to see if a response has been sent
- * back by the server.
- *
- * @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"));
- }
-
- MessageContext request = ic.getRequestMessageContext();
-
- // TODO: Place-holder for running the JAX-WS request handler chain
-
- prepareRequest(request);
- Future<?> future = doInvokeAsync(request, asyncHandler);
- 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);
-
-}
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ * Copyright 2006 International Business Machines Corp.
+ *
+ * Licensed 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;
+
+import java.util.concurrent.Future;
+
+import javax.xml.ws.AsyncHandler;
+import javax.xml.ws.Response;
+import javax.xml.ws.WebServiceException;
+
+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.i18n.Messages;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * 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 request information is passed in within the InvocationContext. The
+ * InvocationController assumes that there is a MessageContext within that
+ * InvocationContext that is populated with all of the information that it
+ * needs to invoke. If not, an error will be returned. Once the response
+ * comes back, the information for that response will be held inside of the
+ * MessageContext representing the response, that exists in the
+ * InvocationContext.
+ *
+ * The InvocationController supports four different invocation patterns:
+ *
+ * 1) synchronous - This is represented by the {@link #invoke(InvocationContext)}
+ * method. This is a blocking, request/response call to the web service.
+ *
+ * 2) one-way - This is represented by the {@link #invokeOneWay(InvocationContext)}
+ * method. This is a one-way invocation that only returns errors related
+ * to sending the message. If an error occurs while processing, the client
+ * will not be notified.
+ *
+ * 3) asynchronous (callback) - {@link #invokeAsync(InvocationContext, AsyncHandler)}
+ *
+ * 4) asynchronous (polling) - {@link #invokeAsync(InvocationContext)}
+ */
+public abstract class InvocationController {
+
+ private static final Log log = LogFactory.getLog(InvocationController.class);
+
+ /**
+ * Performs a synchronous (blocking) invocation of a target service. The
+ * InvocationContext passed in should contain a valid MessageContext
+ * containing the properties and message to be sent for the request. The
+ * response contents will be processed and placed in the InvocationContext
+ * as well.
+ *
+ * @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;
+
+ // TODO: Place-holder for running the JAX-WS request handler chain
+
+ prepareRequest(request);
+
+ response = doInvoke(request);
+ prepareResponse(response);
+ ic.setResponseMessageContext(response);
+
+ // TODO: Place-holder for running the JAX-WS response handler chain
+
+ return ic;
+ }
+
+ protected abstract MessageContext doInvoke(MessageContext request);
+
+ /**
+ * Performs a one-way invocation of the client. This is SHOULD NOT be a
+ * robust invocation, so any fault that occurs during the processing of
+ * the request will not be returned to the client. Errors returned to the
+ * client are problems that occurred during the sending of the message to
+ * the server.
+ *
+ * @param ic
+ */
+ public void invokeOneWay(InvocationContext ic) {
+ 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();
+
+ // TODO: Place-holder to run the JAX-WS request handler chain
+
+ prepareRequest(request);
+ doInvokeOneWay(request);
+ return;
+ }
+
+ protected abstract void doInvokeOneWay(MessageContext mc) throws WebServiceException;
+
+ /**
+ * Performs an asynchronous (non-blocking) invocation of the client based
+ * on a callback model. The AsyncHandler that is passed in is the callback
+ * that the client programmer supplied when they invoked their JAX-WS
+ * Dispatch or their SEI-based dynamic proxy.
+ *
+ * @param ic
+ * @param callback
+ * @return
+ */
+ public abstract Response invokeAsync(InvocationContext ic);
+
+ /**
+ * Performs an asynchronous (non-blocking) invocation of the client based
+ * on a polling model. The Response object that is returned allows the
+ * client programmer to poll against it to see if a response has been sent
+ * back by the server.
+ *
+ * @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"));
+ }
+
+ MessageContext request = ic.getRequestMessageContext();
+
+ // TODO: Place-holder for running the JAX-WS request handler chain
+
+ prepareRequest(request);
+ Future<?> future = doInvokeAsync(request, asyncHandler);
+ 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/test/org/apache/axis2/jaxws/sample/FaultyWebServiceTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/FaultyWebServiceTests.java?view=diff&rev=470960&r1=470959&r2=470960
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/FaultyWebServiceTests.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/sample/FaultyWebServiceTests.java Fri Nov 3 11:23:37 2006
@@ -13,6 +13,8 @@
import org.apache.axis2.jaxws.sample.faults.FaultyWebServiceFault_Exception;
import org.apache.axis2.jaxws.sample.faults.FaultyWebServicePortType;
import org.apache.axis2.jaxws.sample.faults.FaultyWebServiceService;
+import org.apache.axis2.jaxws.sample.wrap.sei.DocLitWrap;
+import org.apache.axis2.jaxws.sample.wrap.sei.DocLitWrapService;
public class FaultyWebServiceTests extends TestCase {
@@ -78,4 +80,40 @@
assertEquals(exception.getMessage(), host);
}
+
+ // TODO should also have an invoke oneway bad endpoint test to make sure
+ // we get an exception as indicated in JAXWS 6.4.2.
+
+
+ public void testFaultyWebService_badEndpoint_oneWay() {
+
+ String host = "this.is.a.bad.endpoint.terrible.in.fact";
+ String badEndpoint = "http://" + host;
+
+ WebServiceException exception = null;
+
+ System.out.println("------------------------------");
+ System.out.println("Test : "+getName());
+ try{
+
+ DocLitWrapService service = new DocLitWrapService();
+ DocLitWrap proxy = service.getDocLitWrapPort();
+ BindingProvider p = (BindingProvider)proxy;
+ p.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,badEndpoint);
+ proxy.oneWayVoid();
+
+ }catch(WebServiceException e) {
+ exception = e;
+ }catch(Exception e) {
+ fail("This testcase should only produce a WebServiceException. We got: " + e.toString());
+ }
+
+ System.out.println("----------------------------------");
+
+ assertNotNull(exception);
+ assertTrue(exception.getCause() instanceof UnknownHostException);
+ assertEquals(exception.getMessage(), host);
+
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org