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