[
https://issues.apache.org/jira/browse/PROTON-2299?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17346934#comment-17346934
]
ASF GitHub Bot commented on PROTON-2299:
----------------------------------------
gemmellr commented on a change in pull request #40:
URL: https://github.com/apache/qpid-proton-j/pull/40#discussion_r634408811
##########
File path: proton-j/src/main/java/org/apache/qpid/proton/message/Message.java
##########
@@ -210,4 +213,55 @@ public static Message create(Header header,
void clear();
MessageError getError();
+
+ /**
+ * @return the total number of body {@link Section} elements contained in
this {@link Message}
+ */
+ int getBodySectionCount();
+
+ /**
+ * Sets the body {@link Section} instances to use when encoding this
message. The value
+ * given replaces any existing section(s) assigned to this message through
the {@link Message#setBody(Object)}
+ * or {@link #addBodySection(Section)} methods. Calling this method with
a null
+ * or empty collection is equivalent to calling the {@link #clear()}
method.
+ *
+ * @param sections
+ * The {@link Collection} of {@link Section} instance to assign this
message.
+ *
+ * @return this {@link Message} instance.
+ */
+ Message setBodySections(Collection<Section> sections);
Review comment:
I think its probably worth considering another interface than just
Section for this method, to make clear it only applies to Data and AmqpSequence
sections, as the only ones allowed multiple body sections. That, or if the type
symmetry with getters is more desirable, the impl needs to validate the
contents and the API doc call it out.
##########
File path: proton-j/src/main/java/org/apache/qpid/proton/message/Message.java
##########
@@ -210,4 +213,55 @@ public static Message create(Header header,
void clear();
MessageError getError();
+
+ /**
+ * @return the total number of body {@link Section} elements contained in
this {@link Message}
+ */
+ int getBodySectionCount();
+
+ /**
+ * Sets the body {@link Section} instances to use when encoding this
message. The value
+ * given replaces any existing section(s) assigned to this message through
the {@link Message#setBody(Object)}
+ * or {@link #addBodySection(Section)} methods. Calling this method with
a null
+ * or empty collection is equivalent to calling the {@link #clear()}
method.
+ *
+ * @param sections
+ * The {@link Collection} of {@link Section} instance to assign this
message.
+ *
+ * @return this {@link Message} instance.
+ */
+ Message setBodySections(Collection<Section> sections);
+
+ /**
+ * 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 #setBody(Object)} method it should be retained as the
first element of
Review comment:
setBody takes Section rather than Object.
##########
File path:
proton-j/src/main/java/org/apache/qpid/proton/message/impl/MessageImpl.java
##########
@@ -514,7 +536,32 @@ public ApplicationProperties getApplicationProperties()
@Override
public Section getBody()
{
- return _body;
+ Section section = _body;
Review comment:
For clarity I might be inclined to null check and return this, like the
next method does.
##########
File path: proton-j/src/main/java/org/apache/qpid/proton/message/Message.java
##########
@@ -210,4 +213,55 @@ public static Message create(Header header,
void clear();
MessageError getError();
+
+ /**
+ * @return the total number of body {@link Section} elements contained in
this {@link Message}
+ */
+ int getBodySectionCount();
+
+ /**
+ * Sets the body {@link Section} instances to use when encoding this
message. The value
+ * given replaces any existing section(s) assigned to this message through
the {@link Message#setBody(Object)}
+ * or {@link #addBodySection(Section)} methods. Calling this method with
a null
+ * or empty collection is equivalent to calling the {@link #clear()}
method.
+ *
+ * @param sections
+ * The {@link Collection} of {@link Section} instance to assign this
message.
+ *
+ * @return this {@link Message} instance.
+ */
+ Message setBodySections(Collection<Section> sections);
+
+ /**
+ * 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 #setBody(Object)} method it should be retained as the
first element of
+ * the running list of body sections contained in this message.
+ *
+ * @param bodySection
+ * The {@link Section} instance to append to the internal collection.
+ *
+ * @return this {@link Message} instance.
+ */
+ Message addBodySection(Section bodySection);
+
+ /**
+ * Create and return a unmodifiable {@link Collection} that contains the
{@link Section} instances currently
+ * assigned to this message. Changes to the returned Collection are not
reflected in the Message.
+ *
+ * @return a {@link Collection} that is a copy of the current sections
assigned to this message.
Review comment:
..or an empty list if none?
##########
File path: proton-j/src/main/java/org/apache/qpid/proton/message/Message.java
##########
@@ -210,4 +213,55 @@ public static Message create(Header header,
void clear();
MessageError getError();
+
+ /**
+ * @return the total number of body {@link Section} elements contained in
this {@link Message}
+ */
+ int getBodySectionCount();
+
+ /**
+ * Sets the body {@link Section} instances to use when encoding this
message. The value
+ * given replaces any existing section(s) assigned to this message through
the {@link Message#setBody(Object)}
+ * or {@link #addBodySection(Section)} methods. Calling this method with
a null
+ * or empty collection is equivalent to calling the {@link #clear()}
method.
+ *
+ * @param sections
+ * The {@link Collection} of {@link Section} instance to assign this
message.
+ *
+ * @return this {@link Message} instance.
+ */
+ Message setBodySections(Collection<Section> sections);
+
+ /**
+ * 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 #setBody(Object)} method it should be retained as the
first element of
+ * the running list of body sections contained in this message.
+ *
+ * @param bodySection
+ * The {@link Section} instance to append to the internal collection.
+ *
+ * @return this {@link Message} instance.
+ */
+ Message addBodySection(Section bodySection);
Review comment:
Similar to above, but even additionally it could be restricted to only
body type sections (the ship obviously sailed on the existing setBody mothod,
but still may be worth tightening it up for this one)
##########
File path:
proton-j/src/main/java/org/apache/qpid/proton/message/impl/MessageImpl.java
##########
@@ -557,6 +604,76 @@ public void setApplicationProperties(ApplicationProperties
applicationProperties
public void setBody(Section body)
{
_body = body;
+ _bodySections = null;
+ }
+
+ @Override
+ public Message setBodySections(Collection<Section> sections)
+ {
+ clear();
+ if (sections != null && !sections.isEmpty())
+ {
+ _bodySections = new ArrayList<>(sections);
Review comment:
For consistency I wondered if this should maybe set _body if there is
only 1 element in collection.
Related to earlier comments, should validate or restrict the types allowed.
##########
File path: proton-j/src/main/java/org/apache/qpid/proton/message/Message.java
##########
@@ -210,4 +213,55 @@ public static Message create(Header header,
void clear();
MessageError getError();
+
+ /**
+ * @return the total number of body {@link Section} elements contained in
this {@link Message}
+ */
+ int getBodySectionCount();
+
+ /**
+ * Sets the body {@link Section} instances to use when encoding this
message. The value
+ * given replaces any existing section(s) assigned to this message through
the {@link Message#setBody(Object)}
+ * or {@link #addBodySection(Section)} methods. Calling this method with
a null
+ * or empty collection is equivalent to calling the {@link #clear()}
method.
+ *
+ * @param sections
+ * The {@link Collection} of {@link Section} instance to assign this
message.
+ *
+ * @return this {@link Message} instance.
+ */
+ Message setBodySections(Collection<Section> sections);
+
+ /**
+ * 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 #setBody(Object)} method it should be retained as the
first element of
+ * the running list of body sections contained in this message.
+ *
+ * @param bodySection
+ * The {@link Section} instance to append to the internal collection.
+ *
+ * @return this {@link Message} instance.
+ */
+ Message addBodySection(Section bodySection);
+
+ /**
+ * Create and return a unmodifiable {@link Collection} that contains the
{@link Section} instances currently
+ * assigned to this message. Changes to the returned Collection are not
reflected in the Message.
Review comment:
If it is unmodifiable, no need to comment on changes to it.
##########
File path:
proton-j/src/main/java/org/apache/qpid/proton/message/impl/MessageImpl.java
##########
@@ -557,6 +604,76 @@ public void setApplicationProperties(ApplicationProperties
applicationProperties
public void setBody(Section body)
{
_body = body;
+ _bodySections = null;
+ }
+
+ @Override
+ public Message setBodySections(Collection<Section> sections)
+ {
+ clear();
+ if (sections != null && !sections.isEmpty())
+ {
+ _bodySections = new ArrayList<>(sections);
+ }
+
+ return this;
+ }
+
+ @Override
+ public Message addBodySection(Section bodySection)
+ {
+ Objects.requireNonNull(bodySection, "Additional Body Section cannot be
null");
Review comment:
Note NPE or non-null requirement in javadoc?
##########
File path: proton-j/src/main/java/org/apache/qpid/proton/message/Message.java
##########
@@ -210,4 +213,55 @@ public static Message create(Header header,
void clear();
MessageError getError();
+
+ /**
+ * @return the total number of body {@link Section} elements contained in
this {@link Message}
+ */
+ int getBodySectionCount();
+
+ /**
+ * Sets the body {@link Section} instances to use when encoding this
message. The value
Review comment:
Perhaps note that the changes to the collection afterwards aren't
reflected in the message?
##########
File path:
proton-j/src/main/java/org/apache/qpid/proton/message/impl/MessageImpl.java
##########
@@ -666,9 +784,9 @@ public void decode(ReadableBuffer buffer)
}
}
- if(section != null && !(section instanceof Footer))
+ while(section != null && !(section instanceof Footer))
{
- _body = section;
+ addBodySection(section);
Review comment:
This should fail if receiving multiple body sections with differing
types (or multiple AmqpValue sections)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Support multiple data sections in amqpMessage
> ---------------------------------------------
>
> Key: PROTON-2299
> URL: https://issues.apache.org/jira/browse/PROTON-2299
> Project: Qpid Proton
> Issue Type: Improvement
> Components: proton-j
> Affects Versions: proton-j-0.33.7
> Reporter: Hemant Tanwar
> Priority: Minor
> Labels: feature-request, qpid
>
>
> This is a request for new feature to provide implementation to support
> multiple Data sections.
> Current usage of single Data section looks like this
> Message amqpMessage = Proton.message();
> amqpMessage.setBody(new Data(new Binary(“my data”.getBytes())));
> This does not allow to add multiple Data sections.
> The AMQP specification require to support "one or more data sections, one or
> more amqp-sequence sections. Specification "
> [http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-messaging-v1.0-os.html#section-message-format]
> I have looked into various threads which suggest users of qpid to implement
> their own version of MessageImpl/ Encoders and decoders to achieve this
> functionality.
> Here are previous discussions.
> Previous pull request by community:
> [https://github.com/apache/qpid-proton/pull/54]
> Discussion on developer forum
> [http://qpid.2158936.n2.nabble.com/Re-Amqp-Spec-multiple-byte-is-not-supported-for-DATA-td7695225.html]
> This will duplicate effort by many users of qpid, for a feature which is in
> AMQP specification.
> Can we request this feature to be supported in qpid by providing an
> implementation for it ?
> The API for this could be designed to what make sense, here is one suggestion
> Message amqpMessage = Proton.message();
> amqpMessage.setMultipleBody(Iterable<Section> multipleData);
> or
> amqpMessage.setMultipleBody(List<Section> multipleData);
> And for getting multiple sections ..
> Iterable<Section> amqpMessage.getMultipleBody();
> or
> List<Section> amqpMessage.getMultipleBody();
> Or provide a different implementation of MessageImpl which support this
> feature.
> This feature will help community a lot, so they do not have to maintain on
> the wire amqp protocol details in their code base. For example implementing
> encoders and decoders.
> Since it is being asked few times, it is something community would benefits
> from, more ever it is part of AMQP spec.
> If there is an appetite for this feature, I or any community members provide
> PR for the implementation and finally it becomes part of proton-j library.
>
> Appreciate your response.
> Thank,
> Hemant
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]