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