From f04add1ce98eb1bd8885ce008490fe012673a06f Mon Sep 17 00:00:00 2001 From: slaws Date: Wed, 20 Jan 2010 12:00:53 +0000 Subject: Dummy matching code. Needs to be replaced with a WS policy interception algorithm. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@901151 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/policy/wspolicy/WSPolicyBuilder.java | 89 +++++++++++++++++++++- .../sca/policy/wspolicy/xml/WSPolicyProcessor.java | 7 +- 2 files changed, 91 insertions(+), 5 deletions(-) diff --git a/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java b/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java index 3bc0d0423d..aa883970de 100644 --- a/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java +++ b/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java @@ -77,13 +77,94 @@ public class WSPolicyBuilder implements PolicyBuilder { } public boolean build(EndpointReference endpointReference, Endpoint endpoint, BuilderContext context) { + + // TODO - neethi doesn't include code for matching ws policy + // cxf have the class Intersector http://svn.apache.org/repos/asf/cxf/trunk/api/src/main/java/org/apache/cxf/ws/policy/Intersector.java + // but this does its work based on the cxf AssertionBuilders and extension + // registry mechanism. I don't want to commit to that at the moment. + // + // At the moment we do the simplest top level QName based matching + + // match EPR policy sets + for (PolicySet eprPolicySet : endpointReference.getPolicySets()){ + for (PolicySet epPolicySet : endpoint.getPolicySets()){ + if (!build(eprPolicySet, epPolicySet)){ + return false; + } + } + } + + // match EP policy sets + for (PolicySet epPolicySet : endpoint.getPolicySets()){ + for (PolicySet eprPolicySet : endpointReference.getPolicySets()){ + if (!build(epPolicySet, eprPolicySet)){ + return false; + } + } + } + + return true; + } + + private boolean build(PolicySet policySet1, PolicySet policySet2){ + + // extract the ws policy expressions out of the policy sets + List policyExpressions1 = new ArrayList(); + List policyExpressions2 = new ArrayList(); + + for (PolicyExpression policyExpression : policySet1.getPolicies()){ + if (policyExpression.getName().equals(getPolicyType())){ + policyExpressions1.add(policyExpression); + } + } + + for (PolicyExpression policyExpression : policySet2.getPolicies()){ + if (policyExpression.getName().equals(getPolicyType())){ + policyExpressions2.add(policyExpression); + } + } + + // Match the first set of expressions against the second set + for (PolicyExpression policyExpression1 : policyExpressions1){ + for (PolicyExpression policyExpression2 : policyExpressions2){ + if (!build((WSPolicy)policyExpression1.getPolicy(), + (WSPolicy)policyExpression2.getPolicy())){ + return false; + } + } + } + + // TODO set the reference policy set to include an interception of the + // ws policy sets discovered here + // Do we really need to do this? + // The method is called in both directions (reference to service and + // service to reference) so would need to fix that + return true; } - public PolicyExpression match(EndpointReference endpointReference, Endpoint endpoint, BuilderContext context) { - // Get the ws-policy elements from the endpoint reference and endpoint and work out the intersection + private boolean build(WSPolicy wsPolicy1, WSPolicy wsPolicy2){ + // TODO - cheating here as we assume a flat policy structure + // we've read all the policy assertions into Tuscany models + // in the reader (without taking account of alternatives) + // so we just compare those here + // The real implementation of this comparison depends on how + // we decide to represent the ws policy hierarchy - return null; - } + for (Object policyAssertion1 : wsPolicy1.getPolicyAssertions()){ + boolean matched = false; + for (Object policyAssertion2 : wsPolicy2.getPolicyAssertions()){ + if (policyAssertion1.getClass() == policyAssertion2.getClass()){ + matched = true; + break; + } + } + if(!matched){ + return false; + } + } + + return true; + } } diff --git a/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java b/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java index 559cb3525d..33b1b8ee04 100644 --- a/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java +++ b/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java @@ -111,6 +111,11 @@ public class WSPolicyProcessor extends BaseStAXArtifactProcessor implements private void readPolicyAssertions(WSPolicy wsPolicy, PolicyComponent policyComponent, ProcessorContext context){ // recurse into the policy alternatives + // TODO - lots of todos here as this just walks down the neethi hierarchy + // looking for assertions to drive Tuscany processors without + // regard to the policy alternatives. Undecided about whether to + // commit to prepresenting this hierarchy in Tuscany or whether + // to rely on neethi if (policyComponent.getType() != Constants.TYPE_ASSERTION){ PolicyOperator policyOperator = (PolicyOperator)policyComponent; for(Object childComponent : policyOperator.getPolicyComponents()){ @@ -122,7 +127,7 @@ public class WSPolicyProcessor extends BaseStAXArtifactProcessor implements try { // TODO - not sure we should keep the neethi model but hack for the // time being to get Tuscany processors to process the OMElements - // help within the neethi model + // within the neethi model ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); XMLStreamWriter writer = outputFactory.createXMLStreamWriter(outputStream); -- cgit v1.2.3