You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by aj...@apache.org on 2007/03/28 18:46:33 UTC
svn commit: r523406 - in /incubator/cxf/trunk/rt:
core/src/main/java/org/apache/cxf/interceptor/
core/src/main/java/org/apache/cxf/service/factory/
core/src/test/java/org/apache/cxf/interceptor/
frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support...
Author: ajaypaibir
Date: Wed Mar 28 09:46:31 2007
New Revision: 523406
URL: http://svn.apache.org/viewvc?view=rev&rev=523406
Log:
[CXF-500] Defer creation of OutMessage and OutFaultMessage from OutgoingChainSetupInterceptor to ServiceInvokerInterceptor i.e after the inbound message is dispatched to implementor. Setting up of outbound interceptor chain is deferred to POST_INVOKE phase rather than PRE_LOGICAL inbound.Removed OutgoingChainSetupInterceptor from the inbound chain.
Modified:
incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainIntiatorObserver.java
incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/MessageSenderInterceptor.java
incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/OutgoingChainInterceptor.java
incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java
incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/AbstractServiceFactoryBean.java
incubator/cxf/trunk/rt/core/src/test/java/org/apache/cxf/interceptor/OutgoingChainInterceptorTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java
incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/ContextUtils.java
incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java
Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainIntiatorObserver.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainIntiatorObserver.java?view=diff&rev=523406&r1=523405&r2=523406
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainIntiatorObserver.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainIntiatorObserver.java Wed Mar 28 09:46:31 2007
@@ -24,8 +24,8 @@
import java.util.logging.Logger;
import org.apache.cxf.Bus;
-import org.apache.cxf.binding.Binding;
import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
@@ -45,11 +45,12 @@
public void onMessage(Message m) {
Message faultMessage = getFaultMessage(m);
+ Exchange ex = m.getExchange();
if (faultMessage == null) {
- faultMessage = new MessageImpl();
+ Endpoint ep = ex.get(Endpoint.class);
+ faultMessage = ep.getBinding().createMessage();
}
- faultMessage = m.getExchange().get(Binding.class).createMessage(faultMessage);
setFaultMessage(m, faultMessage);
MessageImpl.copyContent(m, faultMessage);
@@ -60,7 +61,7 @@
faultMessage.setInterceptorChain(chain);
try {
chain.doIntercept(faultMessage);
- } catch (Exception ex) {
+ } catch (Exception exc) {
LogUtils.log(LOG, Level.INFO, "Error occured during error handling, give up!", ex);
}
}
Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/MessageSenderInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/MessageSenderInterceptor.java?view=diff&rev=523406&r1=523405&r2=523406
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/MessageSenderInterceptor.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/MessageSenderInterceptor.java Wed Mar 28 09:46:31 2007
@@ -47,7 +47,8 @@
? message.getConduit()
: exchange.getConduit() != null
? exchange.getConduit()
- : exchange.getOutMessage() != null
+ : (exchange.getOutMessage() != null
+ || exchange.getOutFaultMessage() != null)
? OutgoingChainInterceptor.getBackChannelConduit(exchange)
: null;
@@ -69,4 +70,4 @@
throw new Fault(new org.apache.cxf.common.i18n.Message("COULD_NOT_SEND", BUNDLE), ex);
}
}
-}
+}
\ No newline at end of file
Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/OutgoingChainInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/OutgoingChainInterceptor.java?view=diff&rev=523406&r1=523405&r2=523406
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/OutgoingChainInterceptor.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/OutgoingChainInterceptor.java Wed Mar 28 09:46:31 2007
@@ -20,11 +20,18 @@
package org.apache.cxf.interceptor;
import java.io.IOException;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.apache.cxf.Bus;
+import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
+import org.apache.cxf.phase.PhaseInterceptorChain;
+import org.apache.cxf.phase.PhaseManager;
import org.apache.cxf.service.model.BindingMessageInfo;
import org.apache.cxf.service.model.BindingOperationInfo;
import org.apache.cxf.service.model.MessageInfo;
@@ -32,7 +39,7 @@
import org.apache.cxf.ws.addressing.EndpointReferenceType;
public class OutgoingChainInterceptor extends AbstractPhaseInterceptor<Message> {
-
+ private static final Logger LOG = Logger.getLogger(OutgoingChainInterceptor.class.getName());
public OutgoingChainInterceptor() {
super();
setPhase(Phase.POST_INVOKE);
@@ -51,14 +58,19 @@
out.put(MessageInfo.class, bin.getOperationInfo().getOutput());
out.put(BindingMessageInfo.class, bin.getOutput());
}
- out.getInterceptorChain().doIntercept(out);
+
+ InterceptorChain outChain = out.getInterceptorChain();
+ if (outChain == null) {
+ outChain = getOutInterceptorChain(ex);
+ out.setInterceptorChain(outChain);
+ }
+ outChain.doIntercept(out);
}
}
protected static Conduit getBackChannelConduit(Exchange ex) {
Conduit conduit = null;
- if (ex.getOutMessage().getConduit() == null
- && ex.getConduit() == null
+ if (ex.getConduit() == null
&& ex.getDestination() != null) {
try {
EndpointReferenceType target =
@@ -72,4 +84,37 @@
}
return conduit;
}
+
+ public static InterceptorChain getOutInterceptorChain(Exchange ex) {
+ Bus bus = ex.get(Bus.class);
+ PhaseManager pm = bus.getExtension(PhaseManager.class);
+ PhaseInterceptorChain chain = new PhaseInterceptorChain(pm.getOutPhases());
+
+ Endpoint ep = ex.get(Endpoint.class);
+ List<Interceptor> il = ep.getOutInterceptors();
+ if (LOG.isLoggable(Level.FINE)) {
+ LOG.fine("Interceptors contributed by endpoint: " + il);
+ }
+ chain.add(il);
+ il = ep.getService().getOutInterceptors();
+ if (LOG.isLoggable(Level.FINE)) {
+ LOG.fine("Interceptors contributed by service: " + il);
+ }
+ chain.add(il);
+ il = bus.getOutInterceptors();
+ if (LOG.isLoggable(Level.FINE)) {
+ LOG.fine("Interceptors contributed by bus: " + il);
+ }
+ chain.add(il);
+ if (ep.getBinding() != null) {
+ il = ep.getBinding().getOutInterceptors();
+ if (LOG.isLoggable(Level.FINE)) {
+ LOG.fine("Interceptors contributed by binding: " + il);
+ }
+ chain.add(il);
+ }
+ chain.setFaultObserver(ep.getOutFaultObserver());
+ return chain;
+ }
}
+
Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java?view=diff&rev=523406&r1=523405&r2=523406
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java Wed Mar 28 09:46:31 2007
@@ -55,15 +55,24 @@
public void run() {
Object result = invoker.invoke(message.getExchange(), getInvokee(message));
-
- if (result != null) {
- if (result instanceof List) {
- exchange.getOutMessage().setContent(List.class, result);
- } else if (result.getClass().isArray()) {
- result = Arrays.asList((Object[])result);
- exchange.getOutMessage().setContent(List.class, result);
- } else {
- exchange.getOutMessage().setContent(Object.class, result);
+ if (!exchange.isOneWay()) {
+ Endpoint ep = exchange.get(Endpoint.class);
+
+ Message outMessage = message.getExchange().getOutMessage();
+ if (outMessage == null) {
+ outMessage = ep.getBinding().createMessage();
+ exchange.setOutMessage(outMessage);
+ }
+ copyJaxwsProperties(message, outMessage);
+ if (result != null) {
+ if (result instanceof List) {
+ outMessage.setContent(List.class, result);
+ } else if (result.getClass().isArray()) {
+ result = Arrays.asList((Object[])result);
+ outMessage.setContent(List.class, result);
+ } else {
+ outMessage.setContent(Object.class, result);
+ }
}
}
}
@@ -96,4 +105,12 @@
private Executor getExecutor(final Endpoint endpoint) {
return endpoint.getService().getExecutor();
}
+
+ private void copyJaxwsProperties(Message inMsg, Message outMsg) {
+ outMsg.put(Message.WSDL_OPERATION, inMsg.get(Message.WSDL_OPERATION));
+ outMsg.put(Message.WSDL_SERVICE, inMsg.get(Message.WSDL_SERVICE));
+ outMsg.put(Message.WSDL_INTERFACE, inMsg.get(Message.WSDL_INTERFACE));
+ outMsg.put(Message.WSDL_PORT, inMsg.get(Message.WSDL_PORT));
+ outMsg.put(Message.WSDL_DESCRIPTION, inMsg.get(Message.WSDL_DESCRIPTION));
+ }
}
Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/AbstractServiceFactoryBean.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/AbstractServiceFactoryBean.java?view=diff&rev=523406&r1=523405&r2=523406
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/AbstractServiceFactoryBean.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/AbstractServiceFactoryBean.java Wed Mar 28 09:46:31 2007
@@ -22,7 +22,6 @@
import org.apache.cxf.Bus;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.interceptor.OutgoingChainInterceptor;
-import org.apache.cxf.interceptor.OutgoingChainSetupInterceptor;
import org.apache.cxf.interceptor.ServiceInvokerInterceptor;
import org.apache.cxf.service.Service;
@@ -35,9 +34,7 @@
protected void initializeDefaultInterceptors() {
service.getInInterceptors().add(new ServiceInvokerInterceptor());
- service.getInInterceptors().add(new OutgoingChainSetupInterceptor());
service.getInInterceptors().add(new OutgoingChainInterceptor());
- service.getOutFaultInterceptors().add(new OutgoingChainSetupInterceptor());
}
protected void initializeDataBindings() {
Modified: incubator/cxf/trunk/rt/core/src/test/java/org/apache/cxf/interceptor/OutgoingChainInterceptorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/test/java/org/apache/cxf/interceptor/OutgoingChainInterceptorTest.java?view=diff&rev=523406&r1=523405&r2=523406
==============================================================================
--- incubator/cxf/trunk/rt/core/src/test/java/org/apache/cxf/interceptor/OutgoingChainInterceptorTest.java (original)
+++ incubator/cxf/trunk/rt/core/src/test/java/org/apache/cxf/interceptor/OutgoingChainInterceptorTest.java Wed Mar 28 09:46:31 2007
@@ -32,6 +32,7 @@
import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.phase.PhaseManager;
+import org.apache.cxf.phase.PhaseManagerImpl;
import org.apache.cxf.service.Service;
import org.apache.cxf.service.model.BindingMessageInfo;
import org.apache.cxf.service.model.BindingOperationInfo;
@@ -64,9 +65,8 @@
empty = new ArrayList<Interceptor>();
bus = control.createMock(Bus.class);
- PhaseManager pm = control.createMock(PhaseManager.class);
- EasyMock.expect(bus.getExtension(PhaseManager.class)).andReturn(pm);
- EasyMock.expect(pm.getOutPhases()).andReturn(phases);
+ PhaseManager pm = new PhaseManagerImpl();
+ EasyMock.expect(bus.getExtension(PhaseManager.class)).andReturn(pm).anyTimes();
service = control.createMock(Service.class);
endpoint = control.createMock(Endpoint.class);
@@ -75,9 +75,10 @@
MessageImpl m = new MessageImpl();
EasyMock.expect(binding.createMessage()).andStubReturn(m);
- EasyMock.expect(endpoint.getService()).andReturn(service);
+ EasyMock.expect(endpoint.getService()).andReturn(service).anyTimes();
EasyMock.expect(endpoint.getOutInterceptors()).andReturn(empty);
EasyMock.expect(service.getOutInterceptors()).andReturn(empty);
+ EasyMock.expect(bus.getOutInterceptors()).andReturn(empty);
bopInfo = control.createMock(BindingOperationInfo.class);
opInfo = control.createMock(OperationInfo.class);
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java?view=diff&rev=523406&r1=523405&r2=523406
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/ContextPropertiesMapping.java Wed Mar 28 09:46:31 2007
@@ -31,6 +31,7 @@
import javax.xml.ws.handler.MessageContext;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
+import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.jaxws.context.WrappedMessageContext;
import org.apache.cxf.message.Attachment;
import org.apache.cxf.message.Exchange;
@@ -135,26 +136,29 @@
public static MessageContext createWebServiceContext(Exchange exchange) {
MessageContext ctx = new WrappedMessageContext(exchange.getInMessage());
mapCxf2Jaxws(ctx);
+ addMessageAttachments(ctx,
+ exchange.getInMessage(),
+ MessageContext.INBOUND_MESSAGE_ATTACHMENTS);
+
Object requestHeaders =
exchange.getInMessage().get(Message.PROTOCOL_HEADERS);
if (null != requestHeaders) {
ctx.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
- }
-
- addMessageAttachments(ctx,
- exchange.getInMessage(),
- MessageContext.INBOUND_MESSAGE_ATTACHMENTS);
- Message outMessage = exchange.getOutMessage();
- if (null != outMessage) {
+ Message outMessage = exchange.getOutMessage();
+ if (outMessage == null) {
+ Endpoint ep = exchange.get(Endpoint.class);
+ outMessage = ep.getBinding().createMessage();
+ exchange.setOutMessage(outMessage);
+ }
Object responseHeaders =
outMessage.get(Message.PROTOCOL_HEADERS);
if (responseHeaders == null) {
responseHeaders = new HashMap<String, List<String>>();
- outMessage.put(Message.PROTOCOL_HEADERS, responseHeaders);
+ outMessage.put(Message.PROTOCOL_HEADERS, responseHeaders);
}
ctx.put(MessageContext.HTTP_RESPONSE_HEADERS, responseHeaders);
- }
+ }
return ctx;
}
Modified: incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/ContextUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/ContextUtils.java?view=diff&rev=523406&r1=523405&r2=523406
==============================================================================
--- incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/ContextUtils.java (original)
+++ incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/ContextUtils.java Wed Mar 28 09:46:31 2007
@@ -41,7 +41,7 @@
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.InterceptorChain;
-import org.apache.cxf.interceptor.OutgoingChainSetupInterceptor;
+import org.apache.cxf.interceptor.OutgoingChainInterceptor;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.service.model.BindingOperationInfo;
@@ -346,7 +346,7 @@
InterceptorChain chain =
fullResponse != null
? fullResponse.getInterceptorChain()
- : OutgoingChainSetupInterceptor.getOutInterceptorChain(exchange);
+ : OutgoingChainInterceptor.getOutInterceptorChain(exchange);
partialResponse.setInterceptorChain(chain);
exchange.setConduit(backChannel);
@@ -363,6 +363,9 @@
exchange.setConduit(null);
if (fullResponse != null) {
exchange.setOutMessage(fullResponse);
+ } else {
+ fullResponse = endpoint.getBinding().createMessage();
+ exchange.setOutMessage(fullResponse);
}
if (retrieveAsyncPostResponseDispatch(inMessage)) {
@@ -396,7 +399,13 @@
*/
public static void propogateReceivedMAPs(AddressingProperties inMAPs,
Exchange exchange) {
+ if (exchange.getOutMessage() == null) {
+ exchange.setOutMessage(createMessage(exchange));
+ }
propogateReceivedMAPs(inMAPs, exchange.getOutMessage());
+ if (exchange.getOutFaultMessage() == null) {
+ exchange.setOutFaultMessage(createMessage(exchange));
+ }
propogateReceivedMAPs(inMAPs, exchange.getOutFaultMessage());
}
@@ -717,15 +726,20 @@
}
return method;
}
+
+ /**
+ * Create a Binding specific Message.
+ *
+ * @param message the current message
+ * @return the Method from the BindingOperationInfo
+ */
+ private static Message createMessage(Exchange exchange) {
+ Endpoint ep = exchange.get(Endpoint.class);
+ Message msg = null;
+ if (ep != null) {
+ msg = ep.getBinding().createMessage();
+ }
+ return msg;
+ }
+
}
-
-
-
-
-
-
-
-
-
-
-
Modified: incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java?view=diff&rev=523406&r1=523405&r2=523406
==============================================================================
--- incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java (original)
+++ incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java Wed Mar 28 09:46:31 2007
@@ -35,7 +35,6 @@
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.endpoint.Endpoint;
-import org.apache.cxf.interceptor.OutgoingChainSetupInterceptor;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
@@ -83,8 +82,6 @@
public MAPAggregator() {
super();
setPhase(Phase.PRE_LOGICAL);
- // this is necessary so that MAPs can be propagated
- addAfter(OutgoingChainSetupInterceptor.class.getName());
}
/**