1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.inbound;
12
13 import org.mule.impl.MuleEvent;
14 import org.mule.impl.MuleMessage;
15 import org.mule.routing.AggregationException;
16 import org.mule.routing.LoggingCatchAllStrategy;
17 import org.mule.tck.AbstractMuleTestCase;
18 import org.mule.tck.testmodels.fruit.Apple;
19 import org.mule.umo.UMOComponent;
20 import org.mule.umo.UMOEvent;
21 import org.mule.umo.UMOException;
22 import org.mule.umo.UMOMessage;
23 import org.mule.umo.UMOSession;
24 import org.mule.umo.endpoint.UMOEndpoint;
25 import org.mule.umo.routing.UMOInboundRouterCollection;
26
27 import java.util.Iterator;
28 import java.util.Map;
29
30 public class EventAggregatorTestCase extends AbstractMuleTestCase
31 {
32
33 public void testMessageAggregator() throws Exception
34 {
35 UMOComponent testComponent = getTestComponent(getTestDescriptor("test", Apple.class.getName()));
36 UMOSession session = getTestSession(testComponent);
37
38 UMOInboundRouterCollection messageRouter = new InboundRouterCollection();
39 SimpleEventAggregator router = new SimpleEventAggregator(3);
40 messageRouter.addRouter(router);
41 messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
42
43 UMOMessage message1 = new MuleMessage("test event A");
44 UMOMessage message2 = new MuleMessage("test event B");
45 UMOMessage message3 = new MuleMessage("test event C");
46
47 UMOEndpoint endpoint = getTestEndpoint("Test1Provider", UMOEndpoint.ENDPOINT_TYPE_SENDER);
48 UMOEvent event1 = new MuleEvent(message1, endpoint, session, false);
49 UMOEvent event2 = new MuleEvent(message2, endpoint, session, false);
50 UMOEvent event3 = new MuleEvent(message3, endpoint, session, false);
51 assertTrue(router.isMatch(event1));
52 assertTrue(router.isMatch(event2));
53 assertTrue(router.isMatch(event3));
54
55 assertNull(router.process(event1));
56 assertNull(router.process(event2));
57
58 UMOEvent[] results = router.process(event3);
59 assertNotNull(results);
60 assertEquals(1, results.length);
61 assertEquals("test event A test event B test event C ", results[0].getMessageAsString());
62 }
63
64 public static class SimpleEventAggregator extends AbstractEventAggregator
65 {
66 private final int eventThreshold;
67 private int eventCount = 0;
68
69 public SimpleEventAggregator(int eventThreshold)
70 {
71 this.eventThreshold = eventThreshold;
72 }
73
74 protected boolean shouldAggregateEvents(EventGroup events)
75 {
76 eventCount++;
77 if (eventCount == eventThreshold)
78 {
79 eventCount = 0;
80 return true;
81 }
82 return false;
83 }
84
85 protected UMOMessage aggregateEvents(EventGroup events) throws AggregationException
86 {
87 if (events.size() != this.eventThreshold)
88 {
89 throw new IllegalStateException("eventThreshold not yet reached?");
90 }
91
92 StringBuffer newPayload = new StringBuffer(80);
93
94 for (Iterator iterator = events.iterator(); iterator.hasNext();)
95 {
96 UMOEvent event = (UMOEvent)iterator.next();
97 try
98 {
99 newPayload.append(event.getMessageAsString()).append(" ");
100 }
101 catch (UMOException e)
102 {
103 throw new AggregationException(events, event.getEndpoint(), e);
104 }
105 }
106
107 return new MuleMessage(newPayload.toString(), (Map)null);
108 }
109 }
110 }