1 | package com.hammurapi.eventbus.tests.fastfood; |
2 | |
3 | import java.util.Collection; |
4 | import java.util.Collections; |
5 | import java.util.HashSet; |
6 | import java.util.concurrent.atomic.AtomicInteger; |
7 | |
8 | import com.hammurapi.eventbus.Handler; |
9 | import com.hammurapi.eventbus.local.LocalEventDispatchJoinContext; |
10 | |
11 | /** |
12 | * Handler which fulfills orders. |
13 | * @author Pavel Vlasov |
14 | * |
15 | */ |
16 | public class OrderFulfiller { |
17 | |
18 | private AtomicInteger failureCounter = new AtomicInteger(); |
19 | |
20 | @Handler("java(*)://order.getMainDishType().equals(mainDish.getClass())") |
21 | public void matchMainDish(LocalEventDispatchJoinContext<Object, Integer, Object> ctx, Order order, MainDish mainDish) { |
22 | if (order.setMainDish(mainDish)) { |
23 | ctx.consume(mainDish); |
24 | if (order.isFulfilled()) { |
25 | ctx.consume(order); |
26 | fulfilledOrders.add(order); |
27 | } else { |
28 | ctx.consumeJoin(order); |
29 | } |
30 | } else { |
31 | failureCounter.incrementAndGet(); |
32 | } |
33 | } |
34 | |
35 | @Handler("java(*)://order.getSideDishType().equals(sideDish.getClass())") |
36 | public void matchSideDish(LocalEventDispatchJoinContext<Object, Integer, Object> ctx, Order order, SideDish sideDish) { |
37 | if (order.setSideDish(sideDish)) { |
38 | ctx.consume(sideDish); |
39 | if (order.isFulfilled()) { |
40 | ctx.consume(order); |
41 | fulfilledOrders.add(order); |
42 | } else { |
43 | ctx.consumeJoin(order); |
44 | } |
45 | } else { |
46 | failureCounter.incrementAndGet(); |
47 | } |
48 | } |
49 | |
50 | public boolean isOK() { |
51 | return failureCounter.get()==0; |
52 | } |
53 | |
54 | private Collection<Order> fulfilledOrders = Collections.synchronizedCollection(new HashSet<Order>()); |
55 | |
56 | public Collection<Order> getFulfilledOrders() { |
57 | return fulfilledOrders; |
58 | } |
59 | |
60 | } |