View Javadoc

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