Policy exclusions & parallel netconf transactions
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / policy / ResolvedRuleGroup.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.policy;
10
11 import java.util.Comparator;
12 import java.util.List;
13
14 import javax.annotation.Nonnull;
15 import javax.annotation.concurrent.Immutable;
16
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroup;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule;
24
25 import com.google.common.collect.ComparisonChain;
26 import com.google.common.collect.ImmutableSortedSet;
27 import com.google.common.collect.Ordering;
28
29 /**
30  * Represent a group of rules applied to a given pair of endpoints.
31  * Includes references back to the normalized policy that resulted in the rule
32  * group.
33  */
34 @Immutable
35 public class ResolvedRuleGroup implements Comparable<ResolvedRuleGroup> {
36
37     private static final ResolvedRuleComparator RULE_COMPARATOR = new ResolvedRuleComparator();
38     private ImmutableSortedSet<ResolvedRule> rules;
39     private final Integer order;
40     private final TenantId contractTenantId;
41     private final ContractId contractId;
42     private final SubjectName relatedSubject;
43
44     public static class ResolvedRuleComparator implements Comparator<ResolvedRule> {
45
46         @Override
47         public int compare(ResolvedRule o1, ResolvedRule o2) {
48             return ComparisonChain.start()
49                 .compare(o1.getOrder(), o2.getOrder(), Ordering.natural().nullsLast())
50                 .compare(o1.getName().getValue(), o2.getName().getValue(), Ordering.natural().nullsLast())
51                 .result();
52         }
53
54     }
55
56     public ResolvedRuleGroup(@Nonnull RuleGroup ruleGroup) {
57         this.rules = ImmutableSortedSet.copyOf(RULE_COMPARATOR, ruleGroup.getResolvedRule());
58         this.order = ruleGroup.getOrder();
59         this.contractTenantId = ruleGroup.getTenantId();
60         this.contractId = ruleGroup.getContractId();
61         this.relatedSubject = ruleGroup.getSubjectName();
62     }
63
64     public ResolvedRuleGroup(List<ResolvedRule> rules, Integer order, TenantId contractTenantId, ContractId contractId,
65             SubjectName subject) {
66         this.rules = ImmutableSortedSet.copyOf(RULE_COMPARATOR, rules);
67         this.order = order;
68         this.contractTenantId = contractTenantId;
69         this.contractId = contractId;
70         this.relatedSubject = subject;
71     }
72
73     /**
74      * @return sorted {@link Rule} list
75      */
76     public ImmutableSortedSet<ResolvedRule> getRules() {
77         return rules;
78     }
79
80     public Integer getOrder() {
81         return order;
82     }
83
84     public TenantId getContractTenantId() {
85         return contractTenantId;
86     }
87
88     public ContractId getContractId() {
89         return contractId;
90     }
91
92     public SubjectName getRelatedSubject() {
93         return relatedSubject;
94     }
95
96     public RuleGroupKey getRelatedRuleGroupKey() {
97         return new RuleGroupKey(contractId, relatedSubject, contractTenantId);
98     }
99
100     @Override
101     public int hashCode() {
102         final int prime = 31;
103         int result = 1;
104         result = prime * result + ((order == null) ? 0 : order.hashCode());
105         result = prime * result + ((rules == null) ? 0 : rules.hashCode());
106         result = prime * result + ((relatedSubject == null) ? 0 : relatedSubject.hashCode());
107         return result;
108     }
109
110     @Override
111     public boolean equals(Object obj) {
112         if (this == obj)
113             return true;
114         if (obj == null)
115             return false;
116         if (getClass() != obj.getClass())
117             return false;
118         ResolvedRuleGroup other = (ResolvedRuleGroup) obj;
119         if (order == null) {
120             if (other.order != null)
121                 return false;
122         } else if (!order.equals(other.order))
123             return false;
124         if (rules == null) {
125             if (other.rules != null)
126                 return false;
127         } else if (!rules.equals(other.rules))
128             return false;
129         if (relatedSubject == null) {
130             if (other.relatedSubject != null)
131                 return false;
132         } else if (!relatedSubject.equals(other.relatedSubject))
133             return false;
134         return true;
135     }
136
137     @Override
138     public int compareTo(ResolvedRuleGroup o) {
139         return ComparisonChain.start()
140             .compare(order, o.order, Ordering.natural().nullsLast())
141             .compare(relatedSubject.getValue(), o.relatedSubject.getValue(), Ordering.natural().nullsLast())
142             .result();
143     }
144
145 }