View Javadoc

1   /*
2    * $Id: ResequencerTestCase.java 22506 2011-07-21 16:30:40Z stephen.fenech $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.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;
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          // set a resequencing comparator. We need to reset the router since it will
86          // not process the same event group
87          // twice
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 }