/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;
import javax.activation.DataHandler;
/**
* Implements the <a
* href="http://camel.apache.org/message.html">Message</a> pattern and
* represents an inbound or outbound message as part of an {@link Exchange}.
* <p/>
* See {@link org.apache.camel.impl.DefaultMessage DefaultMessage} for how headers
* is represented in Camel using a {@link org.apache.camel.util.CaseInsensitiveMap CaseInsensitiveMap}.
*
* @version
*/
public interface Message {
/**
* Returns the id of the message
*
* @return the message id
*/
String getMessageId();
/**
* Sets the id of the message
*
* @param messageId id of the message
*/
void setMessageId(String messageId);
/**
* Returns the exchange this message is related to
*
* @return the exchange
*/
Exchange getExchange();
/**
* Returns true if this message represents a fault
*
* @return <tt>true</tt> if this is a fault message, <tt>false</tt> for regular messages.
*/
boolean isFault();
/**
* Sets the fault flag on this message
*
* @param fault the fault flag
*/
void setFault(boolean fault);
/**
* Accesses a specific header
*
* @param name name of header
* @return the value of the given header or <tt>null</tt> if there is no
* header for the given name
*/
Object getHeader(String name);
/**
* Accesses a specific header
*
* @param name name of header
* @param defaultValue the default value to return if header was absent
* @return the value of the given header or <tt>defaultValue</tt> if there is no
* header for the given name
*/
Object getHeader(String name, Object defaultValue);
/**
* Accesses a specific header
*
* @param name name of header
* @param defaultValueSupplier the default value supplier used to generate the value to return if header was absent
* @return the value of the given header or he value generated by the <tt>defaultValueSupplier</tt> if there is no
* header for the given name
*/
Object getHeader(String name, Supplier<Object> defaultValueSupplier);
/**
* Returns a header associated with this message by name and specifying the
* type required
*
* @param name the name of the header
* @param type the type of the header
* @return the value of the given header or <tt>null</tt> if there is no header for
* the given name
* @throws TypeConversionException is thrown if error during type conversion
*/
<T> T getHeader(String name, Class<T> type);
/**
* Returns a header associated with this message by name and specifying the
* type required
*
* @param name the name of the header
* @param defaultValue the default value to return if header was absent
* @param type the type of the header
* @return the value of the given header or <tt>defaultValue</tt> if there is no header for
* the given name or <tt>null</tt> if it cannot be converted to the given type
*/
<T> T getHeader(String name, Object defaultValue, Class<T> type);
/**
* Returns a header associated with this message by name and specifying the
* type required
*
* @param name the name of the header
* @param defaultValueSupplier the default value supplier used to generate the value to return if header was absent
* @param type the type of the header
* @return the value of the given header or he value generated by the <tt>defaultValueSupplier</tt> if there is no
* header for the given name or <tt>null</tt> if it cannot be converted to the given type
*/
<T> T getHeader(String name, Supplier<Object> defaultValueSupplier, Class<T> type);
/**
* Sets a header on the message
*
* @param name of the header
* @param value to associate with the name
*/
void setHeader(String name, Object value);
/**
* Removes the named header from this message
*
* @param name name of the header
* @return the old value of the header
*/
Object removeHeader(String name);
/**
* Removes the headers from this message
*
* @param pattern pattern of names
* @return boolean whether any headers matched
*/
boolean removeHeaders(String pattern);
/**
* Removes the headers from this message that match the given <tt>pattern</tt>,
* except for the ones matching one or more <tt>excludePatterns</tt>
*
* @param pattern pattern of names that should be removed
* @param excludePatterns one or more pattern of header names that should be excluded (= preserved)
* @return boolean whether any headers matched
*/
boolean removeHeaders(String pattern, String... excludePatterns);
/**
* Returns all of the headers associated with the message.
* <p/>
* See {@link org.apache.camel.impl.DefaultMessage DefaultMessage} for how headers
* is represented in Camel using a {@link org.apache.camel.util.CaseInsensitiveMap CaseInsensitiveMap}.
* <p/>
* <b>Important:</b> If you want to walk the returned {@link Map} and fetch all the keys and values, you should use
* the {@link java.util.Map#entrySet()} method, which ensure you get the keys in the original case.
*
* @return all the headers in a Map
*/
Map<String, Object> getHeaders();
/**
* Set all the headers associated with this message
* <p/>
* <b>Important:</b> If you want to copy headers from another {@link Message} to this {@link Message}, then
* use <tt>getHeaders().putAll(other)</tt> to copy the headers, where <tt>other</tt> is the other headers.
*
* @param headers headers to set
*/
void setHeaders(Map<String, Object> headers);
/**
* Returns whether has any headers has been set.
*
* @return <tt>true</tt> if any headers has been set
*/
boolean hasHeaders();
/**
* Returns the body of the message as a POJO
* <p/>
* The body can be <tt>null</tt> if no body is set.
* <p/>
* Notice if the message body is stream based then calling this method multiple times may lead to the stream not being able to be re-read again.
* You can enable stream caching and call the {@link StreamCache#reset()} method to reset the stream to be able to re-read again (if possible).
* See more details about <a href="http://camel.apache.org/stream-caching.html">stream caching</a>.
*
* @return the body, can be <tt>null</tt>
*/
Object getBody();
/**
* Returns the body of the message as a POJO
* <p/>
* Notice if the message body is stream based then calling this method multiple times may lead to the stream not being able to be re-read again.
* See more details about <a href="http://camel.apache.org/stream-caching.html">stream caching</a>.
*
* @return the body, is never <tt>null</tt>
* @throws InvalidPayloadException Is thrown if the body being <tt>null</tt> or wrong class type
*/
Object getMandatoryBody() throws InvalidPayloadException;
/**
* Returns the body as the specified type
* <p/>
* Notice if the message body is stream based then calling this method multiple times may lead to the stream not being able to be re-read again.
* You can enable stream caching and call the {@link StreamCache#reset()} method to reset the stream to be able to re-read again (if possible).
* See more details about <a href="http://camel.apache.org/stream-caching.html">stream caching</a>.
*
* @param type the type that the body
* @return the body of the message as the specified type, or <tt>null</tt> if no body exists
* @throws TypeConversionException is thrown if error during type conversion
*/
<T> T getBody(Class<T> type);
/**
* Returns the mandatory body as the specified type
* <p/>
* Notice if the message body is stream based then calling this method multiple times may lead to the stream not being able to be re-read again.
* You can enable stream caching and call the {@link StreamCache#reset()} method to reset the stream to be able to re-read again (if possible).
* See more details about <a href="http://camel.apache.org/stream-caching.html">stream caching</a>.
*
* @param type the type that the body
* @return the body of the message as the specified type, is never <tt>null</tt>.
* @throws InvalidPayloadException Is thrown if the body being <tt>null</tt> or wrong class type
*/
<T> T getMandatoryBody(Class<T> type) throws InvalidPayloadException;
/**
* Sets the body of the message
*
* @param body the body
*/
void setBody(Object body);
/**
* Sets the body of the message as a specific type
*
* @param body the body
* @param type the type of the body
*/
<T> void setBody(Object body, Class<T> type);
/**
* Creates a copy of this message so that it can be used and possibly
* modified further in another exchange
*
* @return a new message instance copied from this message
*/
Message copy();
/**
* Copies the contents of the other message into this message
* <p/>
* If you need to do a copy and then set a new body,
* then use {@link #copyFromWithNewBody(Message, Object)} method instead.
*
* @param message the other message
* @see #copyFromWithNewBody(Message, Object)
*/
void copyFrom(Message message);
/**
* Copies the contents (except the body) of the other message into this message and uses the provided new body instead
*
* @param message the other message
* @param newBody the new body to use
*/
void copyFromWithNewBody(Message message, Object newBody);
/**
* Copies the attachments of the other message into this message
*
* @param message the other message
*/
void copyAttachments(Message message);
/**
* Returns the attachment specified by the id
*
* @param id the id under which the attachment is stored
* @return the data handler for this attachment or <tt>null</tt>
*/
DataHandler getAttachment(String id);
/**
* Returns the attachment specified by the id
*
* @param id the id under which the attachment is stored
* @return the attachment or <tt>null</tt>
*/
Attachment getAttachmentObject(String id);
/**
* Returns a set of attachment names of the message
*
* @return a set of attachment names
*/
Set<String> getAttachmentNames();
/**
* Removes the attachment specified by the id
*
* @param id the id of the attachment to remove
*/
void removeAttachment(String id);
/**
* Adds an attachment to the message using the id
*
* @param id the id to store the attachment under
* @param content the data handler for the attachment
*/
void addAttachment(String id, DataHandler content);
/**
* Adds an attachment to the message using the id
*
* @param id the id to store the attachment under
* @param content the attachment
*/
void addAttachmentObject(String id, Attachment content);
/**
* Returns all attachments of the message
*
* @return the attachments in a map or <tt>null</tt>
*/
Map<String, DataHandler> getAttachments();
/**
* Returns all attachments of the message
*
* @return the attachments in a map or <tt>null</tt>
*/
Map<String, Attachment> getAttachmentObjects();
/**
* Set all the attachments associated with this message
*
* @param attachments the attachments
*/
void setAttachments(Map<String, DataHandler> attachments);
/**
* Set all the attachments associated with this message
*
* @param attachments the attachments
*/
void setAttachmentObjects(Map<String, Attachment> attachments);
/**
* Returns whether this message has attachments.
*
* @return <tt>true</tt> if this message has any attachments.
*/
boolean hasAttachments();
/**
* Returns the unique ID for a message exchange if this message is capable
* of creating one or <tt>null</tt> if not
*
* @return the created exchange id, or <tt>null</tt> if not capable of creating
* @deprecated will be removed in Camel 3.0. It is discouraged for messages to create exchange ids
*/
@Deprecated
String createExchangeId();
}