1   /*
2    * $Id: EventAggregatorTestCase.java 7963 2007-08-21 08:53:15Z 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.impl.MuleEvent;
14  import org.mule.impl.MuleMessage;
15  import org.mule.routing.AggregationException;
16  import org.mule.routing.LoggingCatchAllStrategy;
17  import org.mule.tck.AbstractMuleTestCase;
18  import org.mule.tck.testmodels.fruit.Apple;
19  import org.mule.umo.UMOComponent;
20  import org.mule.umo.UMOEvent;
21  import org.mule.umo.UMOException;
22  import org.mule.umo.UMOMessage;
23  import org.mule.umo.UMOSession;
24  import org.mule.umo.endpoint.UMOEndpoint;
25  import org.mule.umo.routing.UMOInboundRouterCollection;
26  
27  import java.util.Iterator;
28  import java.util.Map;
29  
30  public class EventAggregatorTestCase extends AbstractMuleTestCase
31  {
32  
33      public void testMessageAggregator() throws Exception
34      {
35          UMOComponent testComponent = getTestComponent(getTestDescriptor("test", Apple.class.getName()));
36          UMOSession session = getTestSession(testComponent);
37  
38          UMOInboundRouterCollection messageRouter = new InboundRouterCollection();
39          SimpleEventAggregator router = new SimpleEventAggregator(3);
40          messageRouter.addRouter(router);
41          messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
42  
43          UMOMessage message1 = new MuleMessage("test event A");
44          UMOMessage message2 = new MuleMessage("test event B");
45          UMOMessage message3 = new MuleMessage("test event C");
46  
47          UMOEndpoint endpoint = getTestEndpoint("Test1Provider", UMOEndpoint.ENDPOINT_TYPE_SENDER);
48          UMOEvent event1 = new MuleEvent(message1, endpoint, session, false);
49          UMOEvent event2 = new MuleEvent(message2, endpoint, session, false);
50          UMOEvent event3 = new MuleEvent(message3, endpoint, session, false);
51          assertTrue(router.isMatch(event1));
52          assertTrue(router.isMatch(event2));
53          assertTrue(router.isMatch(event3));
54  
55          assertNull(router.process(event1));
56          assertNull(router.process(event2));
57  
58          UMOEvent[] results = router.process(event3);
59          assertNotNull(results);
60          assertEquals(1, results.length);
61          assertEquals("test event A test event B test event C ", results[0].getMessageAsString());
62      }
63  
64      public static class SimpleEventAggregator extends AbstractEventAggregator
65      {
66          private final int eventThreshold;
67          private int eventCount = 0;
68  
69          public SimpleEventAggregator(int eventThreshold)
70          {
71              this.eventThreshold = eventThreshold;
72          }
73  
74          protected boolean shouldAggregateEvents(EventGroup events)
75          {
76              eventCount++;
77              if (eventCount == eventThreshold)
78              {
79                  eventCount = 0;
80                  return true;
81              }
82              return false;
83          }
84  
85          protected UMOMessage aggregateEvents(EventGroup events) throws AggregationException
86          {
87              if (events.size() != this.eventThreshold)
88              {
89                  throw new IllegalStateException("eventThreshold not yet reached?");
90              }
91  
92              StringBuffer newPayload = new StringBuffer(80);
93  
94              for (Iterator iterator = events.iterator(); iterator.hasNext();)
95              {
96                  UMOEvent event = (UMOEvent)iterator.next();
97                  try
98                  {
99                      newPayload.append(event.getMessageAsString()).append(" ");
100                 }
101                 catch (UMOException e)
102                 {
103                     throw new AggregationException(events, event.getEndpoint(), e);
104                 }
105             }
106 
107             return new MuleMessage(newPayload.toString(), (Map)null);
108         }
109     }
110 }