Author: gnodet
Date: Wed Jan 10 04:03:03 2007
New Revision: 494792
URL: http://svn.apache.org/viewvc?view=rev&rev=494792
Log:
SM-809: Add a way to copy properties using the EIP wire tap when using splitter
/ aggregator with a non well-behaving component
Modified:
incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/main/java/org/apache/servicemix/eip/patterns/WireTap.java
incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml
Modified:
incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/main/java/org/apache/servicemix/eip/patterns/WireTap.java
URL:
http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/main/java/org/apache/servicemix/eip/patterns/WireTap.java?view=diff&rev=494792&r1=494791&r2=494792
==============================================================================
---
incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/main/java/org/apache/servicemix/eip/patterns/WireTap.java
(original)
+++
incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/main/java/org/apache/servicemix/eip/patterns/WireTap.java
Wed Jan 10 04:03:03 2007
@@ -16,6 +16,8 @@
*/
package org.apache.servicemix.eip.patterns;
+import java.util.Iterator;
+
import javax.jbi.management.DeploymentException;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.InOnly;
@@ -65,6 +67,12 @@
* The correlation property used by this component
*/
private String correlation;
+ /**
+ * If copyProperties is <code>true</code>, properties
+ * on the in message will be copied to the out / fault
+ * message before it is sent.
+ */
+ private boolean copyProperties;
/**
* @return Returns the target.
@@ -123,6 +131,20 @@
this.outListener = outListener;
}
+ /**
+ * @return the copyProperties
+ */
+ public boolean isCopyProperties() {
+ return copyProperties;
+ }
+
+ /**
+ * @param copyProperties the copyProperties to set
+ */
+ public void setCopyProperties(boolean copyProperties) {
+ this.copyProperties = copyProperties;
+ }
+
/* (non-Javadoc)
* @see org.apache.servicemix.eip.EIPEndpoint#validate()
*/
@@ -143,16 +165,16 @@
// Create exchange for target
MessageExchange tme =
getExchangeFactory().createExchange(exchange.getPattern());
target.configureTarget(tme, getContext());
- sendSyncToListenerAndTarget(exchange, tme, inListener, "in");
+ sendSyncToListenerAndTarget(exchange, tme, inListener, "in", false);
if (tme.getStatus() == ExchangeStatus.DONE) {
done(exchange);
} else if (tme.getStatus() == ExchangeStatus.ERROR) {
fail(exchange, tme.getError());
} else if (tme.getFault() != null) {
- sendSyncToListenerAndTarget(tme, exchange, faultListener, "fault");
+ sendSyncToListenerAndTarget(tme, exchange, faultListener, "fault",
isCopyProperties());
done(tme);
} else if (tme.getMessage("out") != null) {
- sendSyncToListenerAndTarget(tme, exchange, outListener, "out");
+ sendSyncToListenerAndTarget(tme, exchange, outListener, "out",
isCopyProperties());
done(tme);
} else {
done(tme);
@@ -179,7 +201,7 @@
// Put exchange to store
store.store(exchange.getExchangeId(), exchange);
// Send in to listener and target
- sendToListenerAndTarget(exchange, tme, inListener, "in");
+ sendToListenerAndTarget(exchange, tme, inListener, "in", false);
// Mimic the exchange on the other side and send to needed listener
} else {
String id = (String) exchange.getProperty(correlation);
@@ -204,11 +226,11 @@
// Reproduce faults to the other side and listeners
} else if (exchange.getFault() != null) {
store.store(exchange.getExchangeId(), exchange);
- sendToListenerAndTarget(exchange, org, faultListener, "fault");
+ sendToListenerAndTarget(exchange, org, faultListener, "fault",
isCopyProperties());
// Reproduce answers to the other side
} else if (exchange.getMessage("out") != null) {
store.store(exchange.getExchangeId(), exchange);
- sendToListenerAndTarget(exchange, org, outListener, "out");
+ sendToListenerAndTarget(exchange, org, outListener, "out",
isCopyProperties());
} else {
throw new IllegalStateException("Exchange status is " +
ExchangeStatus.ACTIVE + " but has no Out nor Fault message");
}
@@ -218,7 +240,8 @@
private void sendToListenerAndTarget(MessageExchange source,
MessageExchange dest,
ExchangeTarget listener,
- String message) throws Exception {
+ String message,
+ boolean copyProperties) throws
Exception {
if (listener != null) {
NormalizedMessage msg =
MessageUtil.copy(source.getMessage(message));
InOnly lme = getExchangeFactory().createInOnlyExchange();
@@ -229,9 +252,15 @@
MessageUtil.transferToIn(msg, lme);
send(lme);
MessageUtil.transferTo(msg, dest, message);
+ if (copyProperties) {
+ copyExchangeProperties(dest, "in", message);
+ }
send(dest);
} else {
MessageUtil.transferTo(source, dest, message);
+ if (copyProperties) {
+ copyExchangeProperties(dest, "in", message);
+ }
send(dest);
}
}
@@ -239,7 +268,8 @@
private void sendSyncToListenerAndTarget(MessageExchange source,
MessageExchange dest,
ExchangeTarget listener,
- String message) throws Exception {
+ String message,
+ boolean copyProperties) throws
Exception {
if (listener != null) {
NormalizedMessage msg =
MessageUtil.copy(source.getMessage(message));
InOnly lme = getExchangeFactory().createInOnlyExchange();
@@ -250,10 +280,37 @@
MessageUtil.transferToIn(msg, lme);
sendSync(lme);
MessageUtil.transferTo(msg, dest, message);
+ if (copyProperties) {
+ copyExchangeProperties(dest, "in", message);
+ }
sendSync(dest);
} else {
MessageUtil.transferTo(source, dest, message);
+ if (copyProperties) {
+ copyExchangeProperties(dest, "in", message);
+ }
sendSync(dest);
+ }
+ }
+
+ /**
+ * A utility method to copy properties from the input of the original
+ * exchange to the output of the original exchange.
+ *
+ * @param exchange
+ * @param srcMessage
+ * @param @dstMessage
+ * @throws Exception
+ */
+ private void copyExchangeProperties(MessageExchange exchange, String
srcMessage, String dstMessage) {
+ NormalizedMessage src = exchange.getMessage(srcMessage);
+ NormalizedMessage dst = exchange.getMessage(dstMessage);
+ for (Iterator iter = src.getPropertyNames().iterator();
iter.hasNext();) {
+ String name = (String) iter.next();
+ if (dst.getProperty(name) == null) {
+ Object prop = src.getProperty(name);
+ dst.setProperty(name, prop);
+ }
}
}
Modified:
incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml
URL:
http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml?view=diff&rev=494792&r1=494791&r2=494792
==============================================================================
---
incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml
(original)
+++
incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml
Wed Jan 10 04:03:03 2007
@@ -35,7 +35,7 @@
<eip:component>
<eip:endpoints>
- <!-- main test entry point -->
+ <!-- main test entry point -->
<eip:static-recipient-list service="test:entryPoint"
endpoint="endpoint">
<eip:recipients>
<eip:exchange-target service="test:wireTap" />
@@ -43,13 +43,29 @@
</eip:recipients>
</eip:static-recipient-list>
- <!-- splitter used to test the aggregator -->
+ <!-- splitter used to test the aggregator -->
<eip:xpath-splitter service="test:aggregatorSplitter"
endpoint="endpoint"
xpath="/*/*" namespaceContext="#nsContext">
<eip:target>
- <eip:exchange-target service="test:aggregator" />
+ <eip:exchange-target service="test:pipeline-aggregator" />
</eip:target>
</eip:xpath-splitter>
+
+ <eip:pipeline service="test:pipeline-aggregator"
endpoint="endpoint">
+ <eip:transformer>
+ <eip:exchange-target service="test:wiretap-echo" />
+ </eip:transformer>
+ <eip:target>
+ <eip:exchange-target service="test:aggregator" />
+ </eip:target>
+ </eip:pipeline>
+
+ <eip:wire-tap service="test:wiretap-echo" endpoint="endpoint"
+ copyProperties="true">
+ <eip:target>
+ <eip:exchange-target service="test:echo" />
+ </eip:target>
+ </eip:wire-tap>
<!-- START SNIPPET: split-aggregator -->
<eip:split-aggregator service="test:aggregator"
endpoint="endpoint">
@@ -147,7 +163,9 @@
<sm:activationSpec id="echo" service="test:echo">
<sm:component>
- <bean class="org.apache.servicemix.components.util.EchoComponent"/>
+ <bean class="org.apache.servicemix.components.util.EchoComponent">
+ <property name="copyProperties" value="false" />
+ </bean>
</sm:component>
</sm:activationSpec>