1   /*
2    * $Id: EventAggregatorTestCase.java 11567 2008-04-11 13:08:05Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.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.inbound;
12  
13  import org.mule.DefaultMuleEvent;
14  import org.mule.DefaultMuleMessage;
15  import org.mule.api.MuleEvent;
16  import org.mule.api.MuleException;
17  import org.mule.api.MuleMessage;
18  import org.mule.api.MuleSession;
19  import org.mule.api.endpoint.ImmutableEndpoint;
20  import org.mule.api.routing.InboundRouterCollection;
21  import org.mule.api.service.Service;
22  import org.mule.routing.AggregationException;
23  import org.mule.routing.EventCorrelatorCallback;
24  import org.mule.routing.LoggingCatchAllStrategy;
25  import org.mule.tck.AbstractMuleTestCase;
26  import org.mule.tck.testmodels.fruit.Apple;
27  
28  import java.util.Iterator;
29  import java.util.Map;
30  
31  public class EventAggregatorTestCase extends AbstractMuleTestCase
32  {
33  
34      public void testMessageAggregator() throws Exception
35      {
36          Service testService = getTestService("test", Apple.class);
37          MuleSession session = getTestSession(testService, muleContext);
38  
39          InboundRouterCollection messageRouter = new DefaultInboundRouterCollection();
40          SimpleEventAggregator router = new SimpleEventAggregator(3);
41          messageRouter.addRouter(router);
42          messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
43          router.setMuleContext(muleContext);
44          router.initialise();
45  
46          MuleMessage message1 = new DefaultMuleMessage("test event A");
47          MuleMessage message2 = new DefaultMuleMessage("test event B");
48          MuleMessage message3 = new DefaultMuleMessage("test event C");
49          message1.setCorrelationId(message1.getUniqueId());
50          message2.setCorrelationId(message1.getUniqueId());
51          message3.setCorrelationId(message1.getUniqueId());
52  
53          ImmutableEndpoint endpoint = getTestOutboundEndpoint("Test1Provider");
54          MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session, false);
55          MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, session, false);
56          MuleEvent event3 = new DefaultMuleEvent(message3, endpoint, session, false);
57          assertTrue(router.isMatch(event1));
58          assertTrue(router.isMatch(event2));
59          assertTrue(router.isMatch(event3));
60  
61          assertNull(router.process(event1));
62          assertNull(router.process(event2));
63  
64          MuleEvent[] results = router.process(event3);
65          assertNotNull(results);
66          assertEquals(1, results.length);
67          assertEquals("test event A test event B test event C ", results[0].getMessageAsString());
68      }
69  
70      public static class SimpleEventAggregator extends AbstractEventAggregator
71      {
72          protected final int eventThreshold;
73          protected int eventCount = 0;
74  
75          public SimpleEventAggregator(int eventThreshold)
76          {
77              this.eventThreshold = eventThreshold;
78          }
79  
80          protected EventCorrelatorCallback getCorrelatorCallback()
81          {
82              return new EventCorrelatorCallback()
83              {
84                  public boolean shouldAggregateEvents(EventGroup events)
85                  {
86                      eventCount++;
87                      if (eventCount == eventThreshold)
88                      {
89                          eventCount = 0;
90                          return true;
91                      }
92                      return false;
93                  }
94  
95                  public EventGroup createEventGroup(MuleEvent event, Object groupId)
96                  {
97                      return new EventGroup(groupId, eventThreshold);
98                  }
99  
100                 public MuleMessage aggregateEvents(EventGroup events) throws AggregationException
101                 {
102                     if (events.size() != eventThreshold)
103                     {
104                         throw new IllegalStateException("eventThreshold not yet reached?");
105                     }
106 
107                     StringBuffer newPayload = new StringBuffer(80);
108 
109                     for (Iterator iterator = events.iterator(); iterator.hasNext();)
110                     {
111                         MuleEvent event = (MuleEvent) iterator.next();
112                         try
113                         {
114                             newPayload.append(event.getMessageAsString()).append(" ");
115                         }
116                         catch (MuleException e)
117                         {
118                             throw new AggregationException(events, event.getEndpoint(), e);
119                         }
120                     }
121 
122                     return new DefaultMuleMessage(newPayload.toString(), (Map) null);
123                 }
124             };
125         }
126     }
127 }