From aa4198ee954c8fae577160b510d9fc94dabded18 Mon Sep 17 00:00:00 2001 From: slaws Date: Mon, 1 Mar 2010 12:55:50 +0000 Subject: 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 --- .../assembly-validation-messages.properties | 3 +- .../builder/impl/ComponentPolicyBuilderImpl.java | 41 ++++++++++++++++++++++ .../runtime/impl/EndpointReferenceBinderImpl.java | 31 +++++++++++++++- 3 files changed, 73 insertions(+), 2 deletions(-) (limited to 'sca-java-2.x') 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 policySets = new HashSet(); 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 */ -- cgit v1.2.3