blob: 7a0a74896638b88f7a961e7ff68b57a6e1e49b09 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.processor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.camel.Body;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.processor.aggregate.AggregationStrategy;
public class ComposedMessageProcessorTest extends ContextTestSupport {
@SuppressWarnings("unchecked")
public void testValidatingCorrectOrder() throws Exception {
MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
resultEndpoint.expectedMessageCount(1);
resultEndpoint.expectedHeaderReceived("orderId", "myorderid");
List<OrderItem> order = Arrays.asList(new OrderItem[] {
new OrderItem("widget", 5),
new OrderItem("gadget", 10)});
template.sendBodyAndHeader("direct:start", order, "orderId", "myorderid");
assertMockEndpointsSatisfied();
List<OrderItem> validatedOrder = resultEndpoint.getExchanges().get(0).getIn().getBody(List.class);
assertTrue(validatedOrder.get(0).valid);
assertTrue(validatedOrder.get(1).valid);
}
@SuppressWarnings("unchecked")
public void testValidatingIncorrectOrder() throws Exception {
MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
resultEndpoint.expectedMessageCount(1);
resultEndpoint.expectedHeaderReceived("orderId", "myorderid");
// START SNIPPET: e1
List<OrderItem> order = Arrays.asList(new OrderItem[] {
new OrderItem("widget", 500),
new OrderItem("gadget", 200)});
template.sendBodyAndHeader("direct:start", order, "orderId", "myorderid");
// END SNIPPET: e1
assertMockEndpointsSatisfied();
List<OrderItem> validatedOrder = resultEndpoint.getExchanges().get(0).getIn().getBody(List.class);
assertFalse(validatedOrder.get(0).valid);
assertFalse(validatedOrder.get(1).valid);
}
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry jndi = super.createRegistry();
jndi.bind("orderItemHelper", new OrderItemHelper());
jndi.bind("widgetInventory", new WidgetInventory());
jndi.bind("gadgetInventory", new GadgetInventory());
return jndi;
}
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
// START SNIPPET: e2
// split up the order so individual OrderItems can be validated by the appropriate bean
from("direct:start")
.split().body()
.choice()
.when().method("orderItemHelper", "isWidget")
.to("bean:widgetInventory")
.otherwise()
.to("bean:gadgetInventory")
.end()
.to("seda:aggregate");
// collect and re-assemble the validated OrderItems into an order again
from("seda:aggregate")
.aggregate(new MyOrderAggregationStrategy()).header("orderId").completionTimeout(1000L)
.to("mock:result");
// END SNIPPET: e2
}
};
}
// START SNIPPET: e3
public static final class OrderItem {
String type; // type of the item
int quantity; // how many we want
boolean valid; // whether that many items can be ordered
public OrderItem(String type, int quantity) {
this.type = type;
this.quantity = quantity;
}
}
// END SNIPPET: e3
public static final class OrderItemHelper {
private OrderItemHelper() {
}
// START SNIPPET: e4
public static boolean isWidget(@Body OrderItem orderItem) {
return orderItem.type.equals("widget");
}
// END SNIPPET: e4
}
/**
* Bean that checks whether the specified number of widgets can be ordered
*/
// START SNIPPET: e5
public static final class WidgetInventory {
public void checkInventory(@Body OrderItem orderItem) {
assertEquals("widget", orderItem.type);
if (orderItem.quantity < 10) {
orderItem.valid = true;
}
}
}
// END SNIPPET: e5
/**
* Bean that checks whether the specified number of gadgets can be ordered
*/
// START SNIPPET: e6
public static final class GadgetInventory {
public void checkInventory(@Body OrderItem orderItem) {
assertEquals("gadget", orderItem.type);
if (orderItem.quantity < 20) {
orderItem.valid = true;
}
}
}
// END SNIPPET: e6
/**
* Aggregation strategy that re-assembles the validated OrderItems
* into an order, which is just a List.
*/
// START SNIPPET: e7
public static final class MyOrderAggregationStrategy implements AggregationStrategy {
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
if (oldExchange == null) {
return newExchange;
}
List<OrderItem> order = new ArrayList<OrderItem>(2);
order.add(oldExchange.getIn().getBody(OrderItem.class));
order.add(newExchange.getIn().getBody(OrderItem.class));
oldExchange.getIn().setBody(order);
return oldExchange;
}
}
// END SNIPPET: e7
}