You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2006/03/28 12:46:57 UTC

svn commit: r389472 - in /incubator/servicemix/trunk: servicemix-http/src/main/java/org/apache/servicemix/http/processors/ servicemix-http/src/test/java/org/apache/servicemix/http/ servicemix-http/src/test/resources/org/apache/servicemix/http/ servicem...

Author: gnodet
Date: Tue Mar 28 02:46:44 2006
New Revision: 389472

URL: http://svn.apache.org/viewcvs?rev=389472&view=rev
Log:
SM-370: wsa:MessageID is not implemented for WS-Addressing

Added:
    incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingHandler.java
      - copied, changed from r387168, incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingInHandler.java
Removed:
    incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingInHandler.java
Modified:
    incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ConsumerProcessor.java
    incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpAddressingTest.java
    incubator/servicemix/trunk/servicemix-http/src/test/resources/org/apache/servicemix/http/addressing-request.xml
    incubator/servicemix/trunk/servicemix-jms/src/main/java/org/apache/servicemix/jms/MultiplexingConsumerProcessor.java
    incubator/servicemix/trunk/servicemix-soap/project.xml
    incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Context.java
    incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Handler.java
    incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapHelper.java
    incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AbstractHandler.java

Modified: incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ConsumerProcessor.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ConsumerProcessor.java?rev=389472&r1=389471&r2=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ConsumerProcessor.java (original)
+++ incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ConsumerProcessor.java Tue Mar 28 02:46:44 2006
@@ -39,10 +39,10 @@
 import org.apache.servicemix.http.HttpLifeCycle;
 import org.apache.servicemix.http.HttpProcessor;
 import org.apache.servicemix.http.ServerManager;
+import org.apache.servicemix.soap.Context;
 import org.apache.servicemix.soap.SoapFault;
 import org.apache.servicemix.soap.SoapHelper;
-import org.apache.servicemix.soap.handlers.AddressingInHandler;
-import org.apache.servicemix.soap.marshalers.JBIMarshaler;
+import org.apache.servicemix.soap.handlers.AddressingHandler;
 import org.apache.servicemix.soap.marshalers.SoapMarshaler;
 import org.apache.servicemix.soap.marshalers.SoapMessage;
 import org.apache.servicemix.soap.marshalers.SoapWriter;
@@ -64,7 +64,6 @@
     protected ComponentContext context;
     protected DeliveryChannel channel;
     protected SoapMarshaler soapMarshaler;
-    protected JBIMarshaler jbiMarshaler;
     protected SoapHelper soapHelper;
     protected Map locks;
         
@@ -75,8 +74,7 @@
             this.soapMarshaler.setSoapUri(SoapMarshaler.SOAP_11_URI);
         }
         this.soapHelper = new SoapHelper(endpoint);
-        this.soapHelper.addPolicy(new AddressingInHandler());
-        this.jbiMarshaler = new JBIMarshaler();
+        this.soapHelper.addPolicy(new AddressingHandler());
         this.locks = new ConcurrentHashMap();
     }
     
@@ -123,11 +121,12 @@
             try {
                 SoapMessage message = soapMarshaler.createReader().read(request.getInputStream(), 
                                                                         request.getHeader("Content-Type"));
-                exchange = soapHelper.createExchange(message);
+                Context context = soapHelper.createContext(message);
+                request.setAttribute(Context.class.getName(), context);
+                exchange = soapHelper.onReceive(context);
                 NormalizedMessage inMessage = exchange.getMessage("in");
                 inMessage.setProperty(JbiConstants.PROTOCOL_HEADERS, getHeaders(request));
                 locks.put(exchange.getExchangeId(), cont);
-                request.setAttribute(SoapMessage.class.getName(), message);
                 request.setAttribute(MessageExchange.class.getName(), exchange);
                 ((BaseLifeCycle) endpoint.getServiceUnit().getComponent().getLifeCycle()).sendConsumerExchange(exchange, this);
                 // TODO: make this timeout configurable
@@ -165,8 +164,8 @@
                 } else {
                     NormalizedMessage outMsg = exchange.getMessage("out");
                     if (outMsg != null) {
-                        SoapMessage out = new SoapMessage();
-                        jbiMarshaler.fromNMS(out, outMsg);
+                        Context context = (Context) request.getAttribute(Context.class.getName());
+                        SoapMessage out = soapHelper.onReply(context, outMsg);
                         SoapWriter writer = soapMarshaler.createWriter(out);
                         response.setContentType(writer.getContentType());
                         writer.write(response.getOutputStream());
@@ -185,12 +184,8 @@
         } else {
             response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
         }
-        SoapMessage in = (SoapMessage) request.getAttribute(SoapMessage.class.getName());
-        SoapMessage soapFault = new SoapMessage();
-        soapFault.setFault(fault);
-        if (in != null) {
-            soapFault.setEnvelopeName(in.getEnvelopeName());
-        }
+        Context context = (Context) request.getAttribute(Context.class.getName());
+        SoapMessage soapFault = soapHelper.onFault(context, fault);
         SoapWriter writer = soapMarshaler.createWriter(soapFault);
         response.setContentType(writer.getContentType());
         writer.write(response.getOutputStream());

Modified: incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpAddressingTest.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpAddressingTest.java?rev=389472&r1=389471&r2=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpAddressingTest.java (original)
+++ incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpAddressingTest.java Tue Mar 28 02:46:44 2006
@@ -28,6 +28,7 @@
 import org.apache.servicemix.jbi.jaxp.SourceTransformer;
 import org.apache.servicemix.tck.SpringTestSupport;
 import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.w3c.dom.Node;
 import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
 
 public class HttpAddressingTest extends SpringTestSupport {
@@ -50,7 +51,10 @@
                 fail("Received ERROR status");
             }
         } else {
-            logger.info(new SourceTransformer().toString(me.getOutMessage().getContent()));
+            Node node = new SourceTransformer().toDOMNode(me.getOutMessage());
+            logger.info(new SourceTransformer().toString(node));
+            assertEquals("myid", textValueOfXPath(node, "//*[local-name()='RelatesTo']"));
+            assertNotNull(textValueOfXPath(node, "//*[local-name()='MessageID']"));
         }
     }
     

Modified: incubator/servicemix/trunk/servicemix-http/src/test/resources/org/apache/servicemix/http/addressing-request.xml
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-http/src/test/resources/org/apache/servicemix/http/addressing-request.xml?rev=389472&r1=389471&r2=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-http/src/test/resources/org/apache/servicemix/http/addressing-request.xml (original)
+++ incubator/servicemix/trunk/servicemix-http/src/test/resources/org/apache/servicemix/http/addressing-request.xml Tue Mar 28 02:46:44 2006
@@ -1,10 +1,11 @@
 <soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope'
-               xmlns:wsa='http://schemas.xmlsoap.org/ws/2003/03/addressing'
+               xmlns:wsa='http://www.w3.org/2005/08/addressing'
                xmlns:test='http://test'>
   <soap:Header>
+    <wsa:MessageID>myid</wsa:MessageID>
     <wsa:To>http://test/MyConsumerService/myConsumer</wsa:To>
     <wsa:ReplyTo>
-      <wsa:ServiceName>test:MyConsumerService</wsa:ServiceName>
+      <wsa:Address>test:MyConsumerService</wsa:Address>
     </wsa:ReplyTo>
   </soap:Header>
   <soap:Body>

Modified: incubator/servicemix/trunk/servicemix-jms/src/main/java/org/apache/servicemix/jms/MultiplexingConsumerProcessor.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jms/src/main/java/org/apache/servicemix/jms/MultiplexingConsumerProcessor.java?rev=389472&r1=389471&r2=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-jms/src/main/java/org/apache/servicemix/jms/MultiplexingConsumerProcessor.java (original)
+++ incubator/servicemix/trunk/servicemix-jms/src/main/java/org/apache/servicemix/jms/MultiplexingConsumerProcessor.java Tue Mar 28 02:46:44 2006
@@ -39,10 +39,10 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.common.BaseLifeCycle;
+import org.apache.servicemix.soap.Context;
 import org.apache.servicemix.soap.SoapFault;
 import org.apache.servicemix.soap.SoapHelper;
-import org.apache.servicemix.soap.handlers.AddressingInHandler;
-import org.apache.servicemix.soap.marshalers.JBIMarshaler;
+import org.apache.servicemix.soap.handlers.AddressingHandler;
 import org.apache.servicemix.soap.marshalers.SoapMarshaler;
 import org.apache.servicemix.soap.marshalers.SoapMessage;
 import org.apache.servicemix.soap.marshalers.SoapWriter;
@@ -60,7 +60,6 @@
     protected DeliveryChannel channel;
     protected SoapHelper soapHelper;
     protected SoapMarshaler soapMarshaler;
-    protected JBIMarshaler jbiMarshaler;
     
     public MultiplexingConsumerProcessor(JmsEndpoint endpoint) {
         super(endpoint);
@@ -69,8 +68,7 @@
             this.soapMarshaler.setSoapUri(SoapMarshaler.SOAP_11_URI);
         }
         this.soapHelper = new SoapHelper(endpoint);
-        this.soapHelper.addPolicy(new AddressingInHandler());
-        this.jbiMarshaler = new JBIMarshaler();
+        this.soapHelper.addPolicy(new AddressingHandler());
     }
 
     protected void doStart(InitialContext ctx) throws Exception {
@@ -125,10 +123,12 @@
                         }
                         String contentType = message.getStringProperty("Content-Type");
                         SoapMessage soap = soapMarshaler.createReader().read(is, contentType);
-                        MessageExchange exchange = soapHelper.createExchange(soap);
+                        Context context = soapHelper.createContext(soap);
+                        MessageExchange exchange = soapHelper.onReceive(context);
+                        context.setProperty(Message.class.getName(), message);
                         // TODO: copy protocol messages
                         //inMessage.setProperty(JbiConstants.PROTOCOL_HEADERS, getHeaders(message));
-                        pendingMessages.put(exchange.getExchangeId(), message);
+                        pendingMessages.put(exchange.getExchangeId(), context);
                         BaseLifeCycle lf = (BaseLifeCycle) endpoint.getServiceUnit().getComponent().getLifeCycle();
                         lf.sendConsumerExchange(exchange, MultiplexingConsumerProcessor.this);
                     } catch (Throwable e) {
@@ -142,7 +142,8 @@
     }
 
     public void process(MessageExchange exchange) throws Exception {
-        Message message = (Message) pendingMessages.remove(exchange.getExchangeId());
+        Context context = (Context) pendingMessages.remove(exchange.getExchangeId());
+        Message message = (Message) context.getProperty(Message.class.getName());
         MessageProducer producer = null;
         Message response = null;
         try {
@@ -155,13 +156,7 @@
             } else if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
                 if (exchange.getFault() != null) {
                     SoapFault fault = new SoapFault(SoapFault.RECEIVER, null, null, null, exchange.getFault().getContent());
-                    SoapMessage soapFault = new SoapMessage();
-                    soapFault.setFault(fault);
-                    // TODO: retrieve input soap message
-                    SoapMessage in = null;
-                    if (in != null) {
-                        soapFault.setEnvelopeName(in.getEnvelopeName());
-                    }
+                    SoapMessage soapFault = soapHelper.onFault(context, fault);
                     ByteArrayOutputStream baos = new ByteArrayOutputStream();
                     SoapWriter writer = soapMarshaler.createWriter(soapFault);
                     writer.write(baos);
@@ -171,8 +166,7 @@
                 } else {
                     NormalizedMessage outMsg = exchange.getMessage("out");
                     if (outMsg != null) {
-                        SoapMessage out = new SoapMessage();
-                        jbiMarshaler.fromNMS(out, outMsg);
+                        SoapMessage out = soapHelper.onReply(context, outMsg);
                         ByteArrayOutputStream baos = new ByteArrayOutputStream();
                         SoapWriter writer = soapMarshaler.createWriter(out);
                         writer.write(baos);

Modified: incubator/servicemix/trunk/servicemix-soap/project.xml
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-soap/project.xml?rev=389472&r1=389471&r2=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-soap/project.xml (original)
+++ incubator/servicemix/trunk/servicemix-soap/project.xml Tue Mar 28 02:46:44 2006
@@ -85,6 +85,11 @@
         <artifactId>spring</artifactId>
         <version>${spring_version}</version>
       </dependency>
+      <dependency>
+        <groupId>incubator-activemq</groupId>
+        <artifactId>activemq-core</artifactId>
+        <version>${activemq_version}</version>
+      </dependency>
       
     <dependency>
       <groupId>org.apache.geronimo.specs</groupId>

Modified: incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Context.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Context.java?rev=389472&r1=389471&r2=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Context.java (original)
+++ incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Context.java Tue Mar 28 02:46:44 2006
@@ -18,6 +18,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.servicemix.soap.marshalers.SoapMessage;
+
 /**
  * 
  * @author Guillaume Nodet
@@ -26,7 +28,9 @@
  */
 public class Context {
 
-	public static final String SOAP_MESSAGE = "org.apache.servicemix.SoapMessage";
+    public static final String SOAP_IN = "org.apache.servicemix.SoapIn";
+    public static final String SOAP_OUT = "org.apache.servicemix.SoapOut";
+    public static final String SOAP_FAULT = "org.apache.servicemix.SoapFault";
 	public static final String INTERFACE = "org.apache.servicemix.Interface";
 	public static final String OPERATION = "org.apache.servicemix.Operation";
 	public static final String SERVICE = "org.apache.servicemix.Service";
@@ -37,7 +41,31 @@
 	public Context() {
 		this.properties = new HashMap();
 	}
-	
+    
+    public SoapMessage getInMessage() {
+        return (SoapMessage) getProperty(SOAP_IN);
+    }
+    
+    public SoapMessage getOutMessage() {
+        return (SoapMessage) getProperty(SOAP_OUT);
+    }
+    
+    public SoapMessage getFaultMessage() {
+        return (SoapMessage) getProperty(SOAP_FAULT);
+    }
+    
+    public void setInMessage(SoapMessage message) {
+        setProperty(SOAP_IN, message);
+    }
+    
+    public void setOutMessage(SoapMessage message) {
+        setProperty(SOAP_OUT, message);
+    }
+    
+    public void setFaultMessage(SoapMessage message) {
+        setProperty(SOAP_FAULT, message);
+    }
+    
 	public Object getProperty(String name) {
 		return properties.get(name);
 	}

Modified: incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Handler.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Handler.java?rev=389472&r1=389471&r2=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Handler.java (original)
+++ incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/Handler.java Tue Mar 28 02:46:44 2006
@@ -23,8 +23,12 @@
  */
 public interface Handler {
 
-	public void process(Context context) throws Exception;
+	public void onReceive(Context context) throws Exception;
+    
+    public void onReply(Context context) throws Exception;
 	
+    public void onFault(Context context) throws Exception;
+    
 	public void onComplete(Context context);
 	
 	public void onException(Context context, Exception e);

Modified: incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapHelper.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapHelper.java?rev=389472&r1=389471&r2=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapHelper.java (original)
+++ incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapHelper.java Tue Mar 28 02:46:44 2006
@@ -74,34 +74,11 @@
     	policies.add(policy);
     }
 
-	public Context createContext(SoapMessage message) {
-		Context context = new Context();
-		context.setProperty(Context.SOAP_MESSAGE, message);
-        if (message.getBodyName() == null) {
-            context.setProperty(Context.OPERATION, endpoint.getDefaultOperation());
-        } else {
-            context.setProperty(Context.OPERATION, message.getBodyName());
-        }
-        // If no target endpoint / service / interface is defined
-        // we assume we use the same informations has defined on the
-        // external endpoint
-        if (endpoint.getTargetInterfaceName() == null && 
-            endpoint.getTargetService() == null &&
-            endpoint.getTargetEndpoint() == null) {
-    		context.setProperty(Context.INTERFACE, endpoint.getInterfaceName());
-    		context.setProperty(Context.SERVICE, endpoint.getService());
-    		context.setProperty(Context.ENDPOINT, endpoint.getEndpoint());
-        } else {
-            context.setProperty(Context.INTERFACE, endpoint.getTargetInterfaceName());
-            context.setProperty(Context.SERVICE, endpoint.getTargetService());
-            context.setProperty(Context.ENDPOINT, endpoint.getTargetEndpoint());
+	public MessageExchange onReceive(Context context) throws Exception {
+        for (Iterator it = policies.iterator(); it.hasNext();) {
+            Handler policy = (Handler) it.next();
+            policy.onReceive(context);
         }
-		return context;
-	}
-	
-	public MessageExchange createExchange(SoapMessage message) throws Exception {
-		Context context = createContext(message);
-		analyzeHeaders(context);
 		URI mep = findMep(context);
 		if (mep == null) {
 			mep = endpoint.getDefaultMep();
@@ -120,19 +97,68 @@
     		}
         }
         NormalizedMessage inMessage = exchange.createMessage();
-        jbiMarshaler.toNMS(inMessage, message);
+        jbiMarshaler.toNMS(inMessage, context.getInMessage());
         exchange.setMessage(inMessage, "in");
         return exchange;
 	}
-	
-    public void analyzeHeaders(Context context) throws Exception {
-    	for (Iterator it = policies.iterator(); it.hasNext();) {
-    		Handler policy = (Handler) it.next();
-    		policy.process(context);
-    	}
+    
+    public SoapMessage onReply(Context context, NormalizedMessage outMsg) throws Exception {
+        SoapMessage out = new SoapMessage();
+        if (context.getInMessage() != null) {
+            out.setEnvelopeName(context.getInMessage().getEnvelopeName());
+        }
+        jbiMarshaler.fromNMS(out, outMsg);
+        context.setOutMessage(out);
+        for (Iterator it = policies.iterator(); it.hasNext();) {
+            Handler policy = (Handler) it.next();
+            policy.onReply(context);
+        }
+        return out;
     }
-	
-    public MessageExchange createExchange(URI mep) throws MessagingException {
+    
+    public SoapMessage onFault(Context context, SoapFault fault) throws Exception {
+        SoapMessage soapFault = new SoapMessage();
+        soapFault.setFault(fault);
+        if (context == null) {
+            context = new Context();
+        }
+        if (context.getInMessage() != null) {
+            soapFault.setEnvelopeName(context.getInMessage().getEnvelopeName());
+        }
+        context.setFaultMessage(soapFault);
+        for (Iterator it = policies.iterator(); it.hasNext();) {
+            Handler policy = (Handler) it.next();
+            policy.onFault(context);
+        }
+        return soapFault;
+    }
+    
+    public Context createContext(SoapMessage message) {
+        Context context = new Context();
+        context.setInMessage(message);
+        if (message.getBodyName() == null) {
+            context.setProperty(Context.OPERATION, endpoint.getDefaultOperation());
+        } else {
+            context.setProperty(Context.OPERATION, message.getBodyName());
+        }
+        // If no target endpoint / service / interface is defined
+        // we assume we use the same informations has defined on the
+        // external endpoint
+        if (endpoint.getTargetInterfaceName() == null && 
+            endpoint.getTargetService() == null &&
+            endpoint.getTargetEndpoint() == null) {
+            context.setProperty(Context.INTERFACE, endpoint.getInterfaceName());
+            context.setProperty(Context.SERVICE, endpoint.getService());
+            context.setProperty(Context.ENDPOINT, endpoint.getEndpoint());
+        } else {
+            context.setProperty(Context.INTERFACE, endpoint.getTargetInterfaceName());
+            context.setProperty(Context.SERVICE, endpoint.getTargetService());
+            context.setProperty(Context.ENDPOINT, endpoint.getTargetEndpoint());
+        }
+        return context;
+    }
+    
+    protected MessageExchange createExchange(URI mep) throws MessagingException {
         ComponentContext context = endpoint.getServiceUnit().getComponent().getComponentContext();
         DeliveryChannel channel = context.getDeliveryChannel();
         MessageExchangeFactory factory = channel.createExchangeFactory();
@@ -140,7 +166,7 @@
         return exchange;
     }
     
-    public URI findMep(Context context) throws Exception {
+    protected URI findMep(Context context) throws Exception {
 		QName interfaceName = (QName) context.getProperty(Context.INTERFACE);
 		QName serviceName = (QName) context.getProperty(Context.SERVICE);
 		QName operationName = (QName) context.getProperty(Context.OPERATION);

Modified: incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AbstractHandler.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AbstractHandler.java?rev=389472&r1=389471&r2=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AbstractHandler.java (original)
+++ incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AbstractHandler.java Tue Mar 28 02:46:44 2006
@@ -24,7 +24,16 @@
  * @version $Revision: 1.5 $
  * @since 3.0
  */
-public abstract class AbstractHandler implements Handler {
+public class AbstractHandler implements Handler {
+
+    public void onReceive(Context context) throws Exception {
+    }
+
+    public void onReply(Context context) throws Exception {
+    }
+
+    public void onFault(Context context) throws Exception {
+    }
 
 	public void onComplete(Context context) {
 	}

Copied: incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingHandler.java (from r387168, incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingInHandler.java)
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingHandler.java?p2=incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingHandler.java&p1=incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingInHandler.java&r1=387168&r2=389472&rev=389472&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingInHandler.java (original)
+++ incubator/servicemix/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/handlers/AddressingHandler.java Tue Mar 28 02:46:44 2006
@@ -20,10 +20,13 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.activemq.util.IdGenerator;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
 import org.apache.servicemix.jbi.util.DOMUtil;
 import org.apache.servicemix.soap.Context;
 import org.apache.servicemix.soap.SoapFault;
 import org.apache.servicemix.soap.marshalers.SoapMessage;
+import org.w3c.dom.Document;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 
@@ -33,12 +36,14 @@
  * @version $Revision: 1.5 $
  * @since 3.0
  */
-public class AddressingInHandler extends AbstractHandler {
+public class AddressingHandler extends AbstractHandler {
 
     public static final String WSA_NAMESPACE_200303 = "http://schemas.xmlsoap.org/ws/2003/03/addressing";
     public static final String WSA_NAMESPACE_200408 = "http://schemas.xmlsoap.org/ws/2004/08/addressing";
     public static final String WSA_NAMESPACE_200508 = "http://www.w3.org/2005/08/addressing";
     
+    public static final String WSA_PREFIX = "wsa";
+    
     public static final String EL_ACTION = "Action";
     public static final String EL_ADDRESS = "Address";
     public static final String EL_FAULT_TO = "FaultTo";
@@ -50,8 +55,11 @@
     public static final String EL_REPLY_TO = "ReplyTo";
     public static final String EL_TO = "To";
     
-	public void process(Context context) throws Exception {
-		SoapMessage message = (SoapMessage) context.getProperty(Context.SOAP_MESSAGE);
+    protected final SourceTransformer sourceTransformer = new SourceTransformer();
+    protected final IdGenerator idGenerator = new IdGenerator();
+    
+	public void onReceive(Context context) throws Exception {
+		SoapMessage message = context.getInMessage();
     	String action = null;
     	String to = null;
     	String nsUri = null;
@@ -68,15 +76,13 @@
 	    			} else if (!nsUri.equals(qname.getNamespaceURI())) {
 	    				throw new SoapFault(SoapFault.SENDER, "Inconsistent use of wsa namespaces");
 	    			}
-		    		if (qname.getLocalPart().equals(AddressingInHandler.EL_ACTION)) {
-		    			Element el = (Element) ((DocumentFragment) value).getFirstChild();
-		    			action = DOMUtil.getElementText(el);
+		    		if (EL_ACTION.equals(qname.getLocalPart())) {
+		    			action = getHeaderText(value);
 		        		String[] parts = split(action);
 		        		context.setProperty(Context.INTERFACE, new QName(parts[0], parts[1]));
 		        		context.setProperty(Context.OPERATION, new QName(parts[0], parts[2]));
-		    		} else if (qname.getLocalPart().equals(AddressingInHandler.EL_TO)) {
-		    			Element el = (Element) ((DocumentFragment) value).getFirstChild();
-		    			to = DOMUtil.getElementText(el);
+		    		} else if (EL_TO.equals(qname.getLocalPart())) {
+                        to = getHeaderText(value);
 		        		String[] parts = split(to);
 		        		context.setProperty(Context.SERVICE, new QName(parts[0], parts[1]));
 		        		context.setProperty(Context.ENDPOINT, parts[2]);
@@ -87,6 +93,48 @@
 	    	}
     	}
 	}
+    
+    public void onReply(Context context) throws Exception {
+        SoapMessage in = context.getInMessage();
+        SoapMessage out = context.getOutMessage();
+        Map headers = in.getHeaders();
+        if (headers != null) {
+            for (Iterator it = headers.keySet().iterator(); it.hasNext();) {
+                QName qname = (QName) it.next();
+                Object value = headers.get(qname);
+                if (WSA_NAMESPACE_200303.equals(qname.getNamespaceURI()) ||
+                    WSA_NAMESPACE_200408.equals(qname.getNamespaceURI()) ||
+                    WSA_NAMESPACE_200508.equals(qname.getNamespaceURI())) {
+                    if (EL_MESSAGE_ID.equals(qname.getLocalPart())) {
+                        QName name = new QName(qname.getNamespaceURI(), EL_MESSAGE_ID, qname.getPrefix() != null ? qname.getPrefix() : WSA_PREFIX);
+                        DocumentFragment df = createHeader(name, idGenerator.generateSanitizedId());
+                        out.addHeader(name, df);
+                        name = new QName(qname.getNamespaceURI(), EL_RELATES_TO, qname.getPrefix() != null ? qname.getPrefix() : WSA_PREFIX);
+                        df = createHeader(name, getHeaderText(value));
+                        out.addHeader(name, df);
+                    }
+                }
+            }
+        }
+    }
+    
+    public void onFault(Context context) throws Exception {
+        
+    }
+    
+    protected String getHeaderText(Object header) {
+        Element el = (Element) ((DocumentFragment) header).getFirstChild();
+        return DOMUtil.getElementText(el);
+    }
+    
+    protected DocumentFragment createHeader(QName name, String value) throws Exception {
+        Document doc = new SourceTransformer().createDocument();
+        DocumentFragment df = doc.createDocumentFragment();
+        Element el = doc.createElementNS(name.getNamespaceURI(), name.getPrefix() + ":" + name.getLocalPart());
+        el.appendChild(doc.createTextNode(value));
+        df.appendChild(el);
+        return df;
+    }
     
     protected String[] split(String uri) {
 		char sep;