You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2011/04/13 13:47:06 UTC
svn commit: r1091752 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/model/
camel-core/src/main/java/org/apache/camel/processor/
camel-core/src/test/java/org/apache/camel/processor/
components/camel-spring/src/test/java/org/apache/camel/sp...
Author: davsclaus
Date: Wed Apr 13 11:47:06 2011
New Revision: 1091752
URL: http://svn.apache.org/viewvc?rev=1091752&view=rev
Log:
CAMEL-3857: WireTap can now set header directly in DSL when in send new message mode.
Added:
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WireTapNewExchangeTest.java
- copied, changed from r1091660, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WireTapUsingFireAndForgetTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.java
- copied, changed from r1091440, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringWireTapUsingFireAndForgetTest.java
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.xml
- copied, changed from r1091440, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringWireTapUsingFireAndForgetTest.xml
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/WireTapProcessor.java
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java?rev=1091752&r1=1091751&r2=1091752&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java Wed Apr 13 11:47:06 2011
@@ -16,11 +16,14 @@
*/
package org.apache.camel.model;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
@@ -47,11 +50,12 @@ public class WireTapDefinition<Type exte
protected Endpoint endpoint;
@XmlTransient
private Processor newExchangeProcessor;
- // TODO: Should be named newExchangeRef instead of processorRef (Camel 3.0)
@XmlAttribute(name = "processorRef")
private String newExchangeProcessorRef;
@XmlElement(name = "body")
private ExpressionSubElementDefinition newExchangeExpression;
+ @XmlElementRef
+ private List<SetHeaderDefinition> headers = new ArrayList<SetHeaderDefinition>();
@XmlTransient
private ExecutorService executorService;
@XmlAttribute
@@ -88,10 +92,18 @@ public class WireTapDefinition<Type exte
if (newExchangeProcessorRef != null) {
newExchangeProcessor = routeContext.lookup(newExchangeProcessorRef, Processor.class);
}
- answer.setNewExchangeProcessor(newExchangeProcessor);
+ if (newExchangeProcessor != null) {
+ answer.addNewExchangeProcessor(newExchangeProcessor);
+ }
if (newExchangeExpression != null) {
answer.setNewExchangeExpression(newExchangeExpression.createExpression(routeContext));
}
+ if (headers != null && !headers.isEmpty()) {
+ for (SetHeaderDefinition header : headers) {
+ Processor processor = header.createProcessor(routeContext);
+ answer.addNewExchangeProcessor(processor);
+ }
+ }
if (onPrepareRef != null) {
onPrepare = CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(), onPrepareRef, Processor.class);
}
@@ -180,12 +192,21 @@ public class WireTapDefinition<Type exte
}
/**
+ * @deprecated use newExchangeBody
+ */
+ @Deprecated
+ public WireTapDefinition<Type> newExchange(Expression expression) {
+ return newExchangeBody(expression);
+ }
+
+ /**
* Sends a <i>new</i> Exchange, instead of tapping an existing, using {@link ExchangePattern#InOnly}
*
* @param expression expression that creates the new body to send
* @return the builder
+ * @see #newExchangeHeader(String, org.apache.camel.Expression)
*/
- public WireTapDefinition<Type> newExchange(Expression expression) {
+ public WireTapDefinition<Type> newExchangeBody(Expression expression) {
setNewExchangeExpression(expression);
return this;
}
@@ -193,8 +214,21 @@ public class WireTapDefinition<Type exte
/**
* Sends a <i>new</i> Exchange, instead of tapping an existing, using {@link ExchangePattern#InOnly}
*
+ * @param ref reference to the {@link Processor} to lookup in the {@link org.apache.camel.spi.Registry} to
+ * be used for preparing the new exchange to send
+ * @return the builder
+ */
+ public WireTapDefinition<Type> newExchangeRef(String ref) {
+ setNewExchangeProcessorRef(ref);
+ return this;
+ }
+
+ /**
+ * Sends a <i>new</i> Exchange, instead of tapping an existing, using {@link ExchangePattern#InOnly}
+ *
* @param processor processor preparing the new exchange to send
* @return the builder
+ * @see #newExchangeHeader(String, org.apache.camel.Expression)
*/
public WireTapDefinition<Type> newExchange(Processor processor) {
setNewExchangeProcessor(processor);
@@ -202,14 +236,17 @@ public class WireTapDefinition<Type exte
}
/**
- * Sends a <i>new</i> Exchange, instead of tapping an existing, using {@link ExchangePattern#InOnly}
+ * Sets a header on the <i>new</i> Exchange, instead of tapping an existing, using {@link ExchangePattern#InOnly}.
+ * <p/>
+ * Use this together with the {@link #newExchange(org.apache.camel.Expression)} or {@link #newExchange(org.apache.camel.Processor)}
+ * methods.
*
- * @param ref reference to the processor to lookup in the {@link org.apache.camel.spi.Registry} to
- * be used for preparing the new exchange to send
+ * @param headerName the header name
+ * @param expression the expression setting the header value
* @return the builder
*/
- public WireTapDefinition<Type> newExchangeRef(String ref) {
- setNewExchangeProcessorRef(ref);
+ public WireTapDefinition<Type> newExchangeHeader(String headerName, Expression expression) {
+ headers.add(new SetHeaderDefinition(headerName, expression));
return this;
}
@@ -335,4 +372,12 @@ public class WireTapDefinition<Type exte
public void setOnPrepare(Processor onPrepare) {
this.onPrepare = onPrepare;
}
+
+ public List<SetHeaderDefinition> getHeaders() {
+ return headers;
+ }
+
+ public void setHeaders(List<SetHeaderDefinition> headers) {
+ this.headers = headers;
+ }
}
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/WireTapProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/WireTapProcessor.java?rev=1091752&r1=1091751&r2=1091752&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/WireTapProcessor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/WireTapProcessor.java Wed Apr 13 11:47:06 2011
@@ -16,6 +16,8 @@
*/
package org.apache.camel.processor;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
@@ -42,7 +44,7 @@ public class WireTapProcessor extends Se
// expression or processor used for populating a new exchange to send
// as opposed to traditional wiretap that sends a copy of the original exchange
private Expression newExchangeExpression;
- private Processor newExchangeProcessor;
+ private List<Processor> newExchangeProcessors;
private boolean copy;
private Processor onPrepare;
@@ -132,25 +134,29 @@ public class WireTapProcessor extends Se
answer.setProperty(Exchange.TO_ENDPOINT, destination.getEndpointUri());
// prepare the exchange
- if (newExchangeProcessor != null) {
- try {
- newExchangeProcessor.process(answer);
- } catch (Exception e) {
- throw ObjectHelper.wrapRuntimeCamelException(e);
- }
- } else if (newExchangeExpression != null) {
+ if (newExchangeExpression != null) {
Object body = newExchangeExpression.evaluate(answer, Object.class);
if (body != null) {
answer.getIn().setBody(body);
}
}
+ if (newExchangeProcessors != null) {
+ for (Processor processor : newExchangeProcessors) {
+ try {
+ processor.process(answer);
+ } catch (Exception e) {
+ throw ObjectHelper.wrapRuntimeCamelException(e);
+ }
+ }
+ }
+
// invoke on prepare on the exchange if specified
if (onPrepare != null) {
try {
onPrepare.process(exchange);
} catch (Exception e) {
- exchange.setException(e);
+ throw ObjectHelper.wrapRuntimeCamelException(e);
}
}
@@ -169,12 +175,12 @@ public class WireTapProcessor extends Se
return new DefaultExchange(exchange.getFromEndpoint(), ExchangePattern.InOnly);
}
- public Processor getNewExchangeProcessor() {
- return newExchangeProcessor;
+ public List<Processor> getNewExchangeProcessors() {
+ return newExchangeProcessors;
}
- public void setNewExchangeProcessor(Processor newExchangeProcessor) {
- this.newExchangeProcessor = newExchangeProcessor;
+ public void setNewExchangeProcessors(List<Processor> newExchangeProcessors) {
+ this.newExchangeProcessors = newExchangeProcessors;
}
public Expression getNewExchangeExpression() {
@@ -185,6 +191,13 @@ public class WireTapProcessor extends Se
this.newExchangeExpression = newExchangeExpression;
}
+ public void addNewExchangeProcessor(Processor processor) {
+ if (newExchangeProcessors == null) {
+ newExchangeProcessors = new ArrayList<Processor>();
+ }
+ newExchangeProcessors.add(processor);
+ }
+
public boolean isCopy() {
return copy;
}
@@ -200,4 +213,5 @@ public class WireTapProcessor extends Se
public void setOnPrepare(Processor onPrepare) {
this.onPrepare = onPrepare;
}
+
}
Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WireTapNewExchangeTest.java (from r1091660, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WireTapUsingFireAndForgetTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WireTapNewExchangeTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WireTapNewExchangeTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WireTapUsingFireAndForgetTest.java&r1=1091660&r2=1091752&rev=1091752&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WireTapUsingFireAndForgetTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WireTapNewExchangeTest.java Wed Apr 13 11:47:06 2011
@@ -16,96 +16,56 @@
*/
package org.apache.camel.processor;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
import org.apache.camel.ContextTestSupport;
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
/**
* @version
*/
-public class WireTapUsingFireAndForgetTest extends ContextTestSupport {
-
- @Override
- public boolean isUseRouteBuilder() {
- return false;
- }
-
- public void testFireAndForgetUsingProcessor() throws Exception {
- context.addRoutes(new RouteBuilder() {
- @Override
- public void configure() throws Exception {
- // START SNIPPET: e1
- from("direct:start")
- .wireTap("direct:foo", false, new Processor() {
- public void process(Exchange exchange) throws Exception {
- exchange.getIn().setBody("Bye World");
- exchange.getIn().setHeader("foo", "bar");
- }
- }).to("mock:result");
-
-
- from("direct:foo").to("mock:foo");
- // END SNIPPET: e1
- }
- });
- context.start();
+public class WireTapNewExchangeTest extends ContextTestSupport {
+ public void testFireAndForgetUsingExpressions() throws Exception {
MockEndpoint result = getMockEndpoint("mock:result");
result.expectedBodiesReceived("Hello World");
- MockEndpoint foo = getMockEndpoint("mock:foo");
- foo.expectedBodiesReceived("Bye World");
- foo.expectedHeaderReceived("foo", "bar");
+ MockEndpoint tap = getMockEndpoint("mock:tap");
+ tap.expectedBodiesReceived("Bye World");
+ tap.expectedHeaderReceived("id", 123);
+ String today = new SimpleDateFormat("yyyyMMdd").format(new Date());
+ tap.expectedHeaderReceived("date", today);
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
-
- // should be different exchange instances
- Exchange e1 = result.getReceivedExchanges().get(0);
- Exchange e2 = foo.getReceivedExchanges().get(0);
- assertNotSame("Should not be same Exchange", e1, e2);
-
- // should have same from endpoint
- assertEquals("direct://start", e1.getFromEndpoint().getEndpointUri());
- assertEquals("direct://start", e2.getFromEndpoint().getEndpointUri());
}
- public void testFireAndForgetUsingExpression() throws Exception {
- context.addRoutes(new RouteBuilder() {
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
@Override
public void configure() throws Exception {
- // START SNIPPET: e2
+ // START SNIPPET: e1
from("direct:start")
- .wireTap("direct:foo", false, constant("Bye World"))
+ // tap a new message and send it to direct:tap
+ // the new message should be Bye World with 2 headers
+ .wireTap("direct:tap")
+ // create the new tap message body and headers
+ .newExchangeBody(constant("Bye World"))
+ .newExchangeHeader("id", constant(123))
+ .newExchangeHeader("date", simple("${date:now:yyyyMMdd}"))
+ .end()
+ // here we continue routing the original messages
.to("mock:result");
- from("direct:foo").to("mock:foo");
- // END SNIPPET: e2
+ // this is the tapped route
+ from("direct:tap")
+ .to("mock:tap");
+ // END SNIPPET: e1
}
- });
- context.start();
-
- MockEndpoint result = getMockEndpoint("mock:result");
- result.expectedBodiesReceived("Hello World");
-
- MockEndpoint foo = getMockEndpoint("mock:foo");
- foo.expectedBodiesReceived("Bye World");
-
- template.sendBody("direct:start", "Hello World");
-
- assertMockEndpointsSatisfied();
-
- // should be different exchange instances
- Exchange e1 = result.getReceivedExchanges().get(0);
- Exchange e2 = foo.getReceivedExchanges().get(0);
- assertNotSame("Should not be same Exchange", e1, e2);
-
- // should have same from endpoint
- assertEquals("direct://start", e1.getFromEndpoint().getEndpointUri());
- assertEquals("direct://start", e2.getFromEndpoint().getEndpointUri());
+ };
}
-
}
Copied: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.java (from r1091440, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringWireTapUsingFireAndForgetTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringWireTapUsingFireAndForgetTest.java&r1=1091440&r2=1091752&rev=1091752&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringWireTapUsingFireAndForgetTest.java (original)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.java Wed Apr 13 11:47:06 2011
@@ -17,71 +17,15 @@
package org.apache.camel.spring.processor;
import org.apache.camel.CamelContext;
-import org.apache.camel.ContextTestSupport;
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.processor.WireTapNewExchangeTest;
+
import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
-public class SpringWireTapUsingFireAndForgetTest extends ContextTestSupport {
+public class SpringWireTapNewExchangeTest extends WireTapNewExchangeTest {
protected CamelContext createCamelContext() throws Exception {
- return createSpringCamelContext(this, "org/apache/camel/spring/processor/SpringWireTapUsingFireAndForgetTest.xml");
- }
-
- public void testFireAndForgetUsingExpression() throws Exception {
- MockEndpoint result = getMockEndpoint("mock:result");
- result.expectedBodiesReceived("Hello World");
-
- MockEndpoint foo = getMockEndpoint("mock:foo");
- foo.expectedBodiesReceived("Bye World");
-
- template.sendBody("direct:start", "Hello World");
-
- assertMockEndpointsSatisfied();
-
- // should be different exchange instances
- Exchange e1 = result.getReceivedExchanges().get(0);
- Exchange e2 = foo.getReceivedExchanges().get(0);
- assertNotSame("Should not be same Exchange", e1, e2);
-
- // should have same from endpoint
- assertEquals("direct://start", e1.getFromEndpoint().getEndpointUri());
- assertEquals("direct://start", e2.getFromEndpoint().getEndpointUri());
- }
-
- public void testFireAndForgetUsingProcessor() throws Exception {
- MockEndpoint result = getMockEndpoint("mock:result");
- result.expectedBodiesReceived("Hello World");
-
- MockEndpoint foo = getMockEndpoint("mock:foo");
- foo.expectedBodiesReceived("Bye World");
- foo.expectedHeaderReceived("foo", "bar");
-
- template.sendBody("direct:start2", "Hello World");
-
- assertMockEndpointsSatisfied();
-
- // should be different exchange instances
- Exchange e1 = result.getReceivedExchanges().get(0);
- Exchange e2 = foo.getReceivedExchanges().get(0);
- assertNotSame("Should not be same Exchange", e1, e2);
-
- // should have same from endpoint
- assertEquals("direct://start2", e1.getFromEndpoint().getEndpointUri());
- assertEquals("direct://start2", e2.getFromEndpoint().getEndpointUri());
+ return createSpringCamelContext(this, "org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.xml");
}
- // START SNIPPET: e1
- public static class MyProcessor implements Processor {
-
- public void process(Exchange exchange) throws Exception {
- // here we prepare the new exchange by setting the payload on the exchange
- // on the IN message.
- exchange.getIn().setBody("Bye World");
- exchange.getIn().setHeader("foo", "bar");
- }
- }
- // END SNIPPET: e1
+}
-}
\ No newline at end of file
Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.xml (from r1091440, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringWireTapUsingFireAndForgetTest.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringWireTapUsingFireAndForgetTest.xml&r1=1091440&r2=1091752&rev=1091752&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringWireTapUsingFireAndForgetTest.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringWireTapNewExchangeTest.xml Wed Apr 13 11:47:06 2011
@@ -22,33 +22,29 @@
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
">
-
<camelContext xmlns="http://camel.apache.org/schema/spring">
<!-- START SNIPPET: e1 -->
<route>
<from uri="direct:start"/>
- <wireTap uri="direct:foo">
+ <!-- tap a new message and send it to direct:tap -->
+ <!-- the new message should be Bye World with 2 headers -->
+ <wireTap uri="direct:tap">
+ <!-- create the new tap message body and headers -->
<body><constant>Bye World</constant></body>
+ <setHeader headerName="id"><constant>123</constant></setHeader>
+ <setHeader headerName="date"><simple>${date:now:yyyyMMdd}</simple></setHeader>
</wireTap>
+ <!-- here we continue routing the original message -->
<to uri="mock:result"/>
</route>
<!-- END SNIPPET: e1 -->
- <!-- START SNIPPET: e2 -->
- <route>
- <from uri="direct:start2"/>
- <wireTap uri="direct:foo" processorRef="myProcessor"/>
- <to uri="mock:result"/>
- </route>
- <!-- END SNIPPET: e2 -->
-
+ <!-- this is the tapped route -->
<route>
- <from uri="direct:foo"/>
- <to uri="mock:foo"/>
+ <from uri="direct:tap"/>
+ <to uri="mock:tap"/>
</route>
</camelContext>
- <bean id="myProcessor" class="org.apache.camel.spring.processor.SpringWireTapUsingFireAndForgetTest$MyProcessor"/>
-
</beans>