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