[ https://issues.apache.org/jira/browse/NEETHI-15?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13780415#comment-13780415 ]
Hudson commented on NEETHI-15: ------------------------------ SUCCESS: Integrated in neethi-trunk #911 (See [https://builds.apache.org/job/neethi-trunk/911/]) [NEETHI-15] Fix policy intersection Patch from Jörn Schneider applied (dkulp: rev 1527049) * /webservices/neethi/trunk/src/main/java/org/apache/neethi/util/PolicyIntersector.java * /webservices/neethi/trunk/src/test/java/org/apache/neethi/IntersectTest.java * /webservices/neethi/trunk/src/test/test-resources/bugs * /webservices/neethi/trunk/src/test/test-resources/bugs/neethi15 * /webservices/neethi/trunk/src/test/test-resources/bugs/neethi15/Policy1-2-lax.xml * /webservices/neethi/trunk/src/test/test-resources/bugs/neethi15/Policy2-1-lax.xml * /webservices/neethi/trunk/src/test/test-resources/bugs/neethi15/input * /webservices/neethi/trunk/src/test/test-resources/bugs/neethi15/input/Policy1.xml * /webservices/neethi/trunk/src/test/test-resources/bugs/neethi15/input/Policy2.xml > Problem in policy intersection caused by error in > PolicyIntersector.compatiblePolicies method > --------------------------------------------------------------------------------------------- > > Key: NEETHI-15 > URL: https://issues.apache.org/jira/browse/NEETHI-15 > Project: Neethi > Issue Type: Bug > Affects Versions: 3.0.2 > Reporter: Jörn Schneider > Assignee: Daniel Kulp > Labels: patch > Fix For: 3.0.3 > > Attachments: inputPolicy1.xml, inputPolicy2.xml, intersect1.xml, > intersect2.xml > > > Playing around with policy intersection I recognized an unexpected result of > getting an empty policy back even though the two intersected policies do have > a common compatible policy assertion alternative. > As examples I was using the first example from chapter 4.5 Policy > Intersection http://www.w3.org/TR/ws-policy/#Policy_Intersection. > Using Neethi the intersected policy returned an empty policy as result even > though Alternative A2 from input Policy P1 and Alternative A3 from input > Policy P2 are compatible alternatives. > What I did was reading the policies from XML file (policies attached) and > just intersecting them: > Policy inputPolicy1 = readPolicy("inputPolicy1.xml"); > Policy inputPolicy2 = readPolicy("inputPolicy2.xml"); > Policy intersectionP1_P2 = inputPolicy1.intersect(inputPolicy2, false); > > I also recognized that changing order while intersecting the policies > returned the expected result: > Policy intersectionP2_P1 = inputPolicy2.intersect(inputPolicy1, false); > The difference was caused by the result of 'compatiblePolicies' method call > used in line 189 of method PolicyIntersector.intersect. The call > compatiblePolicies(inputPolicy1, inputPolicy2) is returning false the > reversed call compatiblePolicies(inputPolicy2, inputPolicy1) returns true. > In addition I also tried the intersection example from the following web page > http://www.ibm.com/developerworks/webservices/tutorials/ws-understand-web-services5/section5.html > I also attached intersect1.xml and intersect2.xml for convenience. > Here always an empty policy was returned by the intersection call independent > of the order the incoming policies were used. A closer look to the > implementation of > method 'PolicyIntersector.compatiblePolicies' revealed the reason. > The return false; statement on line 178 in the outer while loop: > public boolean compatiblePolicies(Policy p1, Policy p2) { > Iterator<List<Assertion>> i1 = p1.getAlternatives(); > while (i1.hasNext()) { > List<Assertion> alt1 = i1.next(); > Iterator<List<Assertion>> i2 = p2.getAlternatives(); > if (!i2.hasNext() && alt1.isEmpty()) { > return true; > } > while (i2.hasNext()) { > List<Assertion> alt2 = i2.next(); > if (compatibleAlternatives(alt1, alt2)) { > return true; > } > } > return false; > } > return true; > } > > The 'return false;' statement inside the outer while loop has the effect that > only the first alternative of Policy p1 is evaluated against all alternatives > from Policy p2. > > My correction proposal is to remove the return statement on line 178 and > change the return statement on line 180 to return false instead of true. With > this changes 'compatiblePolicies' should return true only if compatible > alternatives are found in p1 and p2 and false otherwise. > public boolean compatiblePolicies(Policy p1, Policy p2) { > Iterator<List<Assertion>> i1 = p1.getAlternatives(); > while (i1.hasNext()) { > List<Assertion> alt1 = i1.next(); > Iterator<List<Assertion>> i2 = p2.getAlternatives(); > if (!i2.hasNext() && alt1.isEmpty()) { > return true; > } > while (i2.hasNext()) { > List<Assertion> alt2 = i2.next(); > if (compatibleAlternatives(alt1, alt2)) { > return true; > } > } > } > return false; > } -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@ws.apache.org For additional commands, e-mail: dev-h...@ws.apache.org