summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk
diff options
context:
space:
mode:
authorslaws <slaws@13f79535-47bb-0310-9956-ffa450edef68>2010-03-01 12:55:50 +0000
committerslaws <slaws@13f79535-47bb-0310-9956-ffa450edef68>2010-03-01 12:55:50 +0000
commitaa4198ee954c8fae577160b510d9fc94dabded18 (patch)
treec25f9b94526c50cf5c7c4bcedc9cb1843b494f16 /sca-java-2.x/trunk
parentd8234862d2003940b84b0607b4b7f34e1623f8a4 (diff)
Check that intents are properly satisfied, particularly in the qualified intent case. Raise a warning if not.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@917504 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk')
-rw-r--r--sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties3
-rw-r--r--sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentPolicyBuilderImpl.java41
-rw-r--r--sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java31
3 files changed, 73 insertions, 2 deletions
diff --git a/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties b/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties
index 678513c967..d9fc0b1d58 100644
--- a/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties
+++ b/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties
@@ -71,4 +71,5 @@ MutuallyExclusiveIntents = [POL40009] Intent {0} and {1} are mutually exclusive
PropertyXpathExpressionReturnedNull = The property XPath expression for component {0} property {1} expression {2} did not match anything in the source property
PropertyHasManyValues = The property component {0} property {1} has many values but its "many" attribute is set to false
PropertXSDTypesDontMatch = [ASM_5036] The property component {0} property {1} has XSD type {2} while its component type property has the XSD type {3}
-PropertXSDElementsDontMatch = [ASM_5036] The property component {0} property {1} has XSD element {2} while its component type property has the XSD element {3} \ No newline at end of file
+PropertXSDElementsDontMatch = [ASM_5036] The property component {0} property {1} has XSD element {2} while its component type property has the XSD element {3}
+IntentNotSatisfied = The intent {0} associated with policy subject {1} has not matching policy set \ No newline at end of file
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 0eed2bdb16..0879136e64 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
@@ -338,6 +338,9 @@ public class ComponentPolicyBuilderImpl {
subject.getRequiredIntents().clear();
subject.getRequiredIntents().addAll(intents);
+ // resolve policy set names that have been specified for the
+ // policy subject against the real policy sets from the
+ // definitions files
Set<PolicySet> policySets = new HashSet<PolicySet>();
if (definitions != null) {
for (PolicySet policySet : subject.getPolicySets()) {
@@ -351,23 +354,53 @@ public class ComponentPolicyBuilderImpl {
}
}
+ // find the policy sets that satisfy the intents that are now
+ // attached to the policy subject. From the OASIS policy
+ // spec CD02 rev7:
+ // 1272 A policySet provides an intent if any of the statements are true:
+ // 1273 1. The intent is contained in the policySet @provides list.
+ // 1274 2. The intent is a qualified intent and the unqualified form of the intent is contained in the policySet
+ // 1275 @provides list.
+ // 1276 3. The policySet @provides list contains a qualified form of the intent (where the intent is qualifiable).
for (Intent intent : subject.getRequiredIntents()) {
+ boolean intentMatched = false;
+
loop: for (PolicySet ps : definitions.getPolicySets()) {
// FIXME: We will have to check the policy references and intentMap too
// as well as the appliesTo
if (ps.getProvidedIntents().contains(intent)) {
policySets.add(ps);
+ intentMatched = true;
break;
}
+
+ for (Intent psProvidedIntent : ps.getProvidedIntents()){
+ if (isQualifiedBy(psProvidedIntent, intent)){
+ policySets.add(ps);
+ intentMatched = true;
+ break loop;
+ }
+ }
+
for (IntentMap map : ps.getIntentMaps()) {
for (Qualifier q : map.getQualifiers()) {
if (intent.equals(q.getIntent())) {
policySets.add(ps);
+ intentMatched = true;
break loop;
}
}
}
}
+
+ if (!intentMatched){
+ // Raise a warning as we have an intent that doesn't have a matching
+ // policy set at this start.
+ // TODO - this could be because the intent is provided by and extension
+ // and hence there is no explicit policy set. Need and extra piece
+ // of processing to walk through the extension models.
+ warning(context.getMonitor(), "IntentNotSatisfied", subject, intent.getName(), subject.toString());
+ }
}
subject.getPolicySets().clear();
@@ -387,5 +420,13 @@ public class ComponentPolicyBuilderImpl {
}
return names;
}
+
+ protected boolean isQualifiedBy(Intent qualifiableIntent, Intent qualifiedIntent){
+ if (qualifiedIntent.getQualifiableIntent() == qualifiableIntent){
+ return true;
+ } else {
+ return false;
+ }
+ }
}
diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
index dc007c6a07..a8b8b0691f 100644
--- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
+++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
@@ -43,7 +43,9 @@ import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
import org.apache.tuscany.sca.monitor.Monitor;
import org.apache.tuscany.sca.monitor.MonitorFactory;
import org.apache.tuscany.sca.policy.Intent;
+import org.apache.tuscany.sca.policy.IntentMap;
import org.apache.tuscany.sca.policy.PolicySet;
+import org.apache.tuscany.sca.policy.Qualifier;
import org.apache.tuscany.sca.runtime.EndpointReferenceBinder;
import org.apache.tuscany.sca.runtime.EndpointRegistry;
@@ -466,12 +468,31 @@ public class EndpointReferenceBinderImpl implements EndpointReferenceBinder {
} else {
*/
- for (PolicySet policySet : referencePolicySets){
+ // TODO - this code also appears in the ComponentPolicyBuilder
+ // so should rationalize
+ loop: for (PolicySet policySet : referencePolicySets){
if (policySet.getProvidedIntents().contains(intent)){
eprIntents.remove(intent);
break;
}
+
+ for (Intent psProvidedIntent : policySet.getProvidedIntents()){
+ if (isQualifiedBy(psProvidedIntent, intent)){
+ eprIntents.remove(intent);
+ break loop;
+ }
+ }
+
+ for (IntentMap map : policySet.getIntentMaps()) {
+ for (Qualifier q : map.getQualifiers()) {
+ if (intent.equals(q.getIntent())) {
+ eprIntents.remove(intent);
+ break loop;
+ }
+ }
+ }
}
+
/*
}
*/
@@ -571,6 +592,14 @@ public class EndpointReferenceBinderImpl implements EndpointReferenceBinder {
return match;
}
+ protected boolean isQualifiedBy(Intent qualifiableIntent, Intent qualifiedIntent){
+ if (qualifiedIntent.getQualifiableIntent() == qualifiableIntent){
+ return true;
+ } else {
+ return false;
+ }
+ }
+
/**
* Determine if endpoint reference and endpoint interface contracts match
*/