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.LoggingCatchAllStrategy;
23 import org.mule.tck.AbstractMuleTestCase;
24 import org.mule.tck.MuleTestUtils;
25 import org.mule.tck.testmodels.fruit.Apple;
26
27 import com.mockobjects.dynamic.Mock;
28
29 import java.util.Comparator;
30
31 public class EventResequencerTestCase extends AbstractMuleTestCase
32 {
33
34 public void testMessageResequencer() throws Exception
35 {
36 Mock session = MuleTestUtils.getMockSession();
37 Service testService = getTestService("test", Apple.class);
38 assertNotNull(testService);
39
40 InboundRouterCollection messageRouter = new DefaultInboundRouterCollection();
41 SimpleEventResequencer router = new SimpleEventResequencer(3);
42 messageRouter.addRouter(router);
43 messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
44
45 MuleMessage message1 = new DefaultMuleMessage("test event A");
46 MuleMessage message2 = new DefaultMuleMessage("test event B");
47 MuleMessage message3 = new DefaultMuleMessage("test event C");
48
49 ImmutableEndpoint endpoint = getTestOutboundEndpoint("Test1Provider");
50 MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, (MuleSession)session.proxy(), false);
51 MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, (MuleSession)session.proxy(), false);
52 MuleEvent event3 = new DefaultMuleEvent(message3, endpoint, (MuleSession)session.proxy(), false);
53 assertTrue(router.isMatch(event1));
54 assertTrue(router.isMatch(event2));
55 assertTrue(router.isMatch(event3));
56
57 assertNull(router.process(event2));
58 assertNull(router.process(event3));
59
60 MuleEvent[] results = router.process(event1);
61 assertNotNull(results);
62 assertEquals(3, results.length);
63
64 assertEquals("test event B", results[0].getMessageAsString());
65 assertEquals("test event C", results[1].getMessageAsString());
66 assertEquals("test event A", results[2].getMessageAsString());
67
68
69 router.setComparator(new EventPayloadComparator());
70
71 assertNull(router.process(event2));
72 assertNull(router.process(event3));
73
74 results = router.process(event1);
75 assertNotNull(results);
76 assertEquals(3, results.length);
77
78 assertEquals("test event A", results[0].getMessageAsString());
79 assertEquals("test event B", results[1].getMessageAsString());
80 assertEquals("test event C", results[2].getMessageAsString());
81 }
82
83 public static class SimpleEventResequencer extends AbstractEventResequencer
84 {
85 private int eventCount = 0;
86 private int eventthreshold = 1;
87
88 public SimpleEventResequencer(int eventthreshold)
89 {
90 this.eventthreshold = eventthreshold;
91 }
92
93 protected boolean shouldResequenceEvents(EventGroup events)
94 {
95 eventCount++;
96 if (eventCount == eventthreshold)
97 {
98 eventCount = 0;
99 return true;
100 }
101 return false;
102 }
103 }
104
105 public static class EventPayloadComparator implements Comparator
106 {
107 public int compare(Object o1, Object o2)
108 {
109 try
110 {
111 return ((MuleEvent)o1).getMessageAsString().compareTo(((MuleEvent)o2).getMessageAsString());
112 }
113 catch (MuleException e)
114 {
115 throw new IllegalArgumentException(e.getMessage());
116 }
117
118 }
119 }
120 }