diff options
Diffstat (limited to 'sca-java-2.x/trunk/modules/policy-wspolicy/src')
3 files changed, 52 insertions, 22 deletions
diff --git a/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java b/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java index 2893072165..843f370df6 100644 --- a/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java +++ b/sca-java-2.x/trunk/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java @@ -33,6 +33,7 @@ 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.PolicyContainer; import org.apache.tuscany.sca.policy.PolicyExpression; import org.apache.tuscany.sca.policy.PolicySet; import org.apache.tuscany.sca.policy.PolicySubject; @@ -41,7 +42,7 @@ import org.apache.tuscany.sca.policy.wspolicy.xml.WSPolicyProcessor; /** * The WS-Policy model. Currently defers to the Neethi policy model under the covers. */ -public class WSPolicy { +public class WSPolicy implements PolicyContainer { public final static String WS_POLICY_NS = "http://schemas.xmlsoap.org/ws/2004/09/policy"; public final static String WS_POLICY = "Policy"; @@ -71,4 +72,15 @@ public class WSPolicy { public String toString() { return "WSPolicy [" + neethiPolicy + "]"; } + + public <T> Object getChildPolicy(Class<T> policyType) { + for (Object alternative : policyAssertions){ + for (Object policy : (List<Object>)alternative){ + if (policyType.isInstance(policy)){ + return policy; + } + } + } + return null; + } } 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 e42086abe1..d6bd710ed9 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 @@ -34,7 +34,6 @@ 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; -import org.apache.tuscany.sca.policy.wspolicy.xml.WSPolicyProcessor; /** * Processing for WS-Policy objects @@ -43,19 +42,19 @@ import org.apache.tuscany.sca.policy.wspolicy.xml.WSPolicyProcessor; public class WSPolicyBuilder implements PolicyBuilder<Policy> { public boolean build(Endpoint endpoint, BuilderContext context) { - List<Policy> polices = getPolicies(endpoint); + List<WSPolicy> polices = getPolicies(endpoint); System.out.println(endpoint + ": " + polices); return true; } public boolean build(EndpointReference endpointReference, BuilderContext context) { - List<Policy> polices = getPolicies(endpointReference); + List<WSPolicy> polices = getPolicies(endpointReference); System.out.println(endpointReference + ": " + polices); return true; } public boolean build(Component component, Implementation implementation, BuilderContext context) { - List<Policy> polices = getPolicies(implementation); + List<WSPolicy> polices = getPolicies(implementation); System.out.println(implementation + ": " + polices); return true; } @@ -68,18 +67,6 @@ public class WSPolicyBuilder implements PolicyBuilder<Policy> { return null; } - private List<Policy> getPolicies(PolicySubject subject) { - List<Policy> polices = new ArrayList<Policy>(); - for (PolicySet ps : subject.getPolicySets()) { - for (PolicyExpression exp : ps.getPolicies()) { - if (getPolicyType().equals(exp.getName())) { - polices.add((Policy)exp.getPolicy()); - } - } - } - return polices; - } - public boolean build(EndpointReference endpointReference, Endpoint endpoint, BuilderContext context) { // TODO - neethi doesn't include code for matching ws policy @@ -147,6 +134,18 @@ public class WSPolicyBuilder implements PolicyBuilder<Policy> { return true; } + private List<WSPolicy> getPolicies(PolicySubject subject) { + List<WSPolicy> polices = new ArrayList<WSPolicy>(); + 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 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 33b1b8ee04..ee2d539be3 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 @@ -23,6 +23,8 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; import javax.xml.namespace.QName; import javax.xml.stream.XMLInputFactory; @@ -102,13 +104,24 @@ public class WSPolicyProcessor extends BaseStAXArtifactProcessor implements WSPolicy wsPolicy = new WSPolicy(); wsPolicy.setNeethiPolicy(neethiPolicy); - // read policy assertions - readPolicyAssertions(wsPolicy,neethiPolicy, context); + // normalize the neethi tree so we can easily identify + // the policy alternatives + neethiPolicy.normalize(true); + + // top-level children of ExactlyOne are policy alternatives so + // for each child create a policy model list and pull the + // policies out + for(Object alternative : neethiPolicy.getPolicyComponents()) { + List<Object> assertions = new ArrayList<Object>(); + readPolicyAssertions(assertions, (PolicyComponent)alternative, context); + wsPolicy.getPolicyAssertions().add(assertions); + } + return wsPolicy; } - private void readPolicyAssertions(WSPolicy wsPolicy, PolicyComponent policyComponent, ProcessorContext context){ + private void readPolicyAssertions(List<Object> policyAssertions, PolicyComponent policyComponent, ProcessorContext context){ // recurse into the policy alternatives // TODO - lots of todos here as this just walks down the neethi hierarchy @@ -116,12 +129,14 @@ public class WSPolicyProcessor extends BaseStAXArtifactProcessor implements // regard to the policy alternatives. Undecided about whether to // commit to prepresenting this hierarchy in Tuscany or whether // to rely on neethi + // Should this be in the builder? Not really as this drives the + // Tuscany specific readers if (policyComponent.getType() != Constants.TYPE_ASSERTION){ PolicyOperator policyOperator = (PolicyOperator)policyComponent; for(Object childComponent : policyOperator.getPolicyComponents()){ // TODO - create assertion hierarchy in wsPolicy model // how we do this depends on if we continue to use neethi - readPolicyAssertions(wsPolicy, (PolicyComponent)childComponent, context); + readPolicyAssertions(policyAssertions, (PolicyComponent)childComponent, context); } } else { try { @@ -136,10 +151,14 @@ public class WSPolicyProcessor extends BaseStAXArtifactProcessor implements ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream); + Object neethiAssertion = policyComponent; Object tuscanyAssertion = extensionProcessor.read(reader, context); if (tuscanyAssertion != null) { - wsPolicy.getPolicyAssertions().add(tuscanyAssertion); + policyAssertions.add(tuscanyAssertion); + } else { + // add neethi assertion + policyAssertions.add(neethiAssertion); } } catch (Exception ex) { // TODO - report the error properly |