/* * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.groupbasedpolicy.renderer.vpp.policy; import java.util.Comparator; import java.util.List; import javax.annotation.Nonnull; 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.SubjectName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Ordering; /** * Represent a group of rules applied to a given pair of endpoints. * Includes references back to the normalized policy that resulted in the rule * group. */ @Immutable public class ResolvedRuleGroup implements Comparable<ResolvedRuleGroup> { private static final ResolvedRuleComparator RULE_COMPARATOR = new ResolvedRuleComparator(); private ImmutableSortedSet<ResolvedRule> rules; private final Integer order; private final TenantId contractTenantId; private final ContractId contractId; private final SubjectName relatedSubject; public static class ResolvedRuleComparator implements Comparator<ResolvedRule> { @Override public int compare(ResolvedRule o1, ResolvedRule o2) { return ComparisonChain.start() .compare(o1.getOrder(), o2.getOrder(), Ordering.natural().nullsLast()) .compare(o1.getName().getValue(), o2.getName().getValue(), Ordering.natural().nullsLast()) .result(); } } public ResolvedRuleGroup(@Nonnull RuleGroup ruleGroup) { this.rules = ImmutableSortedSet.copyOf(RULE_COMPARATOR, ruleGroup.getResolvedRule()); this.order = ruleGroup.getOrder(); this.contractTenantId = ruleGroup.getTenantId(); this.contractId = ruleGroup.getContractId(); this.relatedSubject = ruleGroup.getSubjectName(); } public ResolvedRuleGroup(List<ResolvedRule> rules, Integer order, TenantId contractTenantId, ContractId contractId, SubjectName subject) { this.rules = ImmutableSortedSet.copyOf(RULE_COMPARATOR, rules); this.order = order; this.contractTenantId = contractTenantId; this.contractId = contractId; this.relatedSubject = subject; } /** * @return sorted {@link Rule} list */ public ImmutableSortedSet<ResolvedRule> getRules() { return rules; } public Integer getOrder() { return order; } public TenantId getContractTenantId() { return contractTenantId; } public ContractId getContractId() { return contractId; } public SubjectName getRelatedSubject() { return relatedSubject; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((order == null) ? 0 : order.hashCode()); result = prime * result + ((rules == null) ? 0 : rules.hashCode()); result = prime * result + ((relatedSubject == null) ? 0 : relatedSubject.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ResolvedRuleGroup other = (ResolvedRuleGroup) obj; if (order == null) { if (other.order != null) return false; } else if (!order.equals(other.order)) return false; if (rules == null) { if (other.rules != null) return false; } else if (!rules.equals(other.rules)) return false; if (relatedSubject == null) { if (other.relatedSubject != null) return false; } else if (!relatedSubject.equals(other.relatedSubject)) return false; return true; } @Override public int compareTo(ResolvedRuleGroup o) { return ComparisonChain.start() .compare(order, o.order, Ordering.natural().nullsLast()) .compare(relatedSubject.getValue(), o.relatedSubject.getValue(), Ordering.natural().nullsLast()) .result(); } }