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.EventCorrelatorCallback;
20  import org.mule.tck.MuleTestUtils;
21  import org.mule.tck.junit4.AbstractMuleContextTestCase;
22  import org.mule.tck.testmodels.fruit.Apple;
23  
24  import java.util.Iterator;
25  
26  import org.junit.Test;
27  
28  import static org.junit.Assert.assertEquals;
29  import static org.junit.Assert.assertNotNull;
30  import static org.junit.Assert.assertNull;
31  
32  public class AggregatorTestCase extends AbstractMuleContextTestCase
33  {
34  
35      public AggregatorTestCase()
36      {
37          setStartContext(true);
38      }
39  
40      @Test
41      public void testMessageAggregator() throws Exception
42      {
43          Service testService = getTestService("test", Apple.class);
44          MuleSession session = getTestSession(testService, muleContext);
45  
46          TestEventAggregator router = new TestEventAggregator(3);
47          router.setMuleContext(muleContext);
48          router.setFlowConstruct(testService);
49          router.initialise();
50          MuleMessage message1 = new DefaultMuleMessage("test event A", muleContext);
51          MuleMessage message2 = new DefaultMuleMessage("test event B", muleContext);
52          MuleMessage message3 = new DefaultMuleMessage("test event C", muleContext);
53          message1.setCorrelationId(message1.getUniqueId());
54          message2.setCorrelationId(message1.getUniqueId());
55          message3.setCorrelationId(message1.getUniqueId());
56  
57          ImmutableEndpoint endpoint = MuleTestUtils.getTestOutboundEndpoint(MessageExchangePattern.ONE_WAY, muleContext);
58          MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session);
59          MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, session);
60          MuleEvent event3 = new DefaultMuleEvent(message3, endpoint, session);
61  
62          assertNull(router.process(event1));
63          assertNull(router.process(event2));
64  
65          MuleEvent result = router.process(event3);
66          assertNotNull(result);
67          assertEquals("test event A test event B test event C ", result.getMessageAsString());
68      }
69  
70      public static class TestEventAggregator extends AbstractAggregator
71      {
72          protected final int eventThreshold;
73          protected int eventCount = 0;
74  
75          public TestEventAggregator(int eventThreshold)
76          {
77              this.eventThreshold = eventThreshold;
78          }
79  
80          @Override
81          protected EventCorrelatorCallback getCorrelatorCallback(final MuleContext muleContext)
82          {
83              return new EventCorrelatorCallback()
84              {
85                  public boolean shouldAggregateEvents(EventGroup events)
86                  {
87                      eventCount++;
88                      if (eventCount == eventThreshold)
89                      {
90                          eventCount = 0;
91                          return true;
92                      }
93                      return false;
94                  }
95  
96                  public EventGroup createEventGroup(MuleEvent event, Object groupId)
97                  {
98                      return new EventGroup(groupId, eventThreshold);
99                  }
100 
101                 public MuleEvent aggregateEvents(EventGroup events) throws AggregationException
102                 {
103                     if (events.size() != eventThreshold)
104                     {
105                         throw new IllegalStateException("eventThreshold not yet reached?");
106                     }
107 
108                     StringBuffer newPayload = new StringBuffer(80);
109 
110                     for (Iterator iterator = events.iterator(); iterator.hasNext();)
111                     {
112                         MuleEvent event = (MuleEvent) iterator.next();
113                         try
114                         {
115                             newPayload.append(event.getMessageAsString()).append(" ");
116                         }
117                         catch (MuleException e)
118                         {
119                             throw new AggregationException(events, next, e);
120                         }
121                     }
122 
123                     return new DefaultMuleEvent(new DefaultMuleMessage(newPayload.toString(), muleContext),
124                         events.getMessageCollectionEvent());
125                 }
126             };
127         }
128     }
129 }