View Javadoc

1   /*
2    * $Id: DefaultMessageCollection.java 11481 2008-03-22 19:27:20Z rossmason $
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  package org.mule;
11  
12  import org.mule.api.MuleEvent;
13  import org.mule.api.MuleMessage;
14  import org.mule.api.MuleMessageCollection;
15  import org.mule.api.ThreadSafeAccess;
16  import org.mule.api.transformer.TransformerException;
17  
18  import java.util.ArrayList;
19  import java.util.Iterator;
20  import java.util.List;
21  
22  import edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArrayList;
23  
24  /**
25   * A {@link org.mule.api.MuleMessage} type that manages a collection of MuleMessage Objects.
26   * Typically this type of message is only used when users explicitly want to work with aggregated or re-sequenced
27   * collections of messages.
28   *
29   *  Note that the {@link #getPayload()} for this message will return a {@link java.util.List} of payload objects for
30   * each of the Mule messages stored in this collection.
31   *
32   * Calling {@link #getPayload(Class)} will attempt to transform all payloads and return a {@link java.util.List}.
33   *
34   * The methods {@link #getPayloadAsString()} and {@link #getPayloadAsBytes()} are unsupported, instead users should
35   * call {@link #getPayload(Class)} and pass in the return type <code>byte[].class</code> or <code>String.class</code>.
36   */
37  public class DefaultMessageCollection extends DefaultMuleMessage implements MuleMessageCollection
38  {
39      private List messageList = new CopyOnWriteArrayList();
40  
41      public DefaultMessageCollection()
42      {
43          //This will be a collection of payloads
44          super(new CopyOnWriteArrayList());
45      }
46  
47      /**
48       * Performs a shallow copy
49       * @param msg
50       */
51      public DefaultMessageCollection(DefaultMessageCollection msg)
52      {
53          this();
54          for (int i = 0; i < msg.getMessagesAsArray().length; i++)
55          {
56              addMessage(msg.getMessagesAsArray()[i]);
57          }
58      }
59  
60      public void addMessage(MuleMessage message)
61      {
62          getMessageList().add(message);
63          getPayloadList().add(message.getPayload());
64      }
65  
66      public MuleMessage[] getMessagesAsArray()
67      {
68          List list = getMessageList();
69          MuleMessage[] messages = new MuleMessage[list.size()];
70          messages = (MuleMessage[])list.toArray(messages);
71          return messages;
72      }
73  
74      public Object[] getPayloadsAsArray()
75      {
76          List list = getPayloadList();
77          Object[] payloads = new Object[list.size()];
78          payloads = list.toArray(payloads);
79          return payloads;
80      }
81  
82      public void removedMessage(MuleMessage message)
83      {
84          getMessageList().remove(message);
85          getPayloadList().remove(message.getPayload());
86      }
87  
88      public void addMessage(MuleMessage message, int index)
89      {
90          getMessageList().add(index, message);
91          getPayloadList().add(index, message.getPayload());
92      }
93  
94      public void addMessages(MuleEvent[] events)
95      {
96          for (int i = 0; i < events.length; i++)
97          {
98              MuleEvent event = events[i];
99             addMessage(event.getMessage());
100         }
101     }
102 
103     public void addMessages(List messages)
104     {
105         for (Iterator iterator = messages.iterator(); iterator.hasNext();)
106         {
107             MuleMessage message = (MuleMessage) iterator.next();
108             addMessage(message);
109         }
110     }
111 
112     public void addMessages(MuleMessage[] messages)
113     {
114         for (int i = 0; i < messages.length; i++)
115         {
116             addMessage(messages[i]);
117         }
118     }
119 
120     public MuleMessage getMessage(int index)
121     {
122         return (MuleMessage)getMessageList().get(index);
123     }
124 
125     protected List getMessageList()
126     {
127         return messageList;
128     }
129 
130     protected List getPayloadList()
131     {
132         return (List)getPayload();
133     }
134 
135     /**
136      * Applies the {@link #getPayload(Class)} call to every message in the collection and returns a
137      * {@link java.util.List} of results.
138      *
139      * {@inheritDoc}
140      */
141     //@Override
142     public Object getPayload(Class outputType) throws TransformerException
143     {
144         List results = new ArrayList(getMessageList().size());
145         for (Iterator iterator = getMessageList().iterator(); iterator.hasNext();)
146         {
147             MuleMessage message = (MuleMessage) iterator.next();
148             results.add(message.getPayload(outputType));
149         }
150         return results;
151     }
152 
153     public int size()
154     {
155         return getMessageList().size();
156     }
157 
158     /**
159      * {@inheritDoc}
160      */
161     //@Override
162     public byte[] getPayloadAsBytes() throws Exception
163     {
164         throw new UnsupportedOperationException("getPayloadAsBytes(), use getPayload(byte[].class)");
165     }
166 
167     /**
168      * {@inheritDoc}
169      */
170     //@Override
171     public String getPayloadAsString(String encoding) throws Exception
172     {
173         throw new UnsupportedOperationException("getPayloadAsString(), use getPayload(String[].class)");
174 
175     }
176 
177     /**
178      * We need to overload this if we find we want to make this class available to users, but the copy will be expensive;
179      * @return
180      */
181     public ThreadSafeAccess newThreadCopy()
182     {
183         return new DefaultMessageCollection(this);
184     }
185 }