From e5b7380c874745c989d1816b8f552504f038e1bc Mon Sep 17 00:00:00 2001 From: lresende Date: Thu, 26 Sep 2013 20:33:20 +0000 Subject: 2.0 branch for possible maintenance release git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1526672 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/policy/wspolicy/WSPolicyBuilder.java | 173 +++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 sca-java-2.x/branches/2.0/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java (limited to 'sca-java-2.x/branches/2.0/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java') diff --git a/sca-java-2.x/branches/2.0/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java b/sca-java-2.x/branches/2.0/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java new file mode 100644 index 0000000000..d6bd710ed9 --- /dev/null +++ b/sca-java-2.x/branches/2.0/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java @@ -0,0 +1,173 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.policy.wspolicy; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.namespace.QName; + +import org.apache.neethi.Policy; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.Endpoint; +import org.apache.tuscany.sca.assembly.EndpointReference; +import org.apache.tuscany.sca.assembly.Implementation; +import org.apache.tuscany.sca.assembly.builder.BuilderContext; +import org.apache.tuscany.sca.assembly.builder.PolicyBuilder; +import org.apache.tuscany.sca.policy.PolicyExpression; +import org.apache.tuscany.sca.policy.PolicySet; +import org.apache.tuscany.sca.policy.PolicySubject; + +/** + * Processing for WS-Policy objects + * TBD + */ +public class WSPolicyBuilder implements PolicyBuilder { + + public boolean build(Endpoint endpoint, BuilderContext context) { + List polices = getPolicies(endpoint); + System.out.println(endpoint + ": " + polices); + return true; + } + + public boolean build(EndpointReference endpointReference, BuilderContext context) { + List polices = getPolicies(endpointReference); + System.out.println(endpointReference + ": " + polices); + return true; + } + + public boolean build(Component component, Implementation implementation, BuilderContext context) { + List polices = getPolicies(implementation); + System.out.println(implementation + ": " + polices); + return true; + } + + public QName getPolicyType() { + return WSPolicy.WS_POLICY_QNAME; + } + + public List getSupportedBindings() { + return null; + } + + 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; + } + + private List getPolicies(PolicySubject subject) { + List polices = new ArrayList(); + for (PolicySet ps : subject.getPolicySets()) { + for (PolicyExpression exp : ps.getPolicies()) { + if (getPolicyType().equals(exp.getName())) { + polices.add((WSPolicy)exp.getPolicy()); + } + } + } + return polices; + } + + 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 + + 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; + } + +} -- cgit v1.2.3