You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by is...@apache.org on 2016/06/09 16:59:08 UTC

svn commit: r1747563 - in /synapse/trunk/java/modules/core/src/main/java/org/apache/synapse: aspects/statistics/StatisticsLog.java mediators/template/TemplateContext.java util/MessageHelper.java

Author: isudana
Date: Thu Jun  9 16:59:08 2016
New Revision: 1747563

URL: http://svn.apache.org/viewvc?rev=1747563&view=rev
Log:
fixing SYNAPSE-1040 by applying modfied patch by Isuru Ranawaka

Modified:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/aspects/statistics/StatisticsLog.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/template/TemplateContext.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/aspects/statistics/StatisticsLog.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/aspects/statistics/StatisticsLog.java?rev=1747563&r1=1747562&r2=1747563&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/aspects/statistics/StatisticsLog.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/aspects/statistics/StatisticsLog.java Thu Jun  9 16:59:08 2016
@@ -61,6 +61,9 @@ public class StatisticsLog {
         return time;
     }
 
+    public void setTime(long time) {
+        this.time = time;
+    }
     public boolean isResponse() {
         return isResponse;
     }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/template/TemplateContext.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/template/TemplateContext.java?rev=1747563&r1=1747562&r2=1747563&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/template/TemplateContext.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/template/TemplateContext.java Thu Jun  9 16:59:08 2016
@@ -47,7 +47,7 @@ public class TemplateContext {
      */
     private Map mappedValues;
 
-    TemplateContext(String name, Collection<TemplateParameter> parameters) {
+    public TemplateContext(String name, Collection<TemplateParameter> parameters) {
         this.fName = name;
         this.parameters = parameters;
         mappedValues = new HashMap();
@@ -116,6 +116,14 @@ public class TemplateContext {
         }
     }
 
+    public Map getMappedValues() {
+        return mappedValues;
+    }
+
+    public void setMappedValues(Map map) {
+        this.mappedValues = map;
+    }
+
     public Object getParameterValue(String paramName) {
         return mappedValues.get(paramName);
     }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java?rev=1747563&r1=1747562&r2=1747563&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MessageHelper.java Thu Jun  9 16:59:08 2016
@@ -2,6 +2,7 @@ package org.apache.synapse.util;
 
 import org.apache.axiom.attachments.Attachments;
 import org.apache.axiom.om.*;
+import org.apache.axiom.om.util.ElementHelper;
 import org.apache.axiom.soap.*;
 import org.apache.axiom.util.UIDGenerator;
 import org.apache.axis2.AxisFault;
@@ -17,10 +18,13 @@ import org.apache.synapse.FaultHandler;
 import org.apache.synapse.MessageContext;
 import org.apache.synapse.SynapseConstants;
 import org.apache.synapse.SynapseException;
+import org.apache.synapse.aspects.statistics.ErrorLog;
+import org.apache.synapse.aspects.statistics.StatisticsLog;
 import org.apache.synapse.aspects.statistics.StatisticsRecord;
 import org.apache.synapse.aspects.statistics.StatisticsRecordFactory;
 import org.apache.synapse.core.axis2.Axis2MessageContext;
 import org.apache.synapse.mediators.eip.EIPConstants;
+import org.apache.synapse.mediators.template.TemplateContext;
 import org.apache.synapse.transport.passthru.PassThroughConstants;
 import org.apache.synapse.transport.passthru.Pipe;
 import org.apache.synapse.transport.passthru.ServerWorker;
@@ -77,10 +81,26 @@ public class MessageHelper {
 
         // copy all the synapse level properties to the newCtx
         for (Object o : synCtx.getPropertyKeySet()) {
-            // If there are non String keyed properties neglect them rather than trow exception
-            if (o instanceof String) {
-                newCtx.setProperty((String) o, synCtx.getProperty((String) o));
+            String key = (String) o;                    // MessageContext API enforce key to be a String
+            Object obj = synCtx.getProperty(key);
+            if (obj instanceof String || obj instanceof Integer) {  // For immutable
+                // Do nothing
+            } else if (obj instanceof ArrayList) {
+                obj = cloneArrayList((ArrayList) obj);
+            } else if (obj instanceof Stack
+                    && key.equals(SynapseConstants.SYNAPSE__FUNCTION__STACK)) {
+                obj = getClonedTemplateStack((Stack<TemplateContext>) obj);
+            } else if (obj instanceof StatisticsRecord) {
+                obj = getClonedStatisticRecord((StatisticsRecord) obj);
+            } else if (obj instanceof OMElement) {
+                obj = ((OMElement) obj).cloneOMElement();
+            } else {
+                if (log.isDebugEnabled()) {
+                    log.debug("Deep clone not happened for property : " + key + ". Class type : "
+                             + obj.getClass().getName());
+                }
             }
+            newCtx.setProperty(key, obj);
         }
         
         // Make deep copy of fault stack so that parent will not be lost it's fault stack
@@ -410,4 +430,106 @@ public class MessageHelper {
         throw new SynapseException(msg);
     }
 
+    /*
+     * This method will deep clone array list by creating a new ArrayList and cloning and adding each element in it
+     */
+    private static ArrayList<Object> cloneArrayList(ArrayList<Object> originalArrayList) {
+        ArrayList<Object> clonedArrayList = null;
+        if (originalArrayList != null) {
+            clonedArrayList = new ArrayList<Object>();
+            for (Object obj : originalArrayList) {
+                if (obj instanceof SOAPHeaderBlock) {
+                    SOAPFactory fac = (SOAPFactory) ((SOAPHeaderBlock) obj).getOMFactory();
+                    obj = ((SOAPHeaderBlock) obj).cloneOMElement();
+                    try {
+                        obj = ElementHelper.toSOAPHeaderBlock((OMElement) obj, fac);
+                    } catch (Exception e) {
+                        handleException(e.getLocalizedMessage());
+                    }
+                } else if (obj instanceof SOAPEnvelope) {
+                    SOAPEnvelope env = (SOAPEnvelope) obj;
+                    obj = MessageHelper.cloneSOAPEnvelope(env);
+                } else if (obj instanceof OMElement) {
+                    obj = ((OMElement) obj).cloneOMElement();
+                } else {
+                    if (log.isDebugEnabled()) {
+                        log.debug("Array List deep clone not implemented for Class type : " + obj.getClass().getName());
+                    }
+                }
+                clonedArrayList.add(obj);
+            }
+        }
+        return clonedArrayList;
+    }
+
+    /**
+     * Get a clone of a Template Function stack
+     *
+     * @param oriTemplateStack original template function stack to be cloned
+     * @return clone of a Template Function stack
+     */
+    private static Stack<TemplateContext> getClonedTemplateStack(Stack<TemplateContext> oriTemplateStack) {
+
+        Stack<TemplateContext> clonedTemplateStack = new Stack<TemplateContext>();
+
+        for (TemplateContext oriTemplateCtx : oriTemplateStack) {
+            TemplateContext clonedTemplateCtx =
+                    new TemplateContext(oriTemplateCtx.getName(), oriTemplateCtx.getParameters());
+
+            Map oriValueMap = oriTemplateCtx.getMappedValues();
+            Map clonedValueMap = new HashMap();
+            for (Object key : oriValueMap.keySet()) {
+                Object value = oriValueMap.get(key);
+                if (value instanceof ArrayList) {
+                    value = cloneArrayList((ArrayList<Object>) value);
+                }
+                clonedValueMap.put(key, value);
+            }
+            clonedTemplateCtx.setMappedValues(clonedValueMap);
+            clonedTemplateStack.push(clonedTemplateCtx);
+        }
+        return clonedTemplateStack;
+    }
+
+
+    /**
+     * Get clone of Statistic Record
+     *
+     * @param oriRecord original statistic record
+     * @return clone of Statistic Record
+     */
+    private static StatisticsRecord getClonedStatisticRecord (StatisticsRecord oriRecord) {
+
+        StatisticsRecord clonedRecord =
+                new StatisticsRecord(oriRecord.getId(), oriRecord.getClientIP(), oriRecord.getClientHost());
+
+        clonedRecord.setOwner(oriRecord.getOwner());
+        clonedRecord.setEndReported(oriRecord.isEndReported());
+
+        // Clone stats logs
+        List<StatisticsLog> oriStatisticsLogs = oriRecord.getAllStatisticsLogs();
+        for (StatisticsLog oriLog : oriStatisticsLogs) {
+
+            StatisticsLog clonedLog = new StatisticsLog(oriLog.getId(), oriLog.getComponentType());
+            clonedLog.setTime(oriLog.getTime());
+            clonedLog.setResponse(oriLog.isResponse());
+            clonedLog.setFault(oriLog.isFault());
+            clonedLog.setEndAnyLog(oriLog.isEndAnyLog());
+
+            // Error Log
+            ErrorLog oriErrorLog = oriLog.getErrorLog();
+            if (oriErrorLog != null) {
+                ErrorLog clonedErrorLog = new ErrorLog(oriErrorLog.getErrorCode());
+                if (oriErrorLog.getException() != null) {
+                    clonedErrorLog.setException(oriErrorLog.getException());
+                }
+                clonedErrorLog.setErrorMessage(oriErrorLog.getErrorMessage());
+                clonedErrorLog.setErrorDetail(oriErrorLog.getErrorDetail());
+                clonedLog.setErrorLog(clonedErrorLog);
+            }
+            clonedRecord.collect(clonedLog);
+        }
+        return clonedRecord;
+    }
+
 }