1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.inbound;
12
13 import org.mule.DefaultMuleEvent;
14 import org.mule.DefaultMuleMessage;
15 import org.mule.api.MuleEvent;
16 import org.mule.api.MuleException;
17 import org.mule.api.MuleMessage;
18 import org.mule.api.MuleSession;
19 import org.mule.api.endpoint.ImmutableEndpoint;
20 import org.mule.api.routing.InboundRouterCollection;
21 import org.mule.api.service.Service;
22 import org.mule.routing.AggregationException;
23 import org.mule.routing.EventCorrelatorCallback;
24 import org.mule.routing.LoggingCatchAllStrategy;
25 import org.mule.tck.AbstractMuleTestCase;
26 import org.mule.tck.testmodels.fruit.Apple;
27
28 import java.util.Iterator;
29 import java.util.Map;
30
31 public class EventAggregatorTestCase extends AbstractMuleTestCase
32 {
33
34 public void testMessageAggregator() throws Exception
35 {
36 Service testService = getTestService("test", Apple.class);
37 MuleSession session = getTestSession(testService, muleContext);
38
39 InboundRouterCollection messageRouter = new DefaultInboundRouterCollection();
40 SimpleEventAggregator router = new SimpleEventAggregator(3);
41 messageRouter.addRouter(router);
42 messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
43 router.setMuleContext(muleContext);
44 router.initialise();
45
46 MuleMessage message1 = new DefaultMuleMessage("test event A");
47 MuleMessage message2 = new DefaultMuleMessage("test event B");
48 MuleMessage message3 = new DefaultMuleMessage("test event C");
49 message1.setCorrelationId(message1.getUniqueId());
50 message2.setCorrelationId(message1.getUniqueId());
51 message3.setCorrelationId(message1.getUniqueId());
52
53 ImmutableEndpoint endpoint = getTestOutboundEndpoint("Test1Provider");
54 MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session, false);
55 MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, session, false);
56 MuleEvent event3 = new DefaultMuleEvent(message3, endpoint, session, false);
57 assertTrue(router.isMatch(event1));
58 assertTrue(router.isMatch(event2));
59 assertTrue(router.isMatch(event3));
60
61 assertNull(router.process(event1));
62 assertNull(router.process(event2));
63
64 MuleEvent[] results = router.process(event3);
65 assertNotNull(results);
66 assertEquals(1, results.length);
67 assertEquals("test event A test event B test event C ", results[0].getMessageAsString());
68 }
69
70 public static class SimpleEventAggregator extends AbstractEventAggregator
71 {
72 protected final int eventThreshold;
73 protected int eventCount = 0;
74
75 public SimpleEventAggregator(int eventThreshold)
76 {
77 this.eventThreshold = eventThreshold;
78 }
79
80 protected EventCorrelatorCallback getCorrelatorCallback()
81 {
82 return new EventCorrelatorCallback()
83 {
84 public boolean shouldAggregateEvents(EventGroup events)
85 {
86 eventCount++;
87 if (eventCount == eventThreshold)
88 {
89 eventCount = 0;
90 return true;
91 }
92 return false;
93 }
94
95 public EventGroup createEventGroup(MuleEvent event, Object groupId)
96 {
97 return new EventGroup(groupId, eventThreshold);
98 }
99
100 public MuleMessage aggregateEvents(EventGroup events) throws AggregationException
101 {
102 if (events.size() != eventThreshold)
103 {
104 throw new IllegalStateException("eventThreshold not yet reached?");
105 }
106
107 StringBuffer newPayload = new StringBuffer(80);
108
109 for (Iterator iterator = events.iterator(); iterator.hasNext();)
110 {
111 MuleEvent event = (MuleEvent) iterator.next();
112 try
113 {
114 newPayload.append(event.getMessageAsString()).append(" ");
115 }
116 catch (MuleException e)
117 {
118 throw new AggregationException(events, event.getEndpoint(), e);
119 }
120 }
121
122 return new DefaultMuleMessage(newPayload.toString(), (Map) null);
123 }
124 };
125 }
126 }
127 }