[ 
https://issues.apache.org/activemq/browse/SM-1411?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=43978#action_43978
 ] 

Ron Gavlin commented on SM-1411:
--------------------------------

Here is a proposed patch:

Index: src/main/java/org/apache/servicemix/eip/support/AbstractAggregator.java
===================================================================
--- src/main/java/org/apache/servicemix/eip/support/AbstractAggregator.java     
(revision 674147)
+++ src/main/java/org/apache/servicemix/eip/support/AbstractAggregator.java     
(working copy)
@@ -17,6 +17,7 @@
 package org.apache.servicemix.eip.support;
 
 import java.util.Date;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.locks.Lock;
@@ -21,9 +22,11 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.locks.Lock;
 
+import javax.activation.DataHandler;
 import javax.jbi.messaging.ExchangeStatus;
 import javax.jbi.messaging.InOnly;
 import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
 import javax.jbi.messaging.NormalizedMessage;
 import javax.jbi.messaging.RobustInOnly;
 
@@ -30,6 +33,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.eip.EIPEndpoint;
+import org.apache.servicemix.jbi.messaging.PojoMarshaler;
 import org.apache.servicemix.jbi.util.MessageUtil;
 import org.apache.servicemix.timers.Timer;
 import org.apache.servicemix.timers.TimerListener;
@@ -59,6 +63,10 @@
 
     private ConcurrentMap<String, Boolean> closedAggregates = new 
ConcurrentHashMap<String, Boolean>();
     
+    private boolean copyProperties = true;
+    
+    private boolean copyAttachments = true;
+    
     /**
      * @return the synchronous
      */
@@ -101,6 +109,22 @@
         this.target = target;
     }
     
+    public boolean isCopyProperties() {
+       return copyProperties;
+    }
+    
+    public void setCopyProperties(boolean copyProperties) {
+       this.copyProperties = copyProperties;
+    }
+    
+    public boolean isCopyAttachments() {
+       return copyAttachments;
+    }
+    
+    public void setCopyAttachments(boolean copyAttachments) {
+       this.copyAttachments = copyAttachments;
+    }
+    
     /* (non-Javadoc)
      * @see 
org.apache.servicemix.eip.EIPEndpoint#processSync(javax.jbi.messaging.MessageExchange)
      */
@@ -248,6 +272,39 @@
     }
     
     /**
+     * Copies properties from one message to another that do not already exist
+     * 
+     * @param from the message containing the properties
+     * @param to the destination message where the properties are set
+     */
+    protected void copyProperties(NormalizedMessage from, NormalizedMessage 
to) {
+       for (String propertyName : (Set<String>) from.getPropertyNames()) {
+               // Do not copy existing properties or transient properties
+               if (to.getProperty(propertyName) == null && 
!PojoMarshaler.BODY.equals(propertyName)) {
+                       Object value = from.getProperty(propertyName);
+                       to.setProperty(propertyName, value);
+               }
+       }
+    }
+    
+    /**
+     * Copies attachments from one message to another that do not already exist
+     * 
+     * @param from the message with the attachments
+     * @param to the destination message where the attachments are to be added
+     * @throws MessagingException if an attachment could not be added
+     */
+    protected void copyAttachments(NormalizedMessage from, NormalizedMessage 
to) throws MessagingException {
+       for (String attachmentName : (Set<String>) from.getAttachmentNames()) {
+               // Do not copy existing attachments
+               if (to.getAttachment(attachmentName) == null) {
+                       DataHandler value = from.getAttachment(attachmentName);
+                       to.addAttachment(attachmentName, value);
+               }
+       }
+    }
+    
+    /**
      * Retrieve the correlation ID of the given exchange
      * @param exchange
      * @param message
Index: src/main/java/org/apache/servicemix/eip/patterns/SplitAggregator.java
===================================================================
--- src/main/java/org/apache/servicemix/eip/patterns/SplitAggregator.java       
(revision 674147)
+++ src/main/java/org/apache/servicemix/eip/patterns/SplitAggregator.java       
(working copy)
@@ -252,6 +252,12 @@
                 } else {
                     root.appendChild(doc.importNode(elem, true));
                 }
+                if (isCopyProperties()) {
+                       copyProperties(messages[i], message);
+                }
+                if (isCopyAttachments()) {
+                       copyAttachments(messages[i], message);
+                }
             }
         }
         message.setContent(new DOMSource(doc));


> EIP Aggregators should propagate properties/attachments by default and allow 
> this behavior to be configurable
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: SM-1411
>                 URL: https://issues.apache.org/activemq/browse/SM-1411
>             Project: ServiceMix
>          Issue Type: Improvement
>          Components: servicemix-eip
>            Reporter: Ron Gavlin
>
> The default SplitAggregator behavior should be to propagate both properties
> and attachments.
> Also, the AbstractAggregator or SplitAggregator should to allow this behavior
> to be configurable by adding booleans for isCopyAttachments and
> isCopyProperties.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to