diff options
author | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2011-12-01 16:45:57 +0000 |
---|---|---|
committer | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2011-12-01 16:45:57 +0000 |
commit | 959ac6c9a2ce735b02a2f9fb75234326423695ad (patch) | |
tree | 2a5bbfb8d868fc770f00916d5f51b3db514f8ccf /sca-java-2.x/trunk/modules | |
parent | b69be18919d5d912b5ff3f518c3807a954aad9e9 (diff) |
Add a mechanism for specifying default intents on policy subjects. This is a rewrite of the previous attempt after Greg pointed out a build order issue on the mail list.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1209146 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk/modules')
9 files changed, 299 insertions, 5 deletions
diff --git a/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/DefaultIntent.java b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/DefaultIntent.java new file mode 100644 index 0000000000..7f3579a388 --- /dev/null +++ b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/DefaultIntent.java @@ -0,0 +1,53 @@ +/*
+ * 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;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Represents a default intent and the intents that must not be present in order
+ * for this default intent to come into force.
+ */
+public interface DefaultIntent {
+
+ /**
+ * Returns the default intent object
+ *
+ * @return the intent
+ */
+ Intent getIntent();
+
+ /**
+ * Sets the intent object
+ *
+ * @param the intent
+ */
+ void setIntent(Intent intent);
+
+ /**
+ * Returns the list of intent names that must not be present
+ * in order for the default intent to come into play.
+ *
+ * @return the list of mutually exclusive intent names
+ */
+ List<Intent> getMutuallyExclusiveIntents();
+
+}
diff --git a/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/DefaultingPolicySubject.java b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/DefaultingPolicySubject.java new file mode 100644 index 0000000000..8f41d8fb71 --- /dev/null +++ b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/DefaultingPolicySubject.java @@ -0,0 +1,48 @@ +/*
+ * 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;
+
+import java.util.List;
+
+/**
+ * A policy subject is an entity in the assembly with which a policy can be
+ * associated.
+ *
+ * This default extension provides a mechanism of associating default intents
+ * with a policy subject so that the framework will take default intents
+ * into account if no intents are specified by the user.
+ *
+ * Default intents are mainly applicable when an artifact defines mayProvides
+ * intents but the user specified no intents
+ */
+public interface DefaultingPolicySubject extends PolicySubject {
+
+ /**
+ * Default intents are mainly applicable when an
+ * artifact defines mayProvides intents but the
+ * user specified no intents. In some cases the
+ * artifact will implement a default intent so
+ * this collection provides the information for the
+ * framework to determine what those defaults are
+ *
+ * @return A list of default intent records
+ */
+ List<DefaultIntent> getDefaultIntents();
+}
diff --git a/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyFactory.java b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyFactory.java index b23060dafb..b553585c8d 100644 --- a/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyFactory.java +++ b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/PolicyFactory.java @@ -69,4 +69,10 @@ public interface PolicyFactory { * @return */ ExternalAttachment createExternalAttachment(); + + /** + * Create a new DefaultIntent + * @return + */ + DefaultIntent createDefaultIntent(); } diff --git a/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/impl/DefaultIntentImpl.java b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/impl/DefaultIntentImpl.java new file mode 100644 index 0000000000..c7c2426d36 --- /dev/null +++ b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/impl/DefaultIntentImpl.java @@ -0,0 +1,60 @@ +/*
+ * 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.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.policy.DefaultIntent;
+import org.apache.tuscany.sca.policy.Intent;
+
+/**
+ * Represents a default policy intent and the
+ * intents that must not be present for it to
+ * be active
+ */
+public class DefaultIntentImpl implements DefaultIntent {
+
+ private Intent defaultIntent = null;
+ private List<Intent> mutuallyExclusiveIntents = new ArrayList<Intent>();
+
+ protected DefaultIntentImpl() {
+ }
+
+ @Override
+ public Intent getIntent() {
+ return defaultIntent;
+ }
+
+ @Override
+ public void setIntent(Intent defaultIntent) {
+ this.defaultIntent = defaultIntent;
+ }
+
+ @Override
+ public List<Intent> getMutuallyExclusiveIntents() {
+ return mutuallyExclusiveIntents;
+ }
+
+ public String toString() {
+ return String.valueOf(defaultIntent.getName());
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/impl/PolicyFactoryImpl.java b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/impl/PolicyFactoryImpl.java index f700f7c41a..e1561a99b6 100644 --- a/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/impl/PolicyFactoryImpl.java +++ b/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/policy/impl/PolicyFactoryImpl.java @@ -19,6 +19,7 @@ package org.apache.tuscany.sca.policy.impl; import org.apache.tuscany.sca.policy.BindingType; +import org.apache.tuscany.sca.policy.DefaultIntent; import org.apache.tuscany.sca.policy.ExtensionType; import org.apache.tuscany.sca.policy.ImplementationType; import org.apache.tuscany.sca.policy.Intent; @@ -73,4 +74,7 @@ public abstract class PolicyFactoryImpl implements PolicyFactory { return new ExternalAttachmentImpl(); } + public DefaultIntent createDefaultIntent() { + return new DefaultIntentImpl(); + } } diff --git a/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WebServiceBindingBuilder.java b/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WebServiceBindingBuilder.java index 08f8ce7cf4..211e7647d9 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WebServiceBindingBuilder.java +++ b/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WebServiceBindingBuilder.java @@ -19,8 +19,11 @@ package org.apache.tuscany.sca.binding.ws.wsdlgen; +import java.util.List; + import javax.xml.namespace.QName; +import org.apache.tuscany.sca.assembly.Base; import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.Contract; import org.apache.tuscany.sca.assembly.builder.BindingBuilder; @@ -30,6 +33,8 @@ import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.definitions.Definitions; import org.apache.tuscany.sca.policy.BindingType; +import org.apache.tuscany.sca.policy.DefaultingPolicySubject; +import org.apache.tuscany.sca.policy.DefaultIntent; import org.apache.tuscany.sca.policy.Intent; import org.apache.tuscany.sca.policy.PolicyFactory; import org.apache.tuscany.sca.policy.PolicySubject; @@ -42,9 +47,13 @@ import org.apache.tuscany.sca.policy.PolicySubject; public class WebServiceBindingBuilder implements BindingBuilder<WebServiceBinding> { private ExtensionPointRegistry extensionPoints; + private PolicyFactory policyFactory; public WebServiceBindingBuilder(ExtensionPointRegistry extensionPoints) { this.extensionPoints = extensionPoints; + + FactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class); + this.policyFactory = modelFactories.getFactory(PolicyFactory.class); } /** @@ -67,7 +76,51 @@ public class WebServiceBindingBuilder implements BindingBuilder<WebServiceBindin * it implements SOAP.v1_1 by default and hence the default intent * is SOAP.v1_1. Binding.ws doesn't allwaysProvide SOAP.v1_1 though as if the * user specifies the SOAP.v1_2 the binding does SOAP.v1_2 instead of SOAP.v1_1 - */ + * + * This logic is here rather than in the binding model so that the behaviour + * of the implementation is not dictated by the hard coded condifuration of the + * model. This build runs before the policy builders where this information is used + * TODO - can we get this code into the actual impl modules itself. Move this builder? + */ + List<DefaultIntent> defaultIntents = ((DefaultingPolicySubject)binding).getDefaultIntents(); + DefaultIntent defaultIntent = policyFactory.createDefaultIntent(); + + Definitions systemDefinitions = context.getDefinitions(); + if (systemDefinitions != null){ + BindingType bindingType = systemDefinitions.getBindingType(binding.getType()); + for (Intent mayProvideIntent : bindingType.getMayProvidedIntents()){ + if (mayProvideIntent.getName().getLocalPart().equals("SOAP.v1_1")){ + defaultIntent.setIntent(mayProvideIntent); + } + if (mayProvideIntent.getName().getLocalPart().equals("SOAP.v1_2")){ + defaultIntent.getMutuallyExclusiveIntents().add(mayProvideIntent); + } + } + + defaultIntents.add(defaultIntent); + } + + // if the binding may provide SOAP.v1_1 then use this is as the default if no + // other intents are specified +/* + if (intent != null){ + List<DefaultIntent> defaultIntents = ((DefaultingPolicySubject)binding).getDefaultIntents(); + DefaultIntent defaultIntent = policyFactory.createDefaultIntent(); + + // Add the default intent + defaultIntent.setDefaultIntent(intent); + + // Add the names of all of the intents that must not be present in + // order for the default intent to come into force + defaultIntent.getMutuallyExclusiveIntents().add(new QName(Base.SCA11_NS, "SOAP.v1_1")); + defaultIntent.getMutuallyExclusiveIntents().add(new QName(Base.SCA11_NS, "SOAP.v1_2")); + defaultIntent.getMutuallyExclusiveIntents().add(new QName(Base.SCA11_NS, "SOAP")); + + defaultIntents.add(defaultIntent); + } +*/ + +/* boolean addDefaultSOAPIntent = true; for(Intent intent : ((PolicySubject)binding).getRequiredIntents()){ @@ -97,6 +150,7 @@ public class WebServiceBindingBuilder implements BindingBuilder<WebServiceBindin } } } +*/ } diff --git a/sca-java-2.x/trunk/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java b/sca-java-2.x/trunk/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java index 21f7b73756..25991c2970 100644 --- a/sca-java-2.x/trunk/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java +++ b/sca-java-2.x/trunk/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java @@ -45,6 +45,8 @@ import org.apache.tuscany.sca.interfacedef.Interface; import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; +import org.apache.tuscany.sca.policy.DefaultIntent; +import org.apache.tuscany.sca.policy.DefaultingPolicySubject; import org.apache.tuscany.sca.policy.ExtensionType; import org.apache.tuscany.sca.policy.Intent; import org.apache.tuscany.sca.policy.PolicySet; @@ -56,12 +58,13 @@ import org.w3c.dom.Element; * * @version $Rev$ $Date$ */ -class WebServiceBindingImpl implements WebServiceBinding, PolicySubject, Extensible { +class WebServiceBindingImpl implements WebServiceBinding, DefaultingPolicySubject, Extensible { private String name; private String uri; private boolean unresolved; private List<Object> extensions = new ArrayList<Object>(); private List<Extension> attributeExtensions = new ArrayList<Extension>(); + private List<DefaultIntent> defaultIntents = new ArrayList<DefaultIntent>(); private List<Intent> requiredIntents = new ArrayList<Intent>(); private List<PolicySet> policySets = new ArrayList<PolicySet>(); private ExtensionType extensionType; @@ -454,4 +457,9 @@ class WebServiceBindingImpl implements WebServiceBinding, PolicySubject, Extensi public Map<String, String> getWsdliLocations() { return wsdliLocations; } + + @Override + public List<DefaultIntent> getDefaultIntents() { + return defaultIntents; + } } diff --git a/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentPolicyBuilderImpl.java b/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentPolicyBuilderImpl.java index 238a745429..2b5ec445e3 100644 --- a/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentPolicyBuilderImpl.java +++ b/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentPolicyBuilderImpl.java @@ -45,6 +45,8 @@ import org.apache.tuscany.sca.assembly.builder.Messages; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.definitions.Definitions; import org.apache.tuscany.sca.monitor.Monitor; +import org.apache.tuscany.sca.policy.DefaultIntent; +import org.apache.tuscany.sca.policy.DefaultingPolicySubject; import org.apache.tuscany.sca.policy.ExtensionType; import org.apache.tuscany.sca.policy.Intent; import org.apache.tuscany.sca.policy.IntentMap; @@ -382,8 +384,8 @@ public class ComponentPolicyBuilderImpl { return null; } - // Replace qualifiable intents with their default qualifier. This can't be done until - // after inheritance. + // Replace qualifiable intents with their default qualifier. + // This can't be done until after inheritance. protected void expandDefaultIntents(PolicySubject subject, BuilderContext context) { Set<Intent> copy = new HashSet<Intent>(subject.getRequiredIntents()); @@ -392,8 +394,9 @@ public class ComponentPolicyBuilderImpl { subject.getRequiredIntents().remove(i); subject.getRequiredIntents().add(i.getDefaultQualifiedIntent()); } - } + } } + protected void resolveAndNormalize(PolicySubject subject, BuilderContext context) { Definitions definitions = context.getDefinitions(); Set<Intent> intents = new HashSet<Intent>(); @@ -586,5 +589,57 @@ public class ComponentPolicyBuilderImpl { return false; } } + + // Add in default intents. This looks at the default intent map for + // the policy subject and. If none of the mutually exclusive intents are + // already present adds in the default intent. + protected void addDefaultIntents(PolicySubject subject, Object defaultSubjectObject, BuilderContext context){ + if (!(defaultSubjectObject instanceof DefaultingPolicySubject)){ + return; + } + + DefaultingPolicySubject defaultSubject = (DefaultingPolicySubject)defaultSubjectObject; + List<DefaultIntent> defaultIntents = defaultSubject.getDefaultIntents(); + + for(DefaultIntent defaultIntent : defaultIntents){ + // check default intent against the intents already in the subject + boolean addDefaultIntent = true; + + // first check the intents which, if present prevent the default being applied + for (Intent mutualExclusion : defaultIntent.getMutuallyExclusiveIntents()){ + if (subject.getRequiredIntents().contains(mutualExclusion)){ + addDefaultIntent = false; + break; + } + } + + // then check that the default intent itself is not mutually exclusive + for (Intent userDefinedIntent : subject.getRequiredIntents()){ + if (!checkMutualExclusionNoError(defaultIntent.getIntent(), userDefinedIntent, context)){ + addDefaultIntent = false; + break; + } + } + + if (addDefaultIntent == true){ + subject.getRequiredIntents().add(defaultIntent.getIntent()); + } + } + } + + /** + * Same as checkMutualExclusion but doesn't throw and error on failure + */ + protected boolean checkMutualExclusionNoError(Intent i1, Intent i2, BuilderContext context){ + if ((i1 != i2) && + (i1.getExcludedIntents().contains(i2) || + i2.getExcludedIntents().contains(i1) || + checkQualifiedMutualExclusion(i1.getExcludedIntents(), i2) || + checkQualifiedMutualExclusion(i2.getExcludedIntents(), i1))) { + return true; + } + + return false; + } } diff --git a/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositePolicyBuilderImpl.java b/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositePolicyBuilderImpl.java index 2dc149ed60..8d86b5479d 100644 --- a/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositePolicyBuilderImpl.java +++ b/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositePolicyBuilderImpl.java @@ -120,6 +120,9 @@ public class CompositePolicyBuilderImpl extends ComponentPolicyBuilderImpl imple // of the structural hierarchy (Policy spec 4.10) inherit(ep, null, false, componentService.getInterfaceContract().getInterface()); } + + // add in default binding mayProvides intents + addDefaultIntents(ep, ep.getBinding(), context); // Replace profile intents with their required intents // Replace unqualified intents if there is a qualified intent in the list @@ -175,6 +178,9 @@ public class CompositePolicyBuilderImpl extends ComponentPolicyBuilderImpl imple // of the structural hierarchy (Policy spec 4.10) inherit(epr, null, true, componentReference.getInterfaceContract().getInterface()); } + + // add in default binding mayProvides intents + addDefaultIntents(epr, epr.getBinding(), context); // Replace profile intents with their required intents // Replace unqualified intents if there is a qualified intent in the list |