View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.routing;
8   
9   import org.mule.DefaultMuleEvent;
10  import org.mule.DefaultMuleMessage;
11  import org.mule.MessageExchangePattern;
12  import org.mule.api.MuleContext;
13  import org.mule.api.MuleEvent;
14  import org.mule.api.MuleException;
15  import org.mule.api.MuleMessage;
16  import org.mule.api.MuleSession;
17  import org.mule.api.endpoint.ImmutableEndpoint;
18  import org.mule.api.service.Service;
19  import org.mule.routing.correlation.CorrelationSequenceComparator;
20  import org.mule.routing.correlation.EventCorrelatorCallback;
21  import org.mule.routing.correlation.ResequenceMessagesCorrelatorCallback;
22  import org.mule.tck.MuleTestUtils;
23  import org.mule.tck.junit4.AbstractMuleContextTestCase;
24  import org.mule.tck.testmodels.fruit.Apple;
25  
26  import java.util.Comparator;
27  
28  import org.junit.Test;
29  
30  import static org.junit.Assert.assertEquals;
31  import static org.junit.Assert.assertNotNull;
32  import static org.junit.Assert.assertNull;
33  
34  public class ResequencerTestCase extends AbstractMuleContextTestCase
35  {
36  
37      public ResequencerTestCase()
38      {
39          setStartContext(true);
40      }
41  
42      @Test
43      public void testMessageResequencer() throws Exception
44      {
45          MuleSession session = getTestSession(getTestService(), muleContext);
46          Service testService = getTestService("test", Apple.class);
47          assertNotNull(testService);
48  
49          TestEventResequencer router = new TestEventResequencer(3);
50          router.setMuleContext(muleContext);
51          router.setFlowConstruct(testService);
52          router.initialise();
53  
54          MuleMessage message1 = new DefaultMuleMessage("test event A", muleContext);
55          MuleMessage message2 = new DefaultMuleMessage("test event B", muleContext);
56          MuleMessage message3 = new DefaultMuleMessage("test event C", muleContext);
57          final String correlationId = message1.getUniqueId();
58          message1.setCorrelationId(correlationId);
59          message2.setCorrelationId(correlationId);
60          message3.setCorrelationId(correlationId);
61  
62          ImmutableEndpoint endpoint = MuleTestUtils.getTestOutboundEndpoint(MessageExchangePattern.ONE_WAY, muleContext);
63          MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session);
64          MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, session);
65          MuleEvent event3 = new DefaultMuleEvent(message3, endpoint, session);
66  
67          assertNull(router.process(event2));
68          assertNull(router.process(event3));
69  
70          MuleEvent resultEvent = router.process(event1);
71          assertNotNull(resultEvent);
72          MuleMessage resultMessage = resultEvent.getMessage();
73          assertNotNull(resultMessage);
74  
75          assertEquals("test event A", resultMessage.getPayloadAsString());
76  
77          // set a resequencing comparator. We need to reset the router since it will not process the same event group
78          //twice
79          router = new TestEventResequencer(3);
80          router.setMuleContext(muleContext);
81          router.setEventComparator(new EventPayloadComparator());
82          router.setFlowConstruct(testService);
83          router.initialise();
84  
85  
86          assertNull(router.process(event2));
87          assertNull(router.process(event3));
88  
89          resultEvent = router.process(event1);
90          assertNotNull(resultEvent);
91          resultMessage = resultEvent.getMessage();
92          assertNotNull(resultMessage);
93  
94          assertEquals("test event C", resultMessage.getPayloadAsString());
95      }
96  
97      public static class TestEventResequencer extends Resequencer
98      {
99          private int eventCount = 0;
100         private int eventthreshold = 1;
101 
102         public TestEventResequencer(int eventthreshold)
103         {
104             super();
105             this.eventthreshold = eventthreshold;
106             this.setEventComparator(new CorrelationSequenceComparator());
107         }
108 
109         @Override
110         protected EventCorrelatorCallback getCorrelatorCallback(MuleContext muleContext)
111         {
112             return new ResequenceMessagesCorrelatorCallback(getEventComparator(), muleContext)
113             {
114                 @Override
115                 public boolean shouldAggregateEvents(EventGroup events)
116                 {
117                     eventCount++;
118                     if (eventCount == eventthreshold)
119                     {
120                         eventCount = 0;
121                         return true;
122                     }
123                     return false;
124                 }
125             };
126         }
127     }
128 
129     public static class EventPayloadComparator implements Comparator
130     {
131         public int compare(Object o1, Object o2)
132         {
133             try
134             {
135                 return ((MuleEvent) o1).getMessageAsString().compareTo(((MuleEvent) o2).getMessageAsString());
136             }
137             catch (MuleException e)
138             {
139                 throw new IllegalArgumentException(e.getMessage());
140             }
141 
142         }
143     }
144 }