summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy')
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java74
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java173
-rw-r--r--sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java190
3 files changed, 437 insertions, 0 deletions
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java b/sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java
new file mode 100644
index 0000000000..6938b72d82
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicy.java
@@ -0,0 +1,74 @@
+/*
+ * 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.policy.PolicyContainer;
+
+/**
+ * The WS-Policy model. Currently defers to the Neethi policy model under the covers.
+ */
+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";
+
+ public final static QName WS_POLICY_QNAME = new QName(WS_POLICY_NS, WS_POLICY);
+
+ private Policy neethiPolicy;
+ private List<Object> policyAssertions = new ArrayList<Object>();
+
+ public QName getSchemaName() {
+ return WS_POLICY_QNAME;
+ }
+
+ public Policy getNeethiPolicy() {
+ return neethiPolicy;
+ }
+
+ public void setNeethiPolicy(Policy neethiPolicy) {
+ this.neethiPolicy = neethiPolicy;
+ }
+
+ public List<Object> getPolicyAssertions(){
+ return policyAssertions;
+ }
+
+ @Override
+ 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/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/WSPolicyBuilder.java b/sca-java-2.x/tags/2.0.1-RC1/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/tags/2.0.1-RC1/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<Policy> {
+
+ public boolean build(Endpoint endpoint, BuilderContext context) {
+ List<WSPolicy> polices = getPolicies(endpoint);
+ System.out.println(endpoint + ": " + polices);
+ return true;
+ }
+
+ public boolean build(EndpointReference endpointReference, BuilderContext context) {
+ List<WSPolicy> polices = getPolicies(endpointReference);
+ System.out.println(endpointReference + ": " + polices);
+ return true;
+ }
+
+ public boolean build(Component component, Implementation implementation, BuilderContext context) {
+ List<WSPolicy> polices = getPolicies(implementation);
+ System.out.println(implementation + ": " + polices);
+ return true;
+ }
+
+ public QName getPolicyType() {
+ return WSPolicy.WS_POLICY_QNAME;
+ }
+
+ public List<QName> 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<PolicyExpression> policyExpressions1 = new ArrayList<PolicyExpression>();
+ List<PolicyExpression> policyExpressions2 = new ArrayList<PolicyExpression>();
+
+ 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<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
+ // 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;
+ }
+
+}
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java b/sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java
new file mode 100644
index 0000000000..cbc234bc47
--- /dev/null
+++ b/sca-java-2.x/tags/2.0.1-RC1/modules/policy-wspolicy/src/main/java/org/apache/tuscany/sca/policy/wspolicy/xml/WSPolicyProcessor.java
@@ -0,0 +1,190 @@
+/*
+ * 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.xml;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.impl.builder.StAXOMBuilder;
+import org.apache.neethi.Constants;
+import org.apache.neethi.PolicyComponent;
+import org.apache.neethi.PolicyEngine;
+import org.apache.neethi.PolicyOperator;
+import org.apache.tuscany.sca.common.xml.stax.reader.XMLDocumentStreamReader;
+import org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
+import org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
+import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.policy.wspolicy.WSPolicy;
+
+/**
+ * Processor for handling xml models of PolicySet definitions
+ *
+ * @version $Rev$ $Date$
+ */
+public class WSPolicyProcessor extends BaseStAXArtifactProcessor implements
+ StAXArtifactProcessor<WSPolicy> {
+
+ protected ExtensionPointRegistry registry;
+ protected StAXArtifactProcessor<Object> extensionProcessor;
+ protected StAXAttributeProcessor<Object> extensionAttributeProcessor;
+ protected XMLInputFactory inputFactory;
+ protected XMLOutputFactory outputFactory;
+
+ public WSPolicyProcessor(ExtensionPointRegistry registry,
+ StAXArtifactProcessor extensionProcessor,
+ StAXAttributeProcessor extensionAttributeProcessor) {
+ this.registry = registry;
+ this.extensionProcessor = extensionProcessor;
+ this.extensionAttributeProcessor = extensionAttributeProcessor;
+
+ FactoryExtensionPoint modelFactories = registry.getExtensionPoint(FactoryExtensionPoint.class);
+ this.inputFactory = modelFactories.getFactory(XMLInputFactory.class);
+ this.outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+ }
+
+ public QName getArtifactType() {
+ return WSPolicy.WS_POLICY_QNAME;
+ }
+
+ public Class<WSPolicy> getModelType() {
+ return WSPolicy.class;
+ }
+
+ public WSPolicy read(XMLStreamReader reader, ProcessorContext context)
+ throws ContributionReadException, XMLStreamException {
+ org.apache.neethi.Policy neethiPolicy = null;
+ XMLDocumentStreamReader doc = new XMLDocumentStreamReader(reader);
+ StAXOMBuilder builder = new StAXOMBuilder(doc);
+ OMElement element = builder.getDocumentElement();
+ neethiPolicy = PolicyEngine.getPolicy(element);
+
+ WSPolicy wsPolicy = new WSPolicy();
+ wsPolicy.setNeethiPolicy(neethiPolicy);
+
+ // normalize the neethi tree so we can easily identify
+ // the policy alternatives
+/* Messes up the hierarchy if rampart config policies included
+ try {
+ neethiPolicy.normalize(true);
+ } catch (UnsupportedOperationException ex){
+ // RampartConfig policies don't support this yet
+ }
+*/
+
+ // 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(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
+ // 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
+ // 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(policyAssertions, (PolicyComponent)childComponent, context);
+ }
+ } else {
+ try {
+ // TODO - not sure we should keep the neethi model but hack for the
+ // time being to get Tuscany processors to process the OMElements
+ // within the neethi model
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ XMLStreamWriter writer = outputFactory.createXMLStreamWriter(outputStream);
+
+ policyComponent.serialize(writer);
+ writer.flush();
+ writer.close();
+ outputStream.flush();
+ outputStream.close();
+
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+ XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream);
+
+ Object neethiAssertion = policyComponent;
+ Object tuscanyAssertion = extensionProcessor.read(reader, context);
+
+ if (tuscanyAssertion != null) {
+ policyAssertions.add(tuscanyAssertion);
+ } else {
+ // add neethi assertion
+ policyAssertions.add(neethiAssertion);
+ }
+ } catch (Exception ex) {
+ // TODO - report the error properly
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ public void write(WSPolicy wsPolicy, XMLStreamWriter writer, ProcessorContext context)
+ throws ContributionWriteException, XMLStreamException {
+
+ // Write an <sca:policySet>
+ writer.writeStartElement(WSPolicy.WS_POLICY_NS, WSPolicy.WS_POLICY);
+
+ if (wsPolicy != null) {
+ wsPolicy.getNeethiPolicy().serialize(writer);
+ }
+
+ writer.writeEndElement();
+ }
+
+ public void resolve(WSPolicy wsPolicy, ModelResolver resolver, ProcessorContext context)
+ throws ContributionResolveException {
+
+ // resolve policy assertions
+ }
+
+}