blob: 13aa1033e3f9c67769eb4ee079c5080506f632c1 [file] [log] [blame]
/*
* 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.qpid.protonj2.client;
import java.util.Collection;
import java.util.Map;
import java.util.function.Consumer;
import org.apache.qpid.protonj2.buffer.ProtonBuffer;
import org.apache.qpid.protonj2.client.exceptions.ClientException;
import org.apache.qpid.protonj2.client.impl.ClientMessage;
import org.apache.qpid.protonj2.types.messaging.ApplicationProperties;
import org.apache.qpid.protonj2.types.messaging.DeliveryAnnotations;
import org.apache.qpid.protonj2.types.messaging.Footer;
import org.apache.qpid.protonj2.types.messaging.Header;
import org.apache.qpid.protonj2.types.messaging.MessageAnnotations;
import org.apache.qpid.protonj2.types.messaging.Properties;
import org.apache.qpid.protonj2.types.messaging.Section;
/**
* Advanced AMQP Message object that provides a thin abstraction to raw AMQP types
*
* @param <E> The type of the message body that this message carries
*/
public interface AdvancedMessage<E> extends Message<E> {
/**
* Creates a new {@link AdvancedMessage} instance using the library default implementation.
*
* @param <V> The type to use when specifying the body section value type.
*
* @return a new {@link AdvancedMessage} instance.
*/
static <V> AdvancedMessage<V> create() {
return ClientMessage.createAdvancedMessage();
}
/**
* Return the current {@link Header} assigned to this message, if none was assigned yet
* then this method returns <code>null</code>.
*
* @return the currently assigned {@link Header} for this message.
*
* @throws ClientException if an error occurs while retrieving the message data.
*/
Header header() throws ClientException;
/**
* Assign or replace the {@link Header} instance associated with this message.
*
* @param header
* The {@link Header} value to assign to this message.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while writing the message {@link Header} value.
*/
AdvancedMessage<E> header(Header header) throws ClientException;
/**
* Return the current {@link MessageAnnotations} assigned to this message, if none was assigned yet
* then this method returns <code>null</code>.
*
* @return the currently assigned {@link MessageAnnotations} for this message.
*
* @throws ClientException if an error occurs while retrieving the message data.
*/
MessageAnnotations annotations() throws ClientException;
/**
* Assign or replace the {@link MessageAnnotations} instance associated with this message.
*
* @param messageAnnotations
* The {@link MessageAnnotations} value to assign to this message.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while writing the message {@link MessageAnnotations} value.
*/
AdvancedMessage<E> annotations(MessageAnnotations messageAnnotations) throws ClientException;
/**
* Return the current {@link Properties} assigned to this message, if none was assigned yet
* then this method returns <code>null</code>.
*
* @return the currently assigned {@link Properties} for this message.
*
* @throws ClientException if an error occurs while retrieving the message data.
*/
Properties properties() throws ClientException;
/**
* Assign or replace the {@link Properties} instance associated with this message.
*
* @param properties
* The {@link Properties} value to assign to this message.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while writing the message {@link Properties} value.
*/
AdvancedMessage<E> properties(Properties properties) throws ClientException;
/**
* Return the current {@link ApplicationProperties} assigned to this message, if none was assigned yet
* then this method returns <code>null</code>.
*
* @return the currently assigned {@link ApplicationProperties} for this message.
*
* @throws ClientException if an error occurs while retrieving the message data.
*/
ApplicationProperties applicationProperties() throws ClientException;
/**
* Assign or replace the {@link ApplicationProperties} instance associated with this message.
*
* @param applicationProperties
* The {@link ApplicationProperties} value to assign to this message.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while writing the message {@link ApplicationProperties} value.
*/
AdvancedMessage<E> applicationProperties(ApplicationProperties applicationProperties) throws ClientException;
/**
* Return the current {@link Footer} assigned to this message, if none was assigned yet
* then this method returns <code>null</code>.
*
* @return the currently assigned {@link Footer} for this message.
*
* @throws ClientException if an error occurs while retrieving the message data.
*/
Footer footer() throws ClientException;
/**
* Assign or replace the {@link Footer} instance associated with this message.
*
* @param footer
* The {@link Footer} value to assign to this message.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while writing the message {@link Footer} value.
*/
AdvancedMessage<E> footer(Footer footer) throws ClientException;
/**
* @return the currently assigned message format for this message.
*
* @throws ClientException if an error occurs while retrieving the message data.
*/
int messageFormat() throws ClientException;
/**
* Sets the message format to use when the message is sent. The exact structure of a
* message, together with its encoding, is defined by the message format (default is
* the AMQP defined message format zero.
* <p>
* This field MUST be specified for the first transfer of a multi-transfer message, if
* it is not set at the time of send of the first transfer the sender uses the AMQP
* default value of zero for this field.
* <p>
* The upper three octets of a message format code identify a particular message format.
* The lowest octet indicates the version of said message format. Any given version of
* a format is forwards compatible with all higher versions.
* <pre>
*
* 3 octets 1 octet
* +----------------+---------+
* | message format | version |
* +----------------+---------+
* | |
* msb lsb
*
* </pre>
*
* @param messageFormat
* The message format to encode into the transfer frame that carries the message.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while configuring the message format.
*/
AdvancedMessage<E> messageFormat(int messageFormat) throws ClientException;
/**
* Adds the given {@link Section} to the internal collection of sections that will be sent
* to the remote peer when this message is encoded. If a previous section was added by a call
* to the {@link Message#body(Object)} method it should be retained as the first element of
* the running list of body sections contained in this message.
* <p>
* The implementation should make an attempt to validate that sections added are valid for
* the message format that is assigned when they are added.
*
* @param bodySection
* The {@link Section} instance to append to the internal collection.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while writing to the message body sections.
*/
AdvancedMessage<E> addBodySection(Section<?> bodySection) throws ClientException;
/**
* Sets the body {@link Section} instances to use when encoding this message. The value
* given replaces any existing sections assigned to this message through the {@link Message#body(Object)}
* or {@link AdvancedMessage#addBodySection(Section)} methods. Calling this method with a null
* or empty collection is equivalent to calling the {@link #clearBodySections()} method.
*
* @param sections
* The {@link Collection} of {@link Section} instance to assign this message.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while writing to the message body sections.
*/
AdvancedMessage<E> bodySections(Collection<Section<?>> sections) throws ClientException;
/**
* Create and return an unmodifiable {@link Collection} that contains the {@link Section} instances
* currently assigned to this message. Changes to this message body after calling this will not be
* reflected in the returned collection.
*
* @return an unmodifiable {@link Collection} that is a view of the current sections assigned to this message.
*
* @throws ClientException if an error occurs while retrieving the message data.
*/
Collection<Section<?>> bodySections() throws ClientException;
/**
* Performs the given action for each body {@link Section} of the {@link AdvancedMessage} until all
* sections have been presented to the given {@link Consumer} or the consumer throws an exception.
*
* @param consumer
* the {@link Consumer} that will operate on each of the body sections in this message.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while iterating over the message data.
*/
AdvancedMessage<E> forEachBodySection(Consumer<Section<?>> consumer) throws ClientException;
/**
* Clears all current body {@link Section} elements from the {@link AdvancedMessage}.
*
* @return this {@link AdvancedMessage} instance.
*
* @throws ClientException if an error occurs while clearing the message body sections.
*/
AdvancedMessage<E> clearBodySections() throws ClientException;
/**
* Encodes the {@link AdvancedMessage} for transmission by the client. The provided {@link DeliveryAnnotations}
* can be included or augmented by the {@link AdvancedMessage} implementation based on the target message format.
* The implementation is responsible for ensuring that the delivery annotations are treated correctly encoded into
* the correct location in the message.
*
* @param deliveryAnnotations
* A {@link Map} of delivery annotation values that were requested to be included in the transmitted message.
*
* @return the encoded form of this message in a {@link ProtonBuffer} instance.
*
* @throws ClientException if an error occurs while encoding the message data.
*/
ProtonBuffer encode(Map<String, Object> deliveryAnnotations) throws ClientException;
}