Hi Willem,
Attached is a patch for camel-cxf to copy all of the contents to
the new out message.
An example use case:
A processor which has to decrypt the incoming request to decide
which route should be choosen.
Later in a cxf-interceptor you don't have decrypt the message again,
but use the stored one.
All existing camel-cxf JUnit tests passes successful.
What do you think?
Thanks.
Cheers,
Marc
Index: src/main/java/org/apache/camel/component/cxf/CxfProducer.java
===================================================================
--- src/main/java/org/apache/camel/component/cxf/CxfProducer.java (revision 638041)
+++ src/main/java/org/apache/camel/component/cxf/CxfProducer.java (working copy)
@@ -222,7 +222,7 @@
invokingContext = InvokingContextFactory.createContext(dataFormat);
ex.put(InvokingContext.class, invokingContext);
}
- Object params = invokingContext.getRequestContent(inMessage);
+ Map params = invokingContext.getRequestContent(inMessage);
// invoke the stream message with the exchange context
CxfClient cxfClient = (CxfClient) client;
// need to get the binding object to create the message
Index: src/main/java/org/apache/camel/component/cxf/invoker/CxfClient.java
===================================================================
--- src/main/java/org/apache/camel/component/cxf/invoker/CxfClient.java (revision 638041)
+++ src/main/java/org/apache/camel/component/cxf/invoker/CxfClient.java (working copy)
@@ -48,7 +48,7 @@
}
- public Object dispatch(Object params,
+ public Object dispatch(Map params,
Map<String, Object> context,
Exchange exchange) throws Exception {
@@ -82,7 +82,7 @@
@SuppressWarnings("unchecked")
public Object invokeWithMessageStream(BindingOperationInfo bi,
- Object param,
+ Map param,
Map<String, Object> context,
InvokingContext invokingContext) throws Exception {
@@ -182,7 +182,7 @@
private Message prepareMessage(Exchange exchange, Map<String, Object> requestContext,
- Object param, InvokingContext InvokingContext) {
+ Map param, InvokingContext InvokingContext) {
Message message = getEndpoint().getBinding().createMessage();
message.put(Message.REQUESTOR_ROLE, Boolean.TRUE);
Index: src/main/java/org/apache/camel/component/cxf/invoker/PayloadInvokingContext.java
===================================================================
--- src/main/java/org/apache/camel/component/cxf/invoker/PayloadInvokingContext.java (revision 638041)
+++ src/main/java/org/apache/camel/component/cxf/invoker/PayloadInvokingContext.java (working copy)
@@ -18,6 +18,7 @@
import java.util.List;
import java.util.Map;
+import java.util.IdentityHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -34,9 +35,9 @@
}
- public void setRequestOutMessageContent(Message message, Object content) {
+ public void setRequestOutMessageContent(Message message, Map contents) {
- PayloadMessage request = (PayloadMessage) content;
+ PayloadMessage request = (PayloadMessage)contents.get(PayloadMessage.class);
Element header = request.getHeader();
List<Element> payload = request.getPayload();
@@ -92,7 +93,7 @@
}
@SuppressWarnings("unchecked")
- public Object getRequestContent(Message inMessage) {
+ public Map getRequestContent(Message inMessage) {
List<Element> payload = inMessage.get(List.class);
Element header = inMessage.get(Element.class);
@@ -100,7 +101,10 @@
LOG.finest("Header = " + header + ", Payload = " + payload);
}
- return new PayloadMessage(payload, header);
+ Map contents = new IdentityHashMap();
+ contents.put(PayloadMessage.class, new PayloadMessage(payload, header));
+
+ return contents;
}
}
Index: src/main/java/org/apache/camel/component/cxf/invoker/RawMessageInvokingContext.java
===================================================================
--- src/main/java/org/apache/camel/component/cxf/invoker/RawMessageInvokingContext.java (revision 638041)
+++ src/main/java/org/apache/camel/component/cxf/invoker/RawMessageInvokingContext.java (working copy)
@@ -18,6 +18,9 @@
import java.io.InputStream;
import java.util.Map;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.IdentityHashMap;
import java.util.logging.Logger;
import org.apache.cxf.message.Exchange;
@@ -30,8 +33,15 @@
}
- public void setRequestOutMessageContent(Message message, Object content) {
- message.setContent(InputStream.class, content);
+ public void setRequestOutMessageContent(Message message, Map contents) {
+ Set entries = contents.keySet();
+ Iterator iter = entries.iterator();
+ while (iter.hasNext()){
+ Object obj = iter.next();
+ if (obj instanceof Class){
+ message.setContent((Class)obj, contents.get((Class)obj));
+ }
+ }
}
public Object getResponseObject(Exchange exchange, Map<String, Object> responseContext) {
@@ -45,9 +55,20 @@
//loggerTheMessage(outMessage, "Out Message");
}
- public Object getRequestContent(Message inMessage) {
+ public Map getRequestContent(Message inMessage) {
//loggerTheMessage(inMessage, "In Message");
- return inMessage.getContent(InputStream.class);
+
+ IdentityHashMap contents = new IdentityHashMap();
+
+ Set set = inMessage.getContentFormats();
+ Iterator iter = set.iterator();
+ while (iter.hasNext()){
+ Object obj = iter.next();
+ if (obj instanceof Class)
+ contents.put((Class)obj, inMessage.getContent((Class)obj));
+ }
+
+ return contents;
}
}
Index: src/main/java/org/apache/camel/component/cxf/invoker/InvokingContext.java
===================================================================
--- src/main/java/org/apache/camel/component/cxf/invoker/InvokingContext.java (revision 638041)
+++ src/main/java/org/apache/camel/component/cxf/invoker/InvokingContext.java (working copy)
@@ -29,7 +29,7 @@
* It sets the content in the given (out) message object.
* @param content
*/
- void setRequestOutMessageContent(Message message, Object content);
+ void setRequestOutMessageContent(Message message, Map contents);
/**
* This method is call when the CxfClient receives a response from a CXF server and needs
@@ -54,8 +54,8 @@
* the client and needs to extract the request content from the message. It retreives
* and receives the request content from the incoming message.
* @param inMessage
- * @return the request from client
+ * @return the request contents from client
*/
- Object getRequestContent(Message inMessage);
+ Map getRequestContent(Message inMessage);
}