View Javadoc

1   /*
2    * $Id: MessageChunkAggregator.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 org.mule.DefaultMuleEvent;
14  import org.mule.DefaultMuleMessage;
15  import org.mule.api.MuleContext;
16  import org.mule.api.MuleEvent;
17  import org.mule.api.MuleMessage;
18  import org.mule.api.store.ObjectStoreException;
19  import org.mule.routing.correlation.CollectionCorrelatorCallback;
20  import org.mule.routing.correlation.CorrelationSequenceComparator;
21  import org.mule.routing.correlation.EventCorrelatorCallback;
22  import org.mule.util.SerializationUtils;
23  
24  import java.util.Arrays;
25  import java.util.Comparator;
26  
27  import org.apache.commons.io.IOUtils;
28  import org.apache.commons.io.output.ByteArrayOutputStream;
29  import org.apache.commons.lang.SerializationException;
30  
31  public class MessageChunkAggregator extends AbstractAggregator
32  {
33      public static final int DEFAULT_BUFFER_SIZE = 4096;
34  
35      protected Comparator eventComparator;
36  
37      public MessageChunkAggregator()
38      {
39          super();
40          eventComparator = new CorrelationSequenceComparator();
41      }
42  
43      @Override
44      protected EventCorrelatorCallback getCorrelatorCallback(MuleContext muleContext)
45      {
46          return new CollectionCorrelatorCallback(muleContext, persistentStores, storePrefix)
47          {
48              /**
49               * This method is invoked if the shouldAggregate method is called and
50               * returns true. Once this method returns an aggregated message the event
51               * group is removed from the router
52               * 
53               * @param events the event group for this request
54               * @return an aggregated message
55               * @throws org.mule.routing.AggregationException if the aggregation
56               *             fails. in this scenario the whole event group is removed
57               *             and passed to the exception handler for this componenet
58               */
59              @Override
60              public MuleEvent aggregateEvents(EventGroup events) throws AggregationException
61              {
62                  MuleEvent[] collectedEvents;
63                  try
64                  {
65                      collectedEvents = events.toArray();
66                  }
67                  catch (ObjectStoreException e)
68                  {
69                      throw new AggregationException(events, MessageChunkAggregator.this, e);
70                  }
71                  MuleEvent firstEvent = collectedEvents[0];
72                  Arrays.sort(collectedEvents, eventComparator);
73                  ByteArrayOutputStream baos = new ByteArrayOutputStream(DEFAULT_BUFFER_SIZE);
74  
75                  try
76                  {
77                      for (MuleEvent event : collectedEvents)
78                      {
79                          baos.write(event.getMessageAsBytes());
80                      }
81  
82                      MuleMessage message;
83  
84                      // try to deserialize message, since ChunkingRouter might have
85                      // serialized
86                      // the object...
87                      try
88                      {
89                          // must deserialize in correct classloader
90                          final Object deserialized = SerializationUtils.deserialize(baos.toByteArray(),
91                              muleContext);
92                          message = new DefaultMuleMessage(deserialized, firstEvent.getMessage(), muleContext);
93  
94                      }
95                      catch (SerializationException e)
96                      {
97                          message = new DefaultMuleMessage(baos.toByteArray(), firstEvent.getMessage(),
98                              muleContext);
99                      }
100 
101                     message.setCorrelationGroupSize(-1);
102                     message.setCorrelationSequence(-1);
103 
104                     return new DefaultMuleEvent(message, firstEvent);
105                 }
106                 catch (Exception e)
107                 {
108                     throw new AggregationException(events, MessageChunkAggregator.this, e);
109                 }
110                 finally
111                 {
112                     IOUtils.closeQuietly(baos);
113                 }
114             }
115         };
116     }
117 
118 }