1   /*
2    * $Id: EventResequencerTestCase.java 7963 2007-08-21 08:53:15Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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          // set a resequencing comparator
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 }