001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.camel;
018
019 import java.util.Map;
020 import java.util.Set;
021
022 import javax.activation.DataHandler;
023
024 /**
025 * Implements the <a
026 * href="http://camel.apache.org/message.html">Message</a> pattern and
027 * represents an inbound or outbound message as part of an {@link Exchange}.
028 * <p/>
029 * See {@link org.apache.camel.impl.DefaultMessage DefaultMessage} for how headers
030 * is represented in Camel using a {@link org.apache.camel.util.CaseInsensitiveMap CaseInsensitiveMap}.
031 *
032 * @version
033 */
034 public interface Message {
035
036 /**
037 * Returns the id of the message
038 *
039 * @return the message id
040 */
041 String getMessageId();
042
043 /**
044 * Sets the id of the message
045 *
046 * @param messageId id of the message
047 */
048 void setMessageId(String messageId);
049
050 /**
051 * Returns the exchange this message is related to
052 *
053 * @return the exchange
054 */
055 Exchange getExchange();
056
057 /**
058 * Returns true if this message represents a fault
059 *
060 * @return <tt>true</tt> if this is a fault message, <tt>false</tt> for regular messages.
061 */
062 boolean isFault();
063
064 /**
065 * Sets the fault flag on this message
066 *
067 * @param fault the fault flag
068 */
069 void setFault(boolean fault);
070
071 /**
072 * Accesses a specific header
073 *
074 * @param name name of header
075 * @return the value of the given header or <tt>null</tt> if there is no
076 * header for the given name
077 */
078 Object getHeader(String name);
079
080 /**
081 * Accesses a specific header
082 *
083 * @param name name of header
084 * @param defaultValue the default value to return if header was absent
085 * @return the value of the given header or <tt>defaultValue</tt> if there is no
086 * header for the given name
087 */
088 Object getHeader(String name, Object defaultValue);
089
090 /**
091 * Returns a header associated with this message by name and specifying the
092 * type required
093 *
094 * @param name the name of the header
095 * @param type the type of the header
096 * @return the value of the given header or <tt>null</tt> if there is no header for
097 * the given name or <tt>null</tt> if it cannot be converted to the given type
098 */
099 <T> T getHeader(String name, Class<T> type);
100
101 /**
102 * Returns a header associated with this message by name and specifying the
103 * type required
104 *
105 * @param name the name of the header
106 * @param defaultValue the default value to return if header was absent
107 * @param type the type of the header
108 * @return the value of the given header or <tt>defaultValue</tt> if there is no header for
109 * the given name or <tt>null</tt> if it cannot be converted to the given type
110 */
111 <T> T getHeader(String name, Object defaultValue, Class<T> type);
112
113 /**
114 * Sets a header on the message
115 *
116 * @param name of the header
117 * @param value to associate with the name
118 */
119 void setHeader(String name, Object value);
120
121 /**
122 * Removes the named header from this message
123 *
124 * @param name name of the header
125 * @return the old value of the header
126 */
127 Object removeHeader(String name);
128
129 /**
130 * Removes the headers from this message
131 *
132 * @param pattern pattern of names
133 * @return boolean whether any headers matched
134 */
135 boolean removeHeaders(String pattern);
136
137 /**
138 * Removes the headers from this message that match the given <tt>pattern</tt>,
139 * except for the ones matching one ore more <tt>excludePatterns</tt>
140 *
141 * @param pattern pattern of names that should be removed
142 * @param excludePatterns one or more pattern of header names that should be excluded (= preserved)
143 * @return boolean whether any headers matched
144 */
145 boolean removeHeaders(String pattern, String... excludePatterns);
146
147 /**
148 * Returns all of the headers associated with the message.
149 * <p/>
150 * See {@link org.apache.camel.impl.DefaultMessage DefaultMessage} for how headers
151 * is represented in Camel using a {@link org.apache.camel.util.CaseInsensitiveMap CaseInsensitiveMap}.
152 * <p/>
153 * <b>Important:</b> If you want to walk the returned {@link Map} and fetch all the keys and values, you should use
154 * the {@link java.util.Map#entrySet()} method, which ensure you get the keys in the original case.
155 *
156 * @return all the headers in a Map
157 */
158 Map<String, Object> getHeaders();
159
160 /**
161 * Set all the headers associated with this message
162 *
163 * @param headers headers to set
164 */
165 void setHeaders(Map<String, Object> headers);
166
167 /**
168 * Returns whether has any headers has been set.
169 *
170 * @return <tt>true</tt> if any headers has been set
171 */
172 boolean hasHeaders();
173
174 /**
175 * Returns the body of the message as a POJO
176 * <p/>
177 * The body can be <tt>null</tt> if no body is set
178 *
179 * @return the body, can be <tt>null</tt>
180 */
181 Object getBody();
182
183 /**
184 * Returns the body of the message as a POJO
185 *
186 * @return the body, is never <tt>null</tt>
187 * @throws InvalidPayloadException Is thrown if the body being <tt>null</tt> or wrong class type
188 */
189 Object getMandatoryBody() throws InvalidPayloadException;
190
191 /**
192 * Returns the body as the specified type
193 *
194 * @param type the type that the body
195 * @return the body of the message as the specified type, or <tt>null</tt> if not possible to convert
196 */
197 <T> T getBody(Class<T> type);
198
199 /**
200 * Returns the mandatory body as the specified type
201 *
202 * @param type the type that the body
203 * @return the body of the message as the specified type, is never <tt>null</tt>.
204 * @throws InvalidPayloadException Is thrown if the body being <tt>null</tt> or wrong class type
205 */
206 <T> T getMandatoryBody(Class<T> type) throws InvalidPayloadException;
207
208 /**
209 * Sets the body of the message
210 *
211 * @param body the body
212 */
213 void setBody(Object body);
214
215 /**
216 * Sets the body of the message as a specific type
217 *
218 * @param body the body
219 * @param type the type of the body
220 */
221 <T> void setBody(Object body, Class<T> type);
222
223 /**
224 * Creates a copy of this message so that it can be used and possibly
225 * modified further in another exchange
226 *
227 * @return a new message instance copied from this message
228 */
229 Message copy();
230
231 /**
232 * Copies the contents of the other message into this message
233 *
234 * @param message the other message
235 */
236 void copyFrom(Message message);
237
238 /**
239 * Returns the attachment specified by the id
240 *
241 * @param id the id under which the attachment is stored
242 * @return the data handler for this attachment or <tt>null</tt>
243 */
244 DataHandler getAttachment(String id);
245
246 /**
247 * Returns a set of attachment names of the message
248 *
249 * @return a set of attachment names
250 */
251 Set<String> getAttachmentNames();
252
253 /**
254 * Removes the attachment specified by the id
255 *
256 * @param id the id of the attachment to remove
257 */
258 void removeAttachment(String id);
259
260 /**
261 * Adds an attachment to the message using the id
262 *
263 * @param id the id to store the attachment under
264 * @param content the data handler for the attachment
265 */
266 void addAttachment(String id, DataHandler content);
267
268 /**
269 * Returns all attachments of the message
270 *
271 * @return the attachments in a map or <tt>null</tt>
272 */
273 Map<String, DataHandler> getAttachments();
274
275 /**
276 * Set all the attachments associated with this message
277 *
278 * @param attachments the attachments
279 */
280 void setAttachments(Map<String, DataHandler> attachments);
281
282 /**
283 * Returns whether this message has attachments.
284 *
285 * @return <tt>true</tt> if this message has any attachments.
286 */
287 boolean hasAttachments();
288
289 /**
290 * Returns the unique ID for a message exchange if this message is capable
291 * of creating one or <tt>null</tt> if not
292 *
293 * @return the created exchange id, or <tt>null</tt> if not capable of creating
294 */
295 String createExchangeId();
296 }