You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by dk...@apache.org on 2013/03/08 17:33:47 UTC

svn commit: r1454451 - /webservices/wss4j/trunk/policy/src/main/java/org/apache/wss4j/policy/model/AbstractSecurityAssertion.java

Author: dkulp
Date: Fri Mar  8 16:33:47 2013
New Revision: 1454451

URL: http://svn.apache.org/r1454451
Log:
Optimize the normalization to hold onto the normalized form to avoid the costly normalization being done over and over.

Modified:
    webservices/wss4j/trunk/policy/src/main/java/org/apache/wss4j/policy/model/AbstractSecurityAssertion.java

Modified: webservices/wss4j/trunk/policy/src/main/java/org/apache/wss4j/policy/model/AbstractSecurityAssertion.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/policy/src/main/java/org/apache/wss4j/policy/model/AbstractSecurityAssertion.java?rev=1454451&r1=1454450&r2=1454451&view=diff
==============================================================================
--- webservices/wss4j/trunk/policy/src/main/java/org/apache/wss4j/policy/model/AbstractSecurityAssertion.java (original)
+++ webservices/wss4j/trunk/policy/src/main/java/org/apache/wss4j/policy/model/AbstractSecurityAssertion.java Fri Mar  8 16:33:47 2013
@@ -37,7 +37,11 @@ public abstract class AbstractSecurityAs
 
     private boolean isOptional;
     private boolean isIgnorable;
-    private boolean normalized = false;
+    
+    // if normalized is null, then this policy hasn't been normalized yet
+    // if normalized == this, then this policy is already in normalized form
+    // else, normalized contains the normalized version of this policy
+    private volatile PolicyComponent normalized;
 
     private SPConstants.SPVersion version;
 
@@ -73,69 +77,71 @@ public abstract class AbstractSecurityAs
         return policyComponent == this;
     }
 
-    public void setNormalized(boolean normalized) {
-        this.normalized = normalized;
-    }
-
-    public boolean isNormalized() {
-        return this.normalized;
-    }
-
     @Override
     public PolicyComponent normalize() {
-        Policy policy = new Policy();
-        ExactlyOne exactlyOne = new ExactlyOne();
-        policy.addPolicyComponent(exactlyOne);
-
-        if (isOptional()) {
-            exactlyOne.addPolicyComponent(new All());
-        }
-
-        AbstractSecurityAssertion a = clone(null);
-        a.setNormalized(true);
-        a.setOptional(false);
-
-        All all = new All();
-        all.addPolicyComponent(a);
-        exactlyOne.addPolicyComponent(all);
-
-        return policy;
-    }
-
-    public PolicyComponent normalize(Policy nestedPolicy) {
-        Policy normalizedNestedPolicy = nestedPolicy.normalize(true);
-
-        Policy policy = new Policy();
-        ExactlyOne exactlyOne = new ExactlyOne();
-        policy.addPolicyComponent(exactlyOne);
-
-        if (isOptional()) {
-            exactlyOne.addPolicyComponent(new All());
-        }
-
-        // for all alternatives in normalized nested policy
-        Iterator<List<Assertion>> alternatives = normalizedNestedPolicy.getAlternatives();
-        while (alternatives.hasNext()) {
-            List<Assertion> alternative = alternatives.next();
-
-            Policy ncp = new Policy(nestedPolicy.getPolicyRegistry(), nestedPolicy.getNamespace());
-            ExactlyOne nceo = new ExactlyOne();
-            ncp.addPolicyComponent(nceo);
-
-            All nca = new All();
-            nceo.addPolicyComponent(nca);
-            nca.addPolicyComponents(alternative);
-
-            AbstractSecurityAssertion a = clone(ncp);
-            a.setNormalized(true);
+        if (normalized == null) {
+            Policy policy = new Policy();
+            ExactlyOne exactlyOne = new ExactlyOne();
+            policy.addPolicyComponent(exactlyOne);
+    
+            if (isOptional()) {
+                exactlyOne.addPolicyComponent(new All());
+            }
+    
+            AbstractSecurityAssertion a = clone(null);
+            a.normalized = a;
             a.setOptional(false);
-
+    
             All all = new All();
             all.addPolicyComponent(a);
             exactlyOne.addPolicyComponent(all);
+    
+            normalized = policy;
+        }
+        return normalized;
+    }
+    
+    public boolean isNormalized() {
+        return normalized == this;
+    }
 
+    public PolicyComponent normalize(Policy nestedPolicy) {
+        if (normalized == null) {
+            Policy normalizedNestedPolicy = nestedPolicy.normalize(true);
+    
+            Policy policy = new Policy();
+            ExactlyOne exactlyOne = new ExactlyOne();
+            policy.addPolicyComponent(exactlyOne);
+    
+            if (isOptional()) {
+                exactlyOne.addPolicyComponent(new All());
+            }
+    
+            // for all alternatives in normalized nested policy
+            Iterator<List<Assertion>> alternatives = normalizedNestedPolicy.getAlternatives();
+            while (alternatives.hasNext()) {
+                List<Assertion> alternative = alternatives.next();
+    
+                Policy ncp = new Policy(nestedPolicy.getPolicyRegistry(), nestedPolicy.getNamespace());
+                ExactlyOne nceo = new ExactlyOne();
+                ncp.addPolicyComponent(nceo);
+    
+                All nca = new All();
+                nceo.addPolicyComponent(nca);
+                nca.addPolicyComponents(alternative);
+    
+                AbstractSecurityAssertion a = clone(ncp);
+                a.normalized = a;
+                a.setOptional(false);
+    
+                All all = new All();
+                all.addPolicyComponent(a);
+                exactlyOne.addPolicyComponent(all);
+    
+            }
+            normalized = policy;
         }
-        return policy;
+        return normalized;
     }
 
     public SPConstants.SPVersion getVersion() {
@@ -145,7 +151,7 @@ public abstract class AbstractSecurityAs
     public void serialize(XMLStreamWriter writer, Policy nestedPolicy) throws XMLStreamException {
         writer.writeStartElement(getName().getPrefix(), getName().getLocalPart(), getName().getNamespaceURI());
         writer.writeNamespace(getName().getPrefix(), getName().getNamespaceURI());
-        if (!isNormalized() && isOptional()) {
+        if (isOptional()) {
             writer.writeAttribute(Constants.ATTR_WSP, writer.getNamespaceContext().getNamespaceURI(Constants.ATTR_WSP), Constants.ATTR_OPTIONAL, "true");
         }
         if (isIgnorable()) {
@@ -160,7 +166,6 @@ public abstract class AbstractSecurityAs
     public AbstractSecurityAssertion clone(Policy nestedPolicy) {
         AbstractSecurityAssertion assertion = cloneAssertion(nestedPolicy);
         assertion.setIgnorable(isIgnorable());
-        assertion.setNormalized(isNormalized());
         assertion.setOptional(isOptional());
         return assertion;
     }