Author: thilinamb
Date: Tue Mar  6 06:21:17 2012
New Revision: 1297344

URL: http://svn.apache.org/viewvc?rev=1297344&view=rev
Log:
Fixing RAMPART-332 - Making getEffectivePolicy() method thread safe.

Modified:
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisBindingMessage.java
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisMessage.java

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisBindingMessage.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisBindingMessage.java?rev=1297344&r1=1297343&r2=1297344&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisBindingMessage.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisBindingMessage.java
 Tue Mar  6 06:21:17 2012
@@ -19,11 +19,6 @@
 
 package org.apache.axis2.description;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
@@ -36,6 +31,12 @@ import org.apache.axis2.util.WSDLSeriali
 import org.apache.axis2.wsdl.WSDLConstants;
 import org.apache.neethi.Policy;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.locks.ReentrantLock;
+
 public class AxisBindingMessage extends AxisDescription {
 
        private String name;
@@ -50,8 +51,9 @@ public class AxisBindingMessage extends 
        // WSDL 2.0 serializer
        private boolean fault = false;
 
-       private Policy effectivePolicy = null;
-       private Date lastPolicyCalcuatedTime = null;
+    private volatile Policy effectivePolicy = null;
+    private volatile Date lastPolicyCalculatedTime = null;
+    private final ReentrantLock reentrantLock = new ReentrantLock();
 
        public boolean isFault() {
                return fault;
@@ -218,12 +220,17 @@ public class AxisBindingMessage extends 
                return (AxisBindingOperation) parent;
        }
 
-       public Policy getEffectivePolicy() {
-              if (lastPolicyCalcuatedTime == null || isPolicyUpdated()) {
-                       effectivePolicy = calculateEffectivePolicy();
-               }
-               return effectivePolicy;
-       }
+    public Policy getEffectivePolicy() {
+        if (lastPolicyCalculatedTime == null || isPolicyUpdated()) {
+            synchronized (this) {
+                if (lastPolicyCalculatedTime == null || isPolicyUpdated()) {
+                    effectivePolicy = calculateEffectivePolicy();
+                    lastPolicyCalculatedTime = new Date();
+                }
+            }
+        }
+        return effectivePolicy;
+    }
 
        public Policy calculateEffectivePolicy() {
                PolicySubject policySubject = null;
@@ -286,20 +293,19 @@ public class AxisBindingMessage extends 
                                        .getAttachedPolicyComponents());
                }
 
-               lastPolicyCalcuatedTime = new Date();
                return PolicyUtil.getMergedPolicy(policyList, axisService);
        }
        
        private boolean isPolicyUpdated() {
                if (getPolicySubject().getLastUpdatedTime().after(
-                               lastPolicyCalcuatedTime)) {
+                lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisBindingOperation
                AxisBindingOperation axisBindingOperation = 
getAxisBindingOperation();
                if (axisBindingOperation != null
                                && 
axisBindingOperation.getPolicySubject().getLastUpdatedTime()
-                                               
.after(lastPolicyCalcuatedTime)) {
+                                               
.after(lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisBinding
@@ -307,7 +313,7 @@ public class AxisBindingMessage extends 
                                : axisBindingOperation.getAxisBinding();
                if (axisBinding != null
                                && 
axisBinding.getPolicySubject().getLastUpdatedTime().after(
-                                               lastPolicyCalcuatedTime)) {
+                lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisEndpoint
@@ -315,13 +321,13 @@ public class AxisBindingMessage extends 
                                .getAxisEndpoint();
                if (axisEndpoint != null
                                && 
axisEndpoint.getPolicySubject().getLastUpdatedTime().after(
-                                               lastPolicyCalcuatedTime)) {
+                lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisMessage
                if (axisMessage != null
                                && 
axisMessage.getPolicySubject().getLastUpdatedTime().after(
-                                               lastPolicyCalcuatedTime)) {
+                lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisOperation
@@ -329,7 +335,7 @@ public class AxisBindingMessage extends 
                                : axisMessage.getAxisOperation();
                if (axisOperation != null
                                && 
axisOperation.getPolicySubject().getLastUpdatedTime().after(
-                                               lastPolicyCalcuatedTime)) {
+                lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisService
@@ -337,7 +343,7 @@ public class AxisBindingMessage extends 
                                : axisOperation.getAxisService();
                if (axisService != null
                                && 
axisService.getPolicySubject().getLastUpdatedTime().after(
-                                               lastPolicyCalcuatedTime)) {
+                lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisConfiguration
@@ -345,7 +351,7 @@ public class AxisBindingMessage extends 
                                : axisService.getAxisConfiguration();
                if (axisConfiguration != null
                                && 
axisConfiguration.getPolicySubject().getLastUpdatedTime()
-                                               
.after(lastPolicyCalcuatedTime)) {
+                                               
.after(lastPolicyCalculatedTime)) {
                        return true;
                }
                return false;

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisMessage.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisMessage.java?rev=1297344&r1=1297343&r2=1297344&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisMessage.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/AxisMessage.java
 Tue Mar  6 06:21:17 2012
@@ -19,13 +19,6 @@
 
 package org.apache.axis2.description;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.xml.namespace.QName;
-
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.description.java2wsdl.Java2WSDLConstants;
 import org.apache.axis2.engine.AxisConfiguration;
@@ -35,11 +28,13 @@ import org.apache.axis2.util.PolicyUtil;
 import org.apache.axis2.wsdl.SOAPHeaderMessage;
 import org.apache.neethi.Policy;
 import org.apache.neethi.PolicyComponent;
-import org.apache.ws.commons.schema.XmlSchema;
-import org.apache.ws.commons.schema.XmlSchemaElement;
-import org.apache.ws.commons.schema.XmlSchemaImport;
-import org.apache.ws.commons.schema.XmlSchemaInclude;
-import org.apache.ws.commons.schema.XmlSchemaObjectCollection;
+import org.apache.ws.commons.schema.*;
+
+import javax.xml.namespace.QName;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
 
 
 /**
@@ -66,10 +61,10 @@ public class AxisMessage extends AxisDes
 
     //To chcek whether the message is wrapped or unwrapped
     private boolean wrapped = true;
-    
-    private Policy effectivePolicy = null;
-    private Date lastPolicyCalcuatedTime = null;
-    
+
+    private volatile Policy effectivePolicy = null;
+    private volatile Date lastPolicyCalculatedTime = null;
+
     public String getMessagePartName() {
                return messagePartName;
        }
@@ -242,13 +237,18 @@ public class AxisMessage extends AxisDes
     public void setWrapped(boolean wrapped) {
         this.wrapped = wrapped;
     }
-    
+
     public Policy getEffectivePolicy() {
-               if (lastPolicyCalcuatedTime == null || isPolicyUpdated()) {
-                       effectivePolicy = calculateEffectivePolicy();
-               }
-               return effectivePolicy;
-       }
+        if (lastPolicyCalculatedTime == null || isPolicyUpdated()) {
+            synchronized (this) {
+                if (lastPolicyCalculatedTime == null || isPolicyUpdated()) {
+                    effectivePolicy = calculateEffectivePolicy();
+                    lastPolicyCalculatedTime = new Date();
+                }
+            }
+        }
+        return effectivePolicy;
+    }
 
        public Policy calculateEffectivePolicy() {
                PolicySubject policySubject;
@@ -282,21 +282,20 @@ public class AxisMessage extends AxisDes
                }
 
                Policy result = PolicyUtil.getMergedPolicy(policyList, 
axisService);
-               lastPolicyCalcuatedTime = new Date();
                return result;
        }
 
        public boolean isPolicyUpdated() {
                // AxisMessage
                if (getPolicySubject().getLastUpdatedTime().after(
-                               lastPolicyCalcuatedTime)) {
+                lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisOperation
                AxisOperation axisOperation = (AxisOperation) parent;
                if (axisOperation != null
                                && 
axisOperation.getPolicySubject().getLastUpdatedTime().after(
-                                               lastPolicyCalcuatedTime)) {
+                lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisService
@@ -304,7 +303,7 @@ public class AxisMessage extends AxisDes
                                : axisOperation.getAxisService();
                if (axisService != null
                                && 
axisService.getPolicySubject().getLastUpdatedTime().after(
-                                               lastPolicyCalcuatedTime)) {
+                lastPolicyCalculatedTime)) {
                        return true;
                }
                // AxisConfiguration
@@ -312,6 +311,6 @@ public class AxisMessage extends AxisDes
                                : axisService.getAxisConfiguration();
         return axisConfiguration != null
                && axisConfiguration.getPolicySubject().getLastUpdatedTime()
-                .after(lastPolicyCalcuatedTime);
+                .after(lastPolicyCalculatedTime);
     }
 }


Reply via email to