[ 
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]

Reply via email to