Moved util methods from PolicyResolver 89/19989/2
authorMartin Sunal <msunal@cisco.com>
Sun, 10 May 2015 18:05:09 +0000 (20:05 +0200)
committerMartin Sunal <msunal@cisco.com>
Mon, 11 May 2015 09:05:13 +0000 (09:05 +0000)
Most of methods in PolicyResolver are util mehtods
so these methods are moved to new *ResolverUtils classes.

Signed-off-by: Martin Sunal <msunal@cisco.com>
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ContractResolverUtils.java [new file with mode: 0644]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolverUtils.java [new file with mode: 0644]
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/SubjectResolverUtils.java [new file with mode: 0644]
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolverTest.java

diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ContractResolverUtils.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/ContractResolverUtils.java
new file mode 100644 (file)
index 0000000..ccbea04
--- /dev/null
@@ -0,0 +1,269 @@
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.concurrent.Immutable;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ConsumerSelectionRelator;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ProviderSelectionRelator;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelector;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.Table;
+
+
+public class ContractResolverUtils {
+
+    private ContractResolverUtils() {
+        throw new UnsupportedOperationException("Cannot create an instance");
+    }
+
+    /**
+     * Choose the contracts that are in scope for each pair of endpoint groups,
+     * then perform subject selection for the pair
+     */
+    protected static Table<EgKey, EgKey, List<ContractMatch>> selectContracts(Set<IndexedTenant> tenants) {
+        Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches = HashBasedTable.create();
+        Table<EgKey, EgKey, List<ContractMatch>> contractMatches = HashBasedTable.create();
+
+        for (IndexedTenant tenant : tenants) {
+            selectContracts(consumerMatches, contractMatches, tenant.getTenant());
+        }
+        return contractMatches;
+    }
+
+    protected static void selectContracts(Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches,
+            Table<EgKey, EgKey, List<ContractMatch>> contractMatches, Tenant tenant) {
+        // For each endpoint group, match consumer selectors
+        // against contracts to get a set of matching consumer selectors
+        if (tenant.getEndpointGroup() == null)
+            return;
+        for (EndpointGroup group : tenant.getEndpointGroup()) {
+            List<ConsumerContractMatch> r = matchConsumerContracts(tenant, group);
+            for (ConsumerContractMatch ccm : r) {
+                List<ConsumerContractMatch> cms = consumerMatches.get(tenant.getId(), ccm.contract.getId());
+                if (cms == null) {
+                    cms = new ArrayList<>();
+                    consumerMatches.put(tenant.getId(), ccm.contract.getId(), cms);
+                }
+                cms.add(ccm);
+            }
+        }
+
+        // Match provider selectors, and check each match for a corresponding
+        // consumer selector match.
+        for (EndpointGroup group : tenant.getEndpointGroup()) {
+            List<ContractMatch> matches = matchProviderContracts(tenant, group, consumerMatches);
+            for (ContractMatch cm : matches) {
+                EgKey consumerKey = new EgKey(cm.consumerTenant.getId(), cm.consumer.getId());
+                EgKey providerKey = new EgKey(cm.providerTenant.getId(), cm.provider.getId());
+                List<ContractMatch> egPairMatches = contractMatches.get(consumerKey, providerKey);
+                if (egPairMatches == null) {
+                    egPairMatches = new ArrayList<>();
+                    contractMatches.put(consumerKey, providerKey, egPairMatches);
+                }
+
+                egPairMatches.add(cm);
+            }
+        }
+    }
+
+    private static List<ConsumerContractMatch> matchConsumerContracts(Tenant tenant,
+            EndpointGroup consumer) {
+        List<ConsumerContractMatch> matches = new ArrayList<>();
+        if (consumer.getConsumerNamedSelector() != null) {
+            for (ConsumerNamedSelector cns : consumer.getConsumerNamedSelector()) {
+                if (cns.getContract() == null)
+                    continue;
+                for (ContractId contractId : cns.getContract()) {
+                    Contract contract =
+                            TenantUtils.findContract(tenant, contractId);
+                    if (contract == null)
+                        continue;
+                    matches.add(new ConsumerContractMatch(tenant, contract,
+                            tenant, consumer,
+                            cns));
+                }
+            }
+        }
+        if (consumer.getConsumerTargetSelector() != null) {
+            for (ConsumerTargetSelector cts : consumer.getConsumerTargetSelector()) {
+                if (tenant.getContract() == null)
+                    continue;
+                for (Contract contract : tenant.getContract()) {
+                    if (contract.getTarget() == null)
+                        continue;
+                    for (Target t : contract.getTarget()) {
+                        boolean match = true;
+                        if (cts.getQualityMatcher() != null) {
+                            for (QualityMatcher m : cts.getQualityMatcher()) {
+                                if (!MatcherUtils.applyQualityMatcher(m, t)) {
+                                    match = false;
+                                    break;
+                                }
+                            }
+                        }
+                        if (match) {
+                            matches.add(new ConsumerContractMatch(tenant,
+                                    contract,
+                                    tenant,
+                                    consumer,
+                                    cts));
+                        }
+                    }
+                }
+            }
+        }
+        // TODO match selectors also against contract references
+        // for (ConsumerTargetSelector cts :
+        // consumer.getConsumerTargetSelector()) {
+        // if (tenant.getContractRef() == null) continue;
+        // for (ContractRef c : tenant.getContractRef()) {
+        //
+        // }
+        // }
+        return matches;
+    }
+
+    private static List<ContractMatch> matchProviderContracts(Tenant tenant, EndpointGroup provider,
+            Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches) {
+        List<ContractMatch> matches = new ArrayList<>();
+        if (provider.getProviderNamedSelector() != null) {
+            for (ProviderNamedSelector pns : provider.getProviderNamedSelector()) {
+                if (pns.getContract() == null)
+                    continue;
+                for (ContractId contractId : pns.getContract()) {
+                    Contract c = TenantUtils.findContract(tenant, contractId);
+                    if (c == null)
+                        continue;
+                    List<ConsumerContractMatch> cMatches = consumerMatches.get(tenant.getId(), c.getId());
+                    amendContractMatches(matches, cMatches, tenant, provider, pns);
+                }
+            }
+        }
+        if (provider.getProviderTargetSelector() != null) {
+            for (ProviderTargetSelector pts : provider.getProviderTargetSelector()) {
+                if (tenant.getContract() == null)
+                    continue;
+                for (Contract c : tenant.getContract()) {
+                    if (c.getTarget() == null)
+                        continue;
+                    for (Target t : c.getTarget()) {
+                        boolean match = true;
+                        if (pts.getQualityMatcher() != null) {
+                            for (QualityMatcher m : pts.getQualityMatcher()) {
+                                if (!MatcherUtils.applyQualityMatcher(m, t)) {
+                                    match = false;
+                                    break;
+                                }
+                            }
+                        }
+                        if (match) {
+                            List<ConsumerContractMatch> cMatches = consumerMatches.get(tenant.getId(), c.getId());
+                            amendContractMatches(matches, cMatches, tenant, provider, pts);
+
+                        }
+                    }
+                }
+            }
+        }
+        return matches;
+    }
+
+    private static void amendContractMatches(List<ContractMatch> matches,
+            List<ConsumerContractMatch> cMatches,
+            Tenant tenant, EndpointGroup provider,
+            ProviderSelectionRelator relator) {
+        if (cMatches == null)
+            return;
+        for (ConsumerContractMatch cMatch : cMatches) {
+            matches.add(new ContractMatch(cMatch, tenant, provider, relator));
+        }
+    }
+
+    /**
+     * Represents a selected contract made by endpoint groups matching it using
+     * selection relators. This is the result of the contract selection phase.
+     *
+     * @author readams
+     */
+    @Immutable
+    protected static class ContractMatch extends ConsumerContractMatch {
+
+        /**
+         * The tenant ID of the provider endpoint group
+         */
+        final Tenant providerTenant;
+
+        /**
+         * The provider endpoint group
+         */
+        final EndpointGroup provider;
+
+        /**
+         * The provider selection relator that was used to match the contract
+         */
+        final ProviderSelectionRelator providerRelator;
+
+        public ContractMatch(ConsumerContractMatch consumerMatch, Tenant providerTenant, EndpointGroup provider,
+                ProviderSelectionRelator providerRelator) {
+            super(consumerMatch.contractTenant, consumerMatch.contract, consumerMatch.consumerTenant,
+                    consumerMatch.consumer, consumerMatch.consumerRelator);
+            this.providerTenant = providerTenant;
+            this.provider = provider;
+            this.providerRelator = providerRelator;
+        }
+    }
+
+    @Immutable
+    protected static class ConsumerContractMatch {
+
+        /**
+         * The tenant of the matching contract
+         */
+        final Tenant contractTenant;
+
+        /**
+         * The matching contract
+         */
+        final Contract contract;
+
+        /**
+         * The tenant for the endpoint group
+         */
+        final Tenant consumerTenant;
+
+        /**
+         * The consumer endpoint group
+         */
+        final EndpointGroup consumer;
+
+        /**
+         * The consumer selection relator that was used to match the contract
+         */
+        final ConsumerSelectionRelator consumerRelator;
+
+        public ConsumerContractMatch(Tenant contractTenant, Contract contract, Tenant consumerTenant,
+                EndpointGroup consumer, ConsumerSelectionRelator consumerRelator) {
+            super();
+            this.contractTenant = contractTenant;
+            this.contract = contract;
+            this.consumerTenant = consumerTenant;
+            this.consumer = consumer;
+            this.consumerRelator = consumerRelator;
+        }
+    }
+
+}
index 8fe0a5ddecced97539a172b34ae7798b5e9ef77a..6afeb3ec847ca307046b179279f302ca83d600f6 100644 (file)
@@ -8,9 +8,7 @@
 
 package org.opendaylight.groupbasedpolicy.resolver;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -31,32 +29,8 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ConsumerSelectionRelator;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher.MatchType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ProviderSelectionRelator;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.Condition;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcher;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroup;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Clause;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Subject;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.GroupIdentificationConstraints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.GroupRequirementConstraintCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.GroupCapabilityConstraintCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelector;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -65,9 +39,6 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Ordering;
 import com.google.common.collect.Sets;
 import com.google.common.collect.Table;
 import com.google.common.collect.Table.Cell;
@@ -345,13 +316,9 @@ public class PolicyResolver implements AutoCloseable {
     protected void updatePolicy() {
         try {
             Map<EgKey, Set<ConditionSet>> egConditions = new HashMap<>();
-            Table<EgKey, EgKey, Policy> policyMap =
-                    resolvePolicy(resolvedTenants.values(),
-                            egConditions);
-            Set<EgKey> updatedGroups =
-                    updatePolicy(policyMap,
-                            egConditions,
-                            policyListenerScopes);
+            Set<IndexedTenant> indexedTenants = getIndexedTenants(resolvedTenants.values());
+            Table<EgKey, EgKey, Policy> policyMap = PolicyResolverUtils.resolvePolicy(indexedTenants, egConditions);
+            Set<EgKey> updatedGroups = updatePolicy(policyMap, egConditions, policyListenerScopes);
 
             notifyListeners(updatedGroups);
         } catch (Exception e) {
@@ -359,444 +326,14 @@ public class PolicyResolver implements AutoCloseable {
         }
     }
 
-    /**
-     * Resolve the policy in three phases: (1) select contracts that in scope
-     * based on contract selectors. (2) select subjects that are in scope for
-     * each contract based on matchers in clauses (3) resolve the set of
-     * in-scope contracts into a list of subjects that apply for each pair of
-     * endpoint groups and the conditions that can apply for for each endpoint
-     * in those groups.
-     */
-    protected Table<EgKey, EgKey, Policy>
-            resolvePolicy(Collection<TenantContext> tenants,
-                    Map<EgKey, Set<ConditionSet>> egConditions) {
-        // select contracts that apply for the given tenant
-        Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
-                selectContracts(tenants);
-
-        // select subjects for the matching contracts and resolve the policy
-        // for endpoint group pairs. This does phase (2) and (3) as one step
-        return selectSubjects(contractMatches, egConditions);
-    }
-
-    /**
-     * Choose the contracts that are in scope for each pair of endpoint groups,
-     * then perform subject selection for the pair
-     */
-    protected Table<EgKey, EgKey, List<ContractMatch>>
-            selectContracts(Collection<TenantContext> tenants) {
-        Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches =
-                HashBasedTable.create();
-        Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
-                HashBasedTable.create();
-
-        for (TenantContext tenant : tenants) {
+    private Set<IndexedTenant> getIndexedTenants(Collection<TenantContext> tenantCtxs) {
+        Set<IndexedTenant> result = new HashSet<>();
+        for (TenantContext tenant : tenantCtxs) {
             IndexedTenant t = tenant.tenant.get();
-            if (t == null)
-                continue;
-            selectContracts(consumerMatches,
-                    contractMatches,
-                    t.getTenant());
-        }
-        return contractMatches;
-    }
-
-    protected void selectContracts(Table<TenantId,
-            ContractId,
-            List<ConsumerContractMatch>> consumerMatches,
-            Table<EgKey, EgKey,
-            List<ContractMatch>> contractMatches,
-            Tenant tenant) {
-        // For each endpoint group, match consumer selectors
-        // against contracts to get a set of matching consumer selectors
-        if (tenant.getEndpointGroup() == null)
-            return;
-        for (EndpointGroup group : tenant.getEndpointGroup()) {
-            List<ConsumerContractMatch> r =
-                    matchConsumerContracts(tenant, group);
-            for (ConsumerContractMatch ccm : r) {
-                List<ConsumerContractMatch> cms =
-                        consumerMatches.get(tenant.getId(),
-                                ccm.contract.getId());
-                if (cms == null) {
-                    cms = new ArrayList<>();
-                    consumerMatches.put(tenant.getId(),
-                            ccm.contract.getId(), cms);
-                }
-                cms.add(ccm);
-            }
-        }
-
-        // Match provider selectors, and check each match for a corresponding
-        // consumer selector match.
-        for (EndpointGroup group : tenant.getEndpointGroup()) {
-            List<ContractMatch> matches =
-                    matchProviderContracts(tenant, group, consumerMatches);
-            for (ContractMatch cm : matches) {
-                EgKey consumerKey = new EgKey(cm.consumerTenant.getId(),
-                        cm.consumer.getId());
-                EgKey providerKey = new EgKey(cm.providerTenant.getId(),
-                        cm.provider.getId());
-                List<ContractMatch> egPairMatches =
-                        contractMatches.get(consumerKey, providerKey);
-                if (egPairMatches == null) {
-                    egPairMatches = new ArrayList<>();
-                    contractMatches.put(consumerKey, providerKey,
-                            egPairMatches);
-                }
-
-                egPairMatches.add(cm);
-            }
-        }
-    }
-
-    private boolean clauseMatchesByGroupReqAndCapConstraints(Clause clause, ContractMatch match) {
-        if (clause.getConsumerMatchers() != null) {
-            GroupIdentificationConstraints groupIdentificationConstraintsConsumer = clause.getConsumerMatchers()
-                    .getGroupIdentificationConstraints();
-            if (groupIdentificationConstraintsConsumer instanceof GroupRequirementConstraintCase) {
-                List<RequirementMatcher> reqMatchers = ((GroupRequirementConstraintCase) groupIdentificationConstraintsConsumer)
-                        .getRequirementMatcher();
-                if (reqMatchers != null) {
-                    for (RequirementMatcher reqMatcher : reqMatchers) {
-                        if (!MatcherUtils.applyReqMatcher(reqMatcher,
-                                match.consumerRelator)) {
-                            return false;
-                        }
-                    }
-                }
-            }
-        }
-        if (clause.getProviderMatchers() != null) {
-            org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.GroupIdentificationConstraints groupIdentificationConstraintsProvider = clause
-                    .getProviderMatchers().getGroupIdentificationConstraints();
-            if (groupIdentificationConstraintsProvider instanceof GroupCapabilityConstraintCase) {
-                List<CapabilityMatcher> capMatchers = ((GroupCapabilityConstraintCase) groupIdentificationConstraintsProvider)
-                        .getCapabilityMatcher();
-
-                if (capMatchers != null) {
-                    for (CapabilityMatcher capMatcher : capMatchers) {
-                        if (!MatcherUtils.applyCapMatcher(capMatcher,
-                                match.providerRelator)) {
-                            return false;
-                        }
-                    }
-                }
-            }
+            if (t != null)
+                result.add(t);
         }
-        return true;
-    }
-
-    private ConditionSet buildConditionSet(List<ConditionMatcher> condMatchers) {
-        if (condMatchers == null)
-            return ConditionSet.EMPTY;
-
-        ImmutableSet.Builder<ConditionName> allb = ImmutableSet.builder();
-        ImmutableSet.Builder<ConditionName> noneb = ImmutableSet.builder();
-        ImmutableSet.Builder<Set<ConditionName>> anyb =
-                ImmutableSet.builder();
-        for (ConditionMatcher condMatcher : condMatchers) {
-            if (condMatcher.getCondition() == null)
-                continue;
-            MatchType type = condMatcher.getMatchType();
-            if (type == null)
-                type = MatchType.All;
-            if (type.equals(MatchType.Any)) {
-                ImmutableSet.Builder<ConditionName> a =
-                        ImmutableSet.builder();
-                for (Condition c : condMatcher.getCondition()) {
-                    a.add(c.getName());
-                }
-                anyb.add(a.build());
-            } else {
-                for (Condition c : condMatcher.getCondition()) {
-                    switch (type) {
-                    case Any:
-                        break;
-                    case None:
-                        noneb.add(c.getName());
-                        break;
-                    case All:
-                    default:
-                        allb.add(c.getName());
-                        break;
-                    }
-                }
-            }
-        }
-        return new ConditionSet(allb.build(), noneb.build(), anyb.build());
-    }
-
-    private ConditionSet buildConsConditionSet(Clause clause) {
-        if (clause.getConsumerMatchers() != null) {
-            List<ConditionMatcher> condMatchers =
-                    clause.getConsumerMatchers().getConditionMatcher();
-            return buildConditionSet(condMatchers);
-        }
-        return ConditionSet.EMPTY;
-    }
-
-    private ConditionSet buildProvConditionSet(Clause clause) {
-        if (clause.getProviderMatchers() != null) {
-            List<ConditionMatcher> condMatchers =
-                    clause.getProviderMatchers().getConditionMatcher();
-            return buildConditionSet(condMatchers);
-        }
-        return ConditionSet.EMPTY;
-    }
-
-    private Policy resolvePolicy(Tenant contractTenant,
-            Contract contract,
-            Policy merge,
-            Table<ConditionSet, ConditionSet,
-            List<Subject>> subjectMap) {
-        Table<ConditionSet, ConditionSet, List<RuleGroup>> ruleMap =
-                HashBasedTable.create();
-        if (merge != null) {
-            ruleMap.putAll(merge.getRuleMap());
-        }
-        for (Cell<ConditionSet, ConditionSet, List<Subject>> entry : subjectMap.cellSet()) {
-            List<RuleGroup> rules = new ArrayList<>();
-            ConditionSet consConds = entry.getRowKey();
-            ConditionSet provConds = entry.getColumnKey();
-            List<RuleGroup> oldrules = ruleMap.get(consConds, provConds);
-            if (oldrules != null) {
-                rules.addAll(oldrules);
-            }
-            for (Subject s : entry.getValue()) {
-                if (s.getRule() == null)
-                    continue;
-
-                RuleGroup rg = new RuleGroup(s.getRule(), s.getOrder(),
-                        contractTenant, contract,
-                        s.getName());
-                rules.add(rg);
-            }
-            Collections.sort(rules);
-            ruleMap.put(consConds, provConds, Collections.unmodifiableList(rules));
-        }
-        return new Policy(ruleMap);
-    }
-
-    /**
-     * Get the "natural" direction for the policy for the given pair of endpoint
-     * groups.
-     *
-     * @param one
-     *            The first endpoint group
-     * @param two
-     *            The second endpoint group
-     * @return true if the order should be reversed in the index
-     */
-    protected static boolean shouldReverse(EgKey one, EgKey two) {
-        if (one.compareTo(two) < 0) {
-            return true;
-        }
-        return false;
-    }
-
-    private void addConditionSet(EgKey eg, ConditionSet cs,
-            Map<EgKey, Set<ConditionSet>> egConditions) {
-        if (egConditions == null)
-            return;
-        Set<ConditionSet> cset = egConditions.get(eg);
-        if (cset == null) {
-            egConditions.put(eg, cset = new HashSet<>());
-        }
-        cset.add(cs);
-    }
-
-    /**
-     * Choose the set of subjects that in scope for each possible set of
-     * endpoint conditions
-     */
-    // TODO Li msunal do we really need contractMatches to be a type Table<EgKey, EgKey, List<ContractMatch>>
-    // it should be sufficient to be just List<ContractMatch>
-    protected Table<EgKey, EgKey, Policy>
-            selectSubjects(Table<EgKey, EgKey,
-                    List<ContractMatch>> contractMatches,
-                    Map<EgKey, Set<ConditionSet>> egConditions) {
-        // TODO: Note that it's possible to further simplify the resulting
-        // policy
-        // in the case of things like repeated rules, condition sets that
-        // cover other condition sets, etc. This would be a good thing to do
-        // at some point
-        Table<EgKey, EgKey, Policy> policy = HashBasedTable.create();
-
-        for (List<ContractMatch> matches : contractMatches.values()) {
-            for (ContractMatch match : matches) {
-                List<Clause> clauses = match.contract.getClause();
-                if (clauses == null)
-                    continue;
-
-                List<Subject> subjectList = match.contract.getSubject();
-                if (subjectList == null)
-                    continue;
-
-                EgKey ckey = new EgKey(match.consumerTenant.getId(),
-                        match.consumer.getId());
-                EgKey pkey = new EgKey(match.providerTenant.getId(),
-                        match.provider.getId());
-                Policy existing = policy.get(ckey, pkey);
-
-                HashMap<SubjectName, Subject> subjects = new HashMap<>();
-                for (Subject s : subjectList) {
-                    subjects.put(s.getName(), s);
-                }
-
-                Table<ConditionSet, ConditionSet, List<Subject>> subjectMap =
-                        HashBasedTable.create();
-
-                for (Clause clause : clauses) {
-                    if (clause.getSubjectRefs() != null &&
-                            clauseMatchesByGroupReqAndCapConstraints(clause, match)) {
-                        ConditionSet consCSet = buildConsConditionSet(clause);
-                        addConditionSet(ckey, consCSet, egConditions);
-                        ConditionSet provCSet = buildProvConditionSet(clause);
-                        addConditionSet(pkey, provCSet, egConditions);
-                        List<Subject> clauseSubjects =
-                                subjectMap.get(consCSet, provCSet);
-                        if (clauseSubjects == null) {
-                            clauseSubjects = new ArrayList<>();
-                            subjectMap.put(consCSet, provCSet, clauseSubjects);
-                        }
-                        for (SubjectName sn : clause.getSubjectRefs()) {
-                            Subject s = subjects.get(sn);
-                            if (s != null)
-                                clauseSubjects.add(s);
-                        }
-                    }
-                }
-
-                policy.put(ckey, pkey,
-                        resolvePolicy(match.contractTenant,
-                                match.contract,
-                                existing,
-                                subjectMap));
-            }
-        }
-
-        return policy;
-    }
-
-    private List<ConsumerContractMatch> matchConsumerContracts(Tenant tenant,
-            EndpointGroup consumer) {
-        List<ConsumerContractMatch> matches = new ArrayList<>();
-        if (consumer.getConsumerNamedSelector() != null) {
-            for (ConsumerNamedSelector cns : consumer.getConsumerNamedSelector()) {
-                if (cns.getContract() == null)
-                    continue;
-                for (ContractId contractId : cns.getContract()) {
-                    Contract contract =
-                            TenantUtils.findContract(tenant, contractId);
-                    if (contract == null)
-                        continue;
-                    matches.add(new ConsumerContractMatch(tenant, contract,
-                            tenant, consumer,
-                            cns));
-                }
-            }
-        }
-        if (consumer.getConsumerTargetSelector() != null) {
-            for (ConsumerTargetSelector cts : consumer.getConsumerTargetSelector()) {
-                if (tenant.getContract() == null)
-                    continue;
-                for (Contract contract : tenant.getContract()) {
-                    if (contract.getTarget() == null)
-                        continue;
-                    for (Target t : contract.getTarget()) {
-                        boolean match = true;
-                        if (cts.getQualityMatcher() != null) {
-                            for (QualityMatcher m : cts.getQualityMatcher()) {
-                                if (!MatcherUtils.applyQualityMatcher(m, t)) {
-                                    match = false;
-                                    break;
-                                }
-                            }
-                        }
-                        if (match) {
-                            matches.add(new ConsumerContractMatch(tenant,
-                                    contract,
-                                    tenant,
-                                    consumer,
-                                    cts));
-                        }
-                    }
-                }
-            }
-        }
-        // TODO match selectors also against contract references
-        // for (ConsumerTargetSelector cts :
-        // consumer.getConsumerTargetSelector()) {
-        // if (tenant.getContractRef() == null) continue;
-        // for (ContractRef c : tenant.getContractRef()) {
-        //
-        // }
-        // }
-        return matches;
-    }
-
-    private void amendContractMatches(List<ContractMatch> matches,
-            List<ConsumerContractMatch> cMatches,
-            Tenant tenant, EndpointGroup provider,
-            ProviderSelectionRelator relator) {
-        if (cMatches == null)
-            return;
-        for (ConsumerContractMatch cMatch : cMatches) {
-            matches.add(new ContractMatch(cMatch, tenant, provider, relator));
-        }
-    }
-
-    private List<ContractMatch>
-            matchProviderContracts(Tenant tenant, EndpointGroup provider,
-                    Table<TenantId,
-                    ContractId,
-                    List<ConsumerContractMatch>> consumerMatches) {
-        List<ContractMatch> matches = new ArrayList<>();
-        if (provider.getProviderNamedSelector() != null) {
-            for (ProviderNamedSelector pns : provider.getProviderNamedSelector()) {
-                if (pns.getContract() == null)
-                    continue;
-                for (ContractId contractId : pns.getContract()) {
-                    Contract c = TenantUtils.findContract(tenant, contractId);
-                    if (c == null)
-                        continue;
-                    List<ConsumerContractMatch> cMatches =
-                            consumerMatches.get(tenant.getId(), c.getId());
-                    amendContractMatches(matches, cMatches, tenant, provider, pns);
-                }
-            }
-        }
-        if (provider.getProviderTargetSelector() != null) {
-            for (ProviderTargetSelector pts : provider.getProviderTargetSelector()) {
-                if (tenant.getContract() == null)
-                    continue;
-                for (Contract c : tenant.getContract()) {
-                    if (c.getTarget() == null)
-                        continue;
-                    for (Target t : c.getTarget()) {
-                        boolean match = true;
-                        if (pts.getQualityMatcher() != null) {
-                            for (QualityMatcher m : pts.getQualityMatcher()) {
-                                if (!MatcherUtils.applyQualityMatcher(m, t)) {
-                                    match = false;
-                                    break;
-                                }
-                            }
-                        }
-                        if (match) {
-                            List<ConsumerContractMatch> cMatches =
-                                    consumerMatches.get(tenant.getId(),
-                                            c.getId());
-                            amendContractMatches(matches, cMatches, tenant,
-                                    provider, pts);
-
-                        }
-                    }
-                }
-            }
-        }
-        return matches;
+        return result;
     }
 
     protected static class TenantContext {
@@ -810,85 +347,6 @@ public class PolicyResolver implements AutoCloseable {
         }
     }
 
-    /**
-     * Represents a selected contract made by endpoint groups matching it using
-     * selection relators. This is the result of the contract selection phase.
-     *
-     * @author readams
-     *
-     */
-    @Immutable
-    protected static class ContractMatch extends ConsumerContractMatch {
-        /**
-         * The tenant ID of the provider endpoint group
-         */
-        final Tenant providerTenant;
-
-        /**
-         * The provider endpoint group
-         */
-        final EndpointGroup provider;
-
-        /**
-         * The provider selection relator that was used to match the contract
-         */
-        final ProviderSelectionRelator providerRelator;
-
-        public ContractMatch(ConsumerContractMatch consumerMatch,
-                Tenant providerTenant, EndpointGroup provider,
-                ProviderSelectionRelator providerRelator) {
-            super(consumerMatch.contractTenant,
-                    consumerMatch.contract,
-                    consumerMatch.consumerTenant,
-                    consumerMatch.consumer,
-                    consumerMatch.consumerRelator);
-            this.providerTenant = providerTenant;
-            this.provider = provider;
-            this.providerRelator = providerRelator;
-        }
-    }
-
-    @Immutable
-    private static class ConsumerContractMatch {
-        /**
-         * The tenant of the matching contract
-         */
-        final Tenant contractTenant;
-
-        /**
-         * The matching contract
-         */
-        final Contract contract;
-
-        /**
-         * The tenant for the endpoint group
-         */
-        final Tenant consumerTenant;
-
-        /**
-         * The consumer endpoint group
-         */
-        final EndpointGroup consumer;
-
-        /**
-         * The consumer selection relator that was used to match the contract
-         */
-        final ConsumerSelectionRelator consumerRelator;
-
-        public ConsumerContractMatch(Tenant contractTenant,
-                Contract contract,
-                Tenant consumerTenant,
-                EndpointGroup consumer,
-                ConsumerSelectionRelator consumerRelator) {
-            super();
-            this.contractTenant = contractTenant;
-            this.contract = contract;
-            this.consumerTenant = consumerTenant;
-            this.consumer = consumer;
-            this.consumerRelator = consumerRelator;
-        }
-    }
-
     @Immutable
     private class PolicyChangeListener implements DataChangeListener {
         final TenantId tenantId;
diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolverUtils.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolverUtils.java
new file mode 100644 (file)
index 0000000..fe36a85
--- /dev/null
@@ -0,0 +1,49 @@
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.opendaylight.groupbasedpolicy.resolver.ContractResolverUtils.ContractMatch;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Table;
+
+public class PolicyResolverUtils {
+
+    private PolicyResolverUtils() {
+        throw new UnsupportedOperationException("Cannot create an instance");
+    }
+
+    /**
+     * Resolve the policy in three phases: <br>
+     * (1) select contracts that in scope based on contract selectors. <br>
+     * (2) select subjects that are in scope for each contract based on matchers in clauses <br>
+     * (3) resolve the set of in-scope contracts into a list of subjects that apply for each pair of
+     * endpoint groups and the conditions that can apply for for each endpoint in those groups.
+     */
+    public static Table<EgKey, EgKey, Policy> resolvePolicy(Set<IndexedTenant> tenants) {
+        return resolvePolicy(tenants, new HashMap<EgKey, Set<ConditionSet>>());
+    }
+
+    /**
+     * Resolve the policy in three phases: <br>
+     * (1) select contracts that in scope based on contract selectors. <br>
+     * (2) select subjects that are in scope for each contract based on matchers in clauses <br>
+     * (3) resolve the set of in-scope contracts into a list of subjects that apply for each pair of
+     * endpoint groups and the conditions that can apply for for each endpoint in those groups.
+     */
+    protected static Table<EgKey, EgKey, Policy> resolvePolicy(Set<IndexedTenant> tenants,
+            Map<EgKey, Set<ConditionSet>> egConditions) {
+        Preconditions.checkNotNull(tenants);
+        Preconditions.checkNotNull(egConditions);
+        // select contracts that apply for the given tenant
+        Table<EgKey, EgKey, List<ContractMatch>> contractMatches = ContractResolverUtils.selectContracts(tenants);
+
+        // select subjects for the matching contracts and resolve the policy
+        // for endpoint group pairs. This does phase (2) and (3) as one step
+        return SubjectResolverUtils.selectSubjects(contractMatches, egConditions);
+    }
+
+}
diff --git a/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/SubjectResolverUtils.java b/groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/SubjectResolverUtils.java
new file mode 100644 (file)
index 0000000..3541c95
--- /dev/null
@@ -0,0 +1,248 @@
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.opendaylight.groupbasedpolicy.resolver.ContractResolverUtils.ContractMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher.MatchType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.Condition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Clause;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Subject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.GroupIdentificationConstraints;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.GroupRequirementConstraintCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.GroupCapabilityConstraintCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcher;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Table;
+import com.google.common.collect.Table.Cell;
+
+
+public class SubjectResolverUtils {
+
+    private SubjectResolverUtils() {
+        throw new UnsupportedOperationException("Cannot create an instance");
+    }
+
+    /**
+     * Choose the set of subjects that in scope for each possible set of
+     * endpoint conditions
+     */
+    // TODO Li msunal do we really need contractMatches to be a type Table<EgKey, EgKey, List<ContractMatch>>
+    // it should be sufficient to be just List<ContractMatch>
+    protected static Table<EgKey, EgKey, Policy> selectSubjects(
+            Table<EgKey, EgKey, List<ContractMatch>> contractMatches, Map<EgKey, Set<ConditionSet>> egConditions) {
+        // TODO: Note that it's possible to further simplify the resulting
+        // policy
+        // in the case of things like repeated rules, condition sets that
+        // cover other condition sets, etc. This would be a good thing to do
+        // at some point
+        Table<EgKey, EgKey, Policy> policy = HashBasedTable.create();
+
+        for (List<ContractMatch> matches : contractMatches.values()) {
+            for (ContractMatch match : matches) {
+                List<Clause> clauses = match.contract.getClause();
+                if (clauses == null)
+                    continue;
+
+                List<Subject> subjectList = match.contract.getSubject();
+                if (subjectList == null)
+                    continue;
+
+                EgKey ckey = new EgKey(match.consumerTenant.getId(),
+                        match.consumer.getId());
+                EgKey pkey = new EgKey(match.providerTenant.getId(),
+                        match.provider.getId());
+                Policy existing = policy.get(ckey, pkey);
+
+                HashMap<SubjectName, Subject> subjects = new HashMap<>();
+                for (Subject s : subjectList) {
+                    subjects.put(s.getName(), s);
+                }
+
+                Table<ConditionSet, ConditionSet, List<Subject>> subjectMap =
+                        HashBasedTable.create();
+
+                for (Clause clause : clauses) {
+                    if (clause.getSubjectRefs() != null &&
+                            clauseMatchesByGroupReqAndCapConstraints(clause, match)) {
+                        ConditionSet consCSet = buildConsConditionSet(clause);
+                        addConditionSet(ckey, consCSet, egConditions);
+                        ConditionSet provCSet = buildProvConditionSet(clause);
+                        addConditionSet(pkey, provCSet, egConditions);
+                        List<Subject> clauseSubjects =
+                                subjectMap.get(consCSet, provCSet);
+                        if (clauseSubjects == null) {
+                            clauseSubjects = new ArrayList<>();
+                            subjectMap.put(consCSet, provCSet, clauseSubjects);
+                        }
+                        for (SubjectName sn : clause.getSubjectRefs()) {
+                            Subject s = subjects.get(sn);
+                            if (s != null)
+                                clauseSubjects.add(s);
+                        }
+                    }
+                }
+
+                policy.put(ckey, pkey,
+                        resolvePolicy(match.contractTenant,
+                                match.contract,
+                                existing,
+                                subjectMap));
+            }
+        }
+
+        return policy;
+    }
+
+    private static boolean clauseMatchesByGroupReqAndCapConstraints(Clause clause, ContractMatch match) {
+        if (clause.getConsumerMatchers() != null) {
+            GroupIdentificationConstraints groupIdentificationConstraintsConsumer = clause.getConsumerMatchers()
+                    .getGroupIdentificationConstraints();
+            if (groupIdentificationConstraintsConsumer instanceof GroupRequirementConstraintCase) {
+                List<RequirementMatcher> reqMatchers = ((GroupRequirementConstraintCase) groupIdentificationConstraintsConsumer)
+                        .getRequirementMatcher();
+                if (reqMatchers != null) {
+                    for (RequirementMatcher reqMatcher : reqMatchers) {
+                        if (!MatcherUtils.applyReqMatcher(reqMatcher,
+                                match.consumerRelator)) {
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        if (clause.getProviderMatchers() != null) {
+            org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.GroupIdentificationConstraints groupIdentificationConstraintsProvider = clause
+                    .getProviderMatchers().getGroupIdentificationConstraints();
+            if (groupIdentificationConstraintsProvider instanceof GroupCapabilityConstraintCase) {
+                List<CapabilityMatcher> capMatchers = ((GroupCapabilityConstraintCase) groupIdentificationConstraintsProvider)
+                        .getCapabilityMatcher();
+
+                if (capMatchers != null) {
+                    for (CapabilityMatcher capMatcher : capMatchers) {
+                        if (!MatcherUtils.applyCapMatcher(capMatcher,
+                                match.providerRelator)) {
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+    private static void addConditionSet(EgKey eg, ConditionSet cs,
+            Map<EgKey, Set<ConditionSet>> egConditions) {
+        if (egConditions == null)
+            return;
+        Set<ConditionSet> cset = egConditions.get(eg);
+        if (cset == null) {
+            egConditions.put(eg, cset = new HashSet<>());
+        }
+        cset.add(cs);
+    }
+
+    private static ConditionSet buildConsConditionSet(Clause clause) {
+        if (clause.getConsumerMatchers() != null) {
+            List<ConditionMatcher> condMatchers =
+                    clause.getConsumerMatchers().getConditionMatcher();
+            return buildConditionSet(condMatchers);
+        }
+        return ConditionSet.EMPTY;
+    }
+
+    private static ConditionSet buildProvConditionSet(Clause clause) {
+        if (clause.getProviderMatchers() != null) {
+            List<ConditionMatcher> condMatchers =
+                    clause.getProviderMatchers().getConditionMatcher();
+            return buildConditionSet(condMatchers);
+        }
+        return ConditionSet.EMPTY;
+    }
+
+    private static ConditionSet buildConditionSet(List<ConditionMatcher> condMatchers) {
+        if (condMatchers == null)
+            return ConditionSet.EMPTY;
+
+        ImmutableSet.Builder<ConditionName> allb = ImmutableSet.builder();
+        ImmutableSet.Builder<ConditionName> noneb = ImmutableSet.builder();
+        ImmutableSet.Builder<Set<ConditionName>> anyb =
+                ImmutableSet.builder();
+        for (ConditionMatcher condMatcher : condMatchers) {
+            if (condMatcher.getCondition() == null)
+                continue;
+            MatchType type = condMatcher.getMatchType();
+            if (type == null)
+                type = MatchType.All;
+            if (type.equals(MatchType.Any)) {
+                ImmutableSet.Builder<ConditionName> a =
+                        ImmutableSet.builder();
+                for (Condition c : condMatcher.getCondition()) {
+                    a.add(c.getName());
+                }
+                anyb.add(a.build());
+            } else {
+                for (Condition c : condMatcher.getCondition()) {
+                    switch (type) {
+                    case Any:
+                        break;
+                    case None:
+                        noneb.add(c.getName());
+                        break;
+                    case All:
+                    default:
+                        allb.add(c.getName());
+                        break;
+                    }
+                }
+            }
+        }
+        return new ConditionSet(allb.build(), noneb.build(), anyb.build());
+    }
+
+    private static Policy resolvePolicy(Tenant contractTenant,
+            Contract contract,
+            Policy merge,
+            Table<ConditionSet, ConditionSet,
+            List<Subject>> subjectMap) {
+        Table<ConditionSet, ConditionSet, List<RuleGroup>> ruleMap =
+                HashBasedTable.create();
+        if (merge != null) {
+            ruleMap.putAll(merge.getRuleMap());
+        }
+        for (Cell<ConditionSet, ConditionSet, List<Subject>> entry : subjectMap.cellSet()) {
+            List<RuleGroup> rules = new ArrayList<>();
+            ConditionSet consConds = entry.getRowKey();
+            ConditionSet provConds = entry.getColumnKey();
+            List<RuleGroup> oldrules = ruleMap.get(consConds, provConds);
+            if (oldrules != null) {
+                rules.addAll(oldrules);
+            }
+            for (Subject s : entry.getValue()) {
+                if (s.getRule() == null)
+                    continue;
+
+                RuleGroup rg = new RuleGroup(s.getRule(), s.getOrder(),
+                        contractTenant, contract,
+                        s.getName());
+                rules.add(rg);
+            }
+            Collections.sort(rules);
+            ruleMap.put(consConds, provConds, Collections.unmodifiableList(rules));
+        }
+        return new Policy(ruleMap);
+    }
+}
index 72d516e5c7ac2fb1527bea498f26dde930ac5cc1..a4d1be121d162abd3ccfba2ac1e109c4283ac2df 100644 (file)
@@ -12,8 +12,6 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -22,7 +20,7 @@ import java.util.Set;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver.ContractMatch;
+import org.opendaylight.groupbasedpolicy.resolver.ContractResolverUtils.ContractMatch;
 import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver.TenantContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityMatcherName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityName;
@@ -338,11 +336,10 @@ public class PolicyResolverTest {
     public void testContractSelection() throws Exception {
         // named selectors
         TenantContext tc = new TenantContext(null);
-        Collection<TenantContext> tCol = Collections.singleton(tc);
 
         tc.tenant.set(new IndexedTenant(tenant1));
         Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
-                resolver.selectContracts(tCol);
+                ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
         assertEquals(1, contractMatches.size());
         List<ContractMatch> matches =
                 contractMatches.get(new EgKey(tenant1.getId(), eg1.getId()),
@@ -353,7 +350,7 @@ public class PolicyResolverTest {
 
 
         tc.tenant.set(new IndexedTenant(tenant2));
-        contractMatches = resolver.selectContracts(tCol);
+        contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
         assertEquals(2, contractMatches.size());
         matches = contractMatches.get(new EgKey(tenant2.getId(), eg1.getId()),
                                       new EgKey(tenant2.getId(), eg2.getId()));
@@ -369,7 +366,7 @@ public class PolicyResolverTest {
 
         // target selectors
         tc.tenant.set(new IndexedTenant(tenant3));
-        contractMatches = resolver.selectContracts(tCol);
+        contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
         assertEquals(1, contractMatches.size());
         matches = contractMatches.get(new EgKey(tenant3.getId(), eg4.getId()),
                                       new EgKey(tenant3.getId(), eg5.getId()));
@@ -379,11 +376,11 @@ public class PolicyResolverTest {
 
         // empty matches
         tc.tenant.set(new IndexedTenant(tenant0));
-        contractMatches = resolver.selectContracts(tCol);
+        contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
         assertEquals(0, contractMatches.size());
 
         tc.tenant.set(new IndexedTenant(tenant00));
-        contractMatches = resolver.selectContracts(tCol);
+        contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
         assertEquals(0, contractMatches.size());
     }
 
@@ -395,14 +392,13 @@ public class PolicyResolverTest {
                                  ImmutableSet.of(ImmutableSet.of(cond1.getName(),
                                                                  cond2.getName())));
         TenantContext tc = new TenantContext(null);
-        Collection<TenantContext> tCol = Collections.singleton(tc);
 
         tc.tenant.set(new IndexedTenant(tenant1));
         Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
-                resolver.selectContracts(tCol);
+                ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
         Map<EgKey, Set<ConditionSet>> egConditions = new HashMap<>();
         Table<EgKey, EgKey, Policy> policy =
-                resolver.selectSubjects(contractMatches, egConditions);
+                SubjectResolverUtils.selectSubjects(contractMatches, egConditions);
         assertEquals(1, policy.size());
         Policy p = policy.get(new EgKey(tenant1.getId(), eg1.getId()), new EgKey(tenant1.getId(), eg2.getId()));
         List<RuleGroup> rules = p.getRuleMap().get(cs, ConditionSet.EMPTY);
@@ -416,9 +412,9 @@ public class PolicyResolverTest {
         assertEquals(rule1.getName(), rg.rules.get(0).getName());
 
         tc.tenant.set(new IndexedTenant(tenant2));
-        contractMatches = resolver.selectContracts(tCol);
+        contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
         egConditions = new HashMap<>();
-        policy = resolver.selectSubjects(contractMatches, egConditions);
+        policy = SubjectResolverUtils.selectSubjects(contractMatches, egConditions);
 
         assertEquals(2, policy.size());
         p = policy.get(new EgKey(tenant2.getId(), eg3.getId()),
@@ -456,9 +452,9 @@ public class PolicyResolverTest {
         assertEquals(rule1.getName(), rg.rules.get(0).getName());
 
         tc.tenant.set(new IndexedTenant(tenant3));
-        contractMatches = resolver.selectContracts(tCol);
+        contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
         egConditions = new HashMap<>();
-        policy = resolver.selectSubjects(contractMatches, egConditions);
+        policy = SubjectResolverUtils.selectSubjects(contractMatches, egConditions);
 
         assertEquals(1, policy.size());
         p = policy.get(new EgKey(tenant3.getId(), eg4.getId()),