1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.inbound;
12
13 import org.mule.impl.MuleEvent;
14 import org.mule.impl.MuleMessage;
15 import org.mule.routing.LoggingCatchAllStrategy;
16 import org.mule.tck.AbstractMuleTestCase;
17 import org.mule.tck.MuleTestUtils;
18 import org.mule.tck.testmodels.fruit.Apple;
19 import org.mule.umo.UMOComponent;
20 import org.mule.umo.UMOEvent;
21 import org.mule.umo.UMOException;
22 import org.mule.umo.UMOMessage;
23 import org.mule.umo.UMOSession;
24 import org.mule.umo.endpoint.UMOEndpoint;
25 import org.mule.umo.routing.UMOInboundRouterCollection;
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 UMOComponent testComponent = getTestComponent(getTestDescriptor("test", Apple.class.getName()));
38 assertNotNull(testComponent);
39
40 UMOInboundRouterCollection messageRouter = new InboundRouterCollection();
41 SimpleEventResequencer router = new SimpleEventResequencer(3);
42 messageRouter.addRouter(router);
43 messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
44
45 UMOMessage message1 = new MuleMessage("test event A");
46 UMOMessage message2 = new MuleMessage("test event B");
47 UMOMessage message3 = new MuleMessage("test event C");
48
49 UMOEndpoint endpoint = getTestEndpoint("Test1Provider", UMOEndpoint.ENDPOINT_TYPE_SENDER);
50 UMOEvent event1 = new MuleEvent(message1, endpoint, (UMOSession)session.proxy(), false);
51 UMOEvent event2 = new MuleEvent(message2, endpoint, (UMOSession)session.proxy(), false);
52 UMOEvent event3 = new MuleEvent(message3, endpoint, (UMOSession)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 UMOEvent[] 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 ((UMOEvent)o1).getMessageAsString().compareTo(((UMOEvent)o2).getMessageAsString());
112 }
113 catch (UMOException e)
114 {
115 throw new IllegalArgumentException(e.getMessage());
116 }
117
118 }
119 }
120 }