View Javadoc

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