View Javadoc

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