This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch coheigea/policy-containing-primitive
in repository https://gitbox.apache.org/repos/asf/ws-neethi.git

commit 113d7845c381bdb190e21962870ecfe3ad8478b2
Author: Colm O hEigeartaigh <[email protected]>
AuthorDate: Fri Jul 10 11:45:03 2026 +0100

    Policy Containing Primitive fix
---
 .../PolicyContainingPrimitiveAssertion.java        |  4 ++
 .../builders/xml/XMLPrimitiveAssertionBuilder.java |  1 +
 .../java/org/apache/neethi/BasicTestCases.java     | 16 ++++++++
 .../apache/neethi/PolicyNormalizationDoSTest.java  | 45 ++++++++++++++++++++++
 4 files changed, 66 insertions(+)

diff --git 
a/src/main/java/org/apache/neethi/builders/PolicyContainingPrimitiveAssertion.java
 
b/src/main/java/org/apache/neethi/builders/PolicyContainingPrimitiveAssertion.java
index 87ef19a..c31b00b 100644
--- 
a/src/main/java/org/apache/neethi/builders/PolicyContainingPrimitiveAssertion.java
+++ 
b/src/main/java/org/apache/neethi/builders/PolicyContainingPrimitiveAssertion.java
@@ -29,6 +29,7 @@ import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.neethi.All;
+import org.apache.neethi.AbstractPolicyOperator;
 import org.apache.neethi.Assertion;
 import org.apache.neethi.ExactlyOne;
 import org.apache.neethi.Policy;
@@ -72,6 +73,7 @@ public class PolicyContainingPrimitiveAssertion
         if (isOptional()) {
             ea.addPolicyComponent(new All());
         }
+        long alternativesSoFar = ea.getPolicyComponents().size();
         // for all alternatives in normalized nested policy
         Iterator<List<Assertion>> alternatives = 
normalisedNested.getAlternatives();
         while (alternatives.hasNext()) {
@@ -85,7 +87,9 @@ public class PolicyContainingPrimitiveAssertion
             nea.addPolicyComponent(na);
             na.addPolicyComponents(alternative);
             all.addPolicyComponent(a);
+            
AbstractPolicyOperator.checkMaximumAlternativeCount(alternativesSoFar + 1, 
"normalization");
             ea.addPolicyComponent(all);            
+            alternativesSoFar++;
         } 
         return p;      
     } 
diff --git 
a/src/main/java/org/apache/neethi/builders/xml/XMLPrimitiveAssertionBuilder.java
 
b/src/main/java/org/apache/neethi/builders/xml/XMLPrimitiveAssertionBuilder.java
index e7ce716..7276ecf 100644
--- 
a/src/main/java/org/apache/neethi/builders/xml/XMLPrimitiveAssertionBuilder.java
+++ 
b/src/main/java/org/apache/neethi/builders/xml/XMLPrimitiveAssertionBuilder.java
@@ -90,6 +90,7 @@ public class XMLPrimitiveAssertionBuilder implements 
AssertionBuilder<Element> {
     public Assertion newPolicyContainingAssertion(Element element, Map<QName, 
String> atts, Policy policy) {
         return new PolicyContainingPrimitiveAssertion(getQName(element),
                                       isOptional(element), 
isIgnorable(element),
+                                      atts,
                                       policy);
     }
     
diff --git a/src/test/java/org/apache/neethi/BasicTestCases.java 
b/src/test/java/org/apache/neethi/BasicTestCases.java
index c11420d..618adac 100644
--- a/src/test/java/org/apache/neethi/BasicTestCases.java
+++ b/src/test/java/org/apache/neethi/BasicTestCases.java
@@ -40,6 +40,7 @@ import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
 import org.apache.neethi.builders.PrimitiveAssertion;
+import org.apache.neethi.builders.PolicyContainingPrimitiveAssertion;
 import org.apache.neethi.builders.xml.XMLPrimitiveAssertionBuilder;
 
 import org.junit.Test;
@@ -129,6 +130,21 @@ public class BasicTestCases extends PolicyTestCase {
         assertEquals("Header", el.getLocalName());
     }
 
+    @Test
+    public void testPolicyContainingPrimitiveAssertionPreservesAttributes() 
throws Exception {
+        String text = "<p:Wrapper FooAtt=\"blah\" xmlns:p=\"urn:test\" "
+            + "xmlns:wsp=\"http://www.w3.org/ns/ws-policy\";>"
+            + 
"<wsp:Policy><wsp:ExactlyOne><wsp:All/></wsp:ExactlyOne></wsp:Policy>"
+            + "</p:Wrapper>";
+
+        Assertion as = new 
XMLPrimitiveAssertionBuilder().build(getElementFromString(text),
+                                                                
policyEngine.getAssertionBuilderFactory());
+        assertNotNull(as);
+        assertTrue(as instanceof PolicyContainingPrimitiveAssertion);
+
+        assertEquals("blah", 
((PolicyContainingPrimitiveAssertion)as).getAttribute(new QName("FooAtt")));
+    }
+
     
     private Element getElementFromString(String s) 
         throws ParserConfigurationException, SAXException, IOException {
diff --git a/src/test/java/org/apache/neethi/PolicyNormalizationDoSTest.java 
b/src/test/java/org/apache/neethi/PolicyNormalizationDoSTest.java
index dfbf351..afdd817 100644
--- a/src/test/java/org/apache/neethi/PolicyNormalizationDoSTest.java
+++ b/src/test/java/org/apache/neethi/PolicyNormalizationDoSTest.java
@@ -19,6 +19,10 @@
 
 package org.apache.neethi;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
 import javax.xml.namespace.QName;
 
 import org.apache.neethi.builders.PrimitiveAssertion;
@@ -100,6 +104,18 @@ public class PolicyNormalizationDoSTest extends 
PolicyTestCase {
         }
     }
 
+    @Test
+    public void 
testUnknownPolicyContainingAssertionEnforcesGlobalAlternativeLimit() {
+        Policy policy = 
policyEngine.getPolicy(xmlStream(buildUnknownWrapperAggregationBypassPolicyXml(2,
 13)));
+
+        try {
+            policy.normalize(registry, true);
+            fail("Expected RuntimeException due to global alternative limit");
+        } catch (RuntimeException ex) {
+            assertTrue(ex.getMessage().contains("maximum number of 
alternatives"));
+        }
+    }
+
     // -----------------------------------------------------------------------
     // Helpers
     // -----------------------------------------------------------------------
@@ -166,4 +182,33 @@ public class PolicyNormalizationDoSTest extends 
PolicyTestCase {
         return policy;
     }
 
+    private static InputStream xmlStream(String xml) {
+        return new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
+    }
+
+    private static String buildUnknownWrapperAggregationBypassPolicyXml(int 
branchCount, int branchDepth) {
+        StringBuilder xml = new StringBuilder(4096);
+        xml.append("<wsp:Policy xmlns:wsp=\"http://www.w3.org/ns/ws-policy\"; 
xmlns:p=\"urn:poc\">")
+           .append("<p:Wrapper>")
+           .append("<wsp:Policy>")
+           .append("<wsp:ExactlyOne>");
+
+        for (int branch = 0; branch < branchCount; branch++) {
+            xml.append("<wsp:All>");
+            for (int depth = 0; depth < branchDepth; depth++) {
+                xml.append("<wsp:ExactlyOne>")
+                   
.append("<wsp:All><p:A").append(branch).append('_').append(depth).append("/></wsp:All>")
+                   
.append("<wsp:All><p:B").append(branch).append('_').append(depth).append("/></wsp:All>")
+                   .append("</wsp:ExactlyOne>");
+            }
+            xml.append("</wsp:All>");
+        }
+
+        xml.append("</wsp:ExactlyOne>")
+           .append("</wsp:Policy>")
+           .append("</p:Wrapper>")
+           .append("</wsp:Policy>");
+        return xml.toString();
+    }
+
 }

Reply via email to