Fix copyright header
[groupbasedpolicy.git] / groupbasedpolicy / src / main / java / org / opendaylight / groupbasedpolicy / resolver / RuleGroup.java
1 /*
2  * Copyright (c) 2014 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.resolver;
10
11 import java.util.List;
12
13 import javax.annotation.concurrent.Immutable;
14
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;
19
20 import com.google.common.collect.ComparisonChain;
21 import com.google.common.collect.Ordering;
22
23 /**
24  * Represent a group of rules that could apply to a given pair of endpoints.
25  * Includes references back to the normalized policy that resulted in the rule
26  * group.
27  * @author readams
28  */
29 @Immutable
30 public class RuleGroup implements Comparable<RuleGroup> {
31     final List<Rule> rules;
32     final Integer order;
33     final Tenant contractTenant;
34     final Contract relatedContract;
35     final SubjectName relatedSubject;
36
37     public RuleGroup(List<Rule> rules, Integer order,
38                      Tenant contractTenant, Contract contract,
39                      SubjectName subject) {
40         super();
41         this.rules = Ordering.from(TenantUtils.RULE_COMPARATOR).immutableSortedCopy(rules);
42         this.order = order;
43         this.contractTenant = contractTenant;
44         this.relatedContract = contract;
45         this.relatedSubject = subject;
46     }
47
48     /**
49      * @return sorted {@link Rule} list
50      */
51     public List<Rule> getRules() {
52         return rules;
53     }
54
55     public Integer getOrder() {
56         return order;
57     }
58
59     public Tenant getContractTenant() {
60         return contractTenant;
61     }
62
63     public Contract getRelatedContract() {
64         return relatedContract;
65     }
66
67     public SubjectName getRelatedSubject() {
68         return relatedSubject;
69     }
70
71     @Override
72     public int hashCode() {
73         final int prime = 31;
74         int result = 1;
75         result = prime * result + ((order == null) ? 0 : order.hashCode());
76         result = prime * result + ((rules == null) ? 0 : rules.hashCode());
77         result = prime * result +
78                  ((relatedSubject == null) ? 0 : relatedSubject.hashCode());
79         return result;
80     }
81
82     @Override
83     public boolean equals(Object obj) {
84         if (this == obj)
85             return true;
86         if (obj == null)
87             return false;
88         if (getClass() != obj.getClass())
89             return false;
90         RuleGroup other = (RuleGroup) obj;
91         if (order == null) {
92             if (other.order != null)
93                 return false;
94         } else if (!order.equals(other.order))
95             return false;
96         if (rules == null) {
97             if (other.rules != null)
98                 return false;
99         } else if (!rules.equals(other.rules))
100             return false;
101         if (relatedSubject == null) {
102             if (other.relatedSubject != null)
103                 return false;
104         } else if (!relatedSubject.equals(other.relatedSubject))
105             return false;
106         return true;
107     }
108
109     @Override
110     public int compareTo(RuleGroup o) {
111         return ComparisonChain.start()
112             .compare(order, o.order,
113                      Ordering.natural().nullsLast())
114             .compare(relatedSubject.getValue(), o.relatedSubject.getValue(),
115                      Ordering.natural().nullsLast())
116             .result();
117     }
118
119     @Override
120     public String toString() {
121         return "RuleGroup [rules=" + rules + ", order=" + order +
122                ", contractTenant=" + contractTenant.getId() +
123                ", relatedContract=" + relatedContract.getId() +
124                ", relatedSubject=" + relatedSubject + "]";
125     }
126
127 }