1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing;
12
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertNotNull;
15 import static org.junit.Assert.assertNull;
16 import static org.junit.Assert.assertTrue;
17
18 import org.mule.DefaultMuleEvent;
19 import org.mule.DefaultMuleMessage;
20 import org.mule.MessageExchangePattern;
21 import org.mule.api.MuleContext;
22 import org.mule.api.MuleEvent;
23 import org.mule.api.MuleException;
24 import org.mule.api.MuleMessage;
25 import org.mule.api.MuleSession;
26 import org.mule.api.endpoint.InboundEndpoint;
27 import org.mule.api.service.Service;
28 import org.mule.routing.correlation.CorrelationSequenceComparator;
29 import org.mule.routing.correlation.EventCorrelatorCallback;
30 import org.mule.routing.correlation.ResequenceMessagesCorrelatorCallback;
31 import org.mule.tck.MuleTestUtils;
32 import org.mule.tck.junit4.AbstractMuleContextTestCase;
33 import org.mule.tck.testmodels.fruit.Apple;
34
35 import java.util.Comparator;
36
37 import org.junit.Test;
38
39 public class ResequencerTestCase extends AbstractMuleContextTestCase
40 {
41
42 public ResequencerTestCase()
43 {
44 setStartContext(true);
45 }
46
47 @Test
48 public void testMessageResequencer() throws Exception
49 {
50 MuleSession session = getTestSession(getTestService(), muleContext);
51 Service testService = getTestService("test", Apple.class);
52 assertNotNull(testService);
53
54 TestEventResequencer router = new TestEventResequencer(3);
55 router.setMuleContext(muleContext);
56 router.setFlowConstruct(testService);
57 router.initialise();
58
59 MuleMessage message1 = new DefaultMuleMessage("test event A", muleContext);
60 MuleMessage message2 = new DefaultMuleMessage("test event B", muleContext);
61 MuleMessage message3 = new DefaultMuleMessage("test event C", muleContext);
62 final String correlationId = message1.getUniqueId();
63 message1.setCorrelationId(correlationId);
64 message2.setCorrelationId(correlationId);
65 message3.setCorrelationId(correlationId);
66
67 InboundEndpoint endpoint = MuleTestUtils.getTestInboundEndpoint(MessageExchangePattern.ONE_WAY,
68 muleContext);
69 MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session);
70 MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, session);
71 MuleEvent event3 = new DefaultMuleEvent(message3, endpoint, session);
72
73 assertNull(router.process(event2));
74 assertNull(router.process(event3));
75
76 MuleEvent resultEvent = router.process(event1);
77 assertNotNull(resultEvent);
78 MuleMessage resultMessage = resultEvent.getMessage();
79 assertNotNull(resultMessage);
80
81 assertTrue(resultMessage.getPayloadAsString().equals("test event A")
82 || resultMessage.getPayloadAsString().equals("test event B")
83 || resultMessage.getPayloadAsString().equals("test event C"));
84
85
86
87
88 router = new TestEventResequencer(3);
89 router.setMuleContext(muleContext);
90 router.setEventComparator(new EventPayloadComparator());
91 testService.setName("testService2");
92 router.setFlowConstruct(testService);
93 router.initialise();
94
95 assertNull(router.process(event2));
96 assertNull(router.process(event3));
97
98 resultEvent = router.process(event1);
99 assertNotNull(resultEvent);
100 resultMessage = resultEvent.getMessage();
101 assertNotNull(resultMessage);
102
103 assertEquals("test event C", resultMessage.getPayloadAsString());
104 }
105
106 public static class TestEventResequencer extends Resequencer
107 {
108 private int eventCount = 0;
109 private int eventthreshold = 1;
110
111 public TestEventResequencer(int eventthreshold)
112 {
113 super();
114 this.eventthreshold = eventthreshold;
115 this.setEventComparator(new CorrelationSequenceComparator());
116 }
117
118 @Override
119 protected EventCorrelatorCallback getCorrelatorCallback(MuleContext muleContext)
120 {
121 return new ResequenceMessagesCorrelatorCallback(getEventComparator(), muleContext, false,
122 storePrefix)
123 {
124 @Override
125 public boolean shouldAggregateEvents(EventGroup events)
126 {
127 eventCount++;
128 if (eventCount == eventthreshold)
129 {
130 eventCount = 0;
131 return true;
132 }
133 return false;
134 }
135 };
136 }
137 }
138
139 public static class EventPayloadComparator implements Comparator
140 {
141 public int compare(Object o1, Object o2)
142 {
143 try
144 {
145 return ((MuleEvent) o1).getMessageAsString().compareTo(((MuleEvent) o2).getMessageAsString());
146 }
147 catch (MuleException e)
148 {
149 throw new IllegalArgumentException(e.getMessage());
150 }
151
152 }
153 }
154 }