View Javadoc

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