You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by jl...@apache.org on 2007/05/04 22:01:34 UTC
svn commit: r535369 - in /incubator/cxf/trunk:
rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/
rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/
systests/src/test/java/org/apache/cxf/systest/handlers/
Author: jliu
Date: Fri May 4 13:01:34 2007
New Revision: 535369
URL: http://svn.apache.org/viewvc?view=rev&rev=535369
Log:
CXF-632: When protocol handlers' handleMessage returns false, stop the outbound interceptor chain, start the inbound interceptor chain, the request message becomes the response message.
Modified:
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptor.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptor.java?view=diff&rev=535369&r1=535368&r2=535369
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptor.java Fri May 4 13:01:34 2007
@@ -26,6 +26,7 @@
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
+
public abstract class AbstractProtocolHandlerInterceptor<T extends Message>
extends AbstractJAXWSHandlerInterceptor<T> {
@@ -38,7 +39,8 @@
MessageContext context = createProtocolMessageContext(message);
HandlerChainInvoker invoker = getInvoker(message);
invoker.setProtocolMessageContext(context);
- invoker.invokeProtocolHandlers(isRequestor(message), context);
+ invoker.invokeProtocolHandlers(isRequestor(message), context);
+
onCompletion(message);
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java?view=diff&rev=535369&r1=535368&r2=535369
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java Fri May 4 13:01:34 2007
@@ -33,6 +33,7 @@
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
@@ -43,9 +44,13 @@
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.StaxOutInterceptor;
import org.apache.cxf.jaxws.handler.AbstractProtocolHandlerInterceptor;
+import org.apache.cxf.jaxws.handler.HandlerChainInvoker;
import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.phase.Phase;
+import org.apache.cxf.phase.PhaseInterceptorChain;
import org.apache.cxf.staxutils.StaxUtils;
+import org.apache.cxf.transport.MessageObserver;
public class SOAPHandlerInterceptor extends
AbstractProtocolHandlerInterceptor<SoapMessage> implements
@@ -83,55 +88,76 @@
if (getInvoker(message).getProtocolHandlers().isEmpty()) {
return;
}
-
+
if (getInvoker(message).isOutbound()) {
- SOAPMessage saaj = message.getContent(SOAPMessage.class);
+ SOAPMessage saaj = message.getContent(SOAPMessage.class);
if (saaj == null) {
SAAJ_OUT.handleMessage(message);
}
-
- final SOAPHandlerInterceptor handlerInterceptor = this;
- message.getInterceptorChain().add(new AbstractSoapInterceptor() {
+ message.getInterceptorChain().add(new AbstractSoapInterceptor() {
@Override
public String getPhase() {
return Phase.USER_PROTOCOL;
}
public void handleMessage(SoapMessage message) throws Fault {
- handlerInterceptor.invokeSOAPHandlerInterceptors(message);
+ MessageContext context = createProtocolMessageContext(message);
+ HandlerChainInvoker invoker = getInvoker(message);
+ invoker.setProtocolMessageContext(context);
+
+ if (!invoker.invokeProtocolHandlers(isRequestor(message), context)) {
+ message.getInterceptorChain().abort();
+ Message responseMsg = new MessageImpl();
+ message.getExchange().setInMessage(responseMsg);
+
+ MessageObserver observer = (MessageObserver)message.getExchange()
+ .get(MessageObserver.class);
+ responseMsg.put(PhaseInterceptorChain.STARTING_AFTER_INTERCEPTOR_ID,
+ SOAPHandlerInterceptor.class.getName());
+ // The request message becomes the response message
+ if (observer != null) {
+ SOAPMessage soapMessage = ((SOAPMessageContext)context).getMessage();
+
+ if (soapMessage != null) {
+ responseMsg.setContent(SOAPMessage.class, soapMessage);
+ XMLStreamReader xmlReader = createXMLStreamReaderFromSOAPMessage(soapMessage);
+ responseMsg.setContent(XMLStreamReader.class, xmlReader);
+ }
+ observer.onMessage(responseMsg);
+ }
+ }
}
});
} else {
super.handleMessage(message);
SOAPMessage msg = message.getContent(SOAPMessage.class);
if (msg != null) {
- DOMSource bodySource;
- try {
- bodySource = new DOMSource(msg.getSOAPPart().getEnvelope().getBody());
- XMLStreamReader xmlReader = StaxUtils.createXMLStreamReader(bodySource);
- xmlReader.nextTag();
- xmlReader.nextTag(); // move past body tag
- message.setContent(XMLStreamReader.class, xmlReader);
- } catch (SOAPException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (XMLStreamException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
+ XMLStreamReader xmlReader = createXMLStreamReaderFromSOAPMessage(msg);
+ message.setContent(XMLStreamReader.class, xmlReader);
}
}
}
-
- protected void invokeSOAPHandlerInterceptors(SoapMessage message) {
- super.handleMessage(message);
- }
@Override
protected MessageContext createProtocolMessageContext(Message message) {
return new SOAPMessageContextImpl(message);
+ }
+
+ private XMLStreamReader createXMLStreamReaderFromSOAPMessage(SOAPMessage soapMessage) {
+ // responseMsg.setContent(SOAPMessage.class, soapMessage);
+ XMLStreamReader xmlReader = null;
+ try {
+ DOMSource bodySource = new DOMSource(soapMessage.getSOAPPart().getEnvelope().getBody());
+ xmlReader = StaxUtils.createXMLStreamReader(bodySource);
+ xmlReader.nextTag();
+ xmlReader.nextTag(); // move past body tag
+ } catch (SOAPException e) {
+ e.printStackTrace();
+ } catch (XMLStreamException e) {
+ e.printStackTrace();
+ }
+ return xmlReader;
}
public void handleFault(SoapMessage message) {
Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java?view=diff&rev=535369&r1=535368&r2=535369
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/HandlerInvocationTest.java Fri May 4 13:01:34 2007
@@ -150,7 +150,6 @@
// the server has encoded into the response the order in
// which the handlers have been invoked, parse it and make
// sure everything is ok
-
// expected order for inbound interceptors
String[] handlerNames = {"soapHandler4", "soapHandler3", "handler2", "handler1", "servant",
"handler1", "handler2", "soapHandler3", "soapHandler4"};
@@ -304,31 +303,53 @@
@Test
public void testSOAPHandlerHandleMessageReturnFalseClientSide() throws Exception {
+ final String clientHandlerMessage = "client side";
TestHandler<LogicalMessageContext> handler1 = new TestHandler<LogicalMessageContext>(false);
- TestHandler<LogicalMessageContext> handler2 = new TestHandler<LogicalMessageContext>(false);
+ TestHandler<LogicalMessageContext> handler2 = new TestHandler<LogicalMessageContext>(false) {
+ public boolean handleMessage(LogicalMessageContext ctx) {
+ super.handleMessage(ctx);
+ try {
+ Boolean outbound = (Boolean)ctx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
+ if (outbound) {
+ LogicalMessage msg = ctx.getMessage();
+ assertNotNull("logical message is null", msg);
+ JAXBContext jaxbCtx = JAXBContext.newInstance(PackageUtils
+ .getPackageName(PingOneWay.class));
+ PingResponse resp = new PingResponse();
+ resp.getHandlersInfo().add(clientHandlerMessage);
+
+ msg.setPayload(resp, jaxbCtx);
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.toString());
+ }
+ return true;
+ }
+ };
TestSOAPHandler soapHandler1 = new TestSOAPHandler(false);
TestSOAPHandler soapHandler2 = new TestSOAPHandler<SOAPMessageContext>(false) {
public boolean handleMessage(SOAPMessageContext ctx) {
super.handleMessage(ctx);
+
return false;
}
};
addHandlersToChain((BindingProvider)handlerTest, handler1, handler2, soapHandler1, soapHandler2);
- handlerTest.ping();
- //List<String> resp = handlerTest.ping();
- // assertEquals(clientHandlerMessage, resp.get(0));
+ List<String> resp = handlerTest.ping();
+ assertEquals(clientHandlerMessage, resp.get(0));
- assertEquals(2, handler1.getHandleMessageInvoked());
- assertEquals(2, handler2.getHandleMessageInvoked());
+ assertEquals(3, handler1.getHandleMessageInvoked());
+ assertEquals(3, handler2.getHandleMessageInvoked());
assertEquals(2, soapHandler1.getHandleMessageInvoked());
- //FIXME: CXF-632:
- //assertEquals(1, soapHandler2.getHandleMessageInvoked());
+ assertEquals(1, soapHandler2.getHandleMessageInvoked());
}
@Test
@Ignore
- public void testLogicalHandlerHandlerFault() {
+ public void testLogicalHandlerHandlerFaultServerSide() {
TestHandler<LogicalMessageContext> handler1 = new TestHandler<LogicalMessageContext>(false);
TestHandler<LogicalMessageContext> handler2 = new TestHandler<LogicalMessageContext>(false);