Merge "Bug 499: Added support for old DOM Broker APIs."
[controller.git] / opendaylight / sal / api / src / main / java / org / opendaylight / controller / sal / match / extensible / NwDst.java
1 package org.opendaylight.controller.sal.match.extensible;
2
3 import java.net.Inet4Address;
4 import java.net.Inet6Address;
5 import java.net.InetAddress;
6
7 import javax.xml.bind.annotation.XmlAccessType;
8 import javax.xml.bind.annotation.XmlAccessorType;
9 import javax.xml.bind.annotation.XmlElement;
10 import javax.xml.bind.annotation.XmlRootElement;
11
12 import org.opendaylight.controller.sal.utils.NetUtils;
13
14 @XmlRootElement
15 @XmlAccessorType(XmlAccessType.NONE)
16 public class NwDst extends MatchField<InetAddress> {
17     private static final long serialVersionUID = 1L;
18     public static final String TYPE = "NW_DST";
19     private InetAddress address;
20     private InetAddress mask;
21
22     /**
23      * Creates a Match field for the network destination address
24      *
25      * @param address
26      *            the network address
27      * @param mask
28      *            the network mask
29      */
30     public NwDst(InetAddress address, InetAddress mask) {
31         super(TYPE);
32         this.address = address;
33         this.mask = mask;
34     }
35
36     // To satisfy JAXB
37     private NwDst() {
38         super(TYPE);
39     }
40
41     public NwDst(InetAddress address) {
42         super(TYPE);
43         this.address = address;
44         this.mask = null;
45     }
46
47     @Override
48     public InetAddress getValue() {
49         return address;
50     }
51
52     @Override
53     @XmlElement(name = "value")
54     protected String getValueString() {
55         return address.getHostAddress();
56     }
57
58     @Override
59     public InetAddress getMask() {
60         return mask;
61     }
62
63     @Override
64     @XmlElement(name = "mask")
65     protected String getMaskString() {
66         return (mask == null) ? "null" : mask.getHostAddress();
67     }
68
69     @Override
70     public boolean isValid() {
71         if (address != null) {
72             if (mask != null) {
73                 return address instanceof Inet4Address && mask instanceof Inet4Address
74                         || address instanceof Inet6Address && mask instanceof Inet6Address;
75             }
76             return true;
77         }
78         return false;
79     }
80
81     @Override
82     public boolean hasReverse() {
83         return true;
84     }
85
86     @Override
87     public NwSrc getReverse() {
88         return new NwSrc(address, mask);
89     }
90
91     @Override
92     public NwDst clone() {
93         return new NwDst(address, mask);
94     }
95
96     @Override
97     public boolean isV6() {
98         return address instanceof Inet6Address;
99     }
100
101     @Override
102     public int hashCode() {
103         final int prime = 31;
104         int result = 1;
105         result = prime * result + ((address == null) ? 0 : address.hashCode());
106         result = prime * result + ((mask == null) ? 0 : mask.hashCode());
107         return result;
108     }
109
110     @Override
111     public boolean equals(Object obj) {
112         if (this == obj) {
113             return true;
114         }
115         if (obj == null) {
116             return false;
117         }
118         if (!(obj instanceof NwDst)) {
119             return false;
120         }
121         NwDst other = (NwDst) obj;
122         // Equality to be checked against prefix addresses
123         int thisMaskLen = (this.mask == null) ? ((this.address instanceof Inet4Address) ? 32 : 128) : NetUtils
124                 .getSubnetMaskLength(this.mask);
125         int otherMaskLen = (other.mask == null) ? ((other.address instanceof Inet4Address) ? 32 : 128) : NetUtils
126                 .getSubnetMaskLength(other.mask);
127
128         return NetUtils.getSubnetPrefix(address, thisMaskLen).equals(
129                 NetUtils.getSubnetPrefix(other.address, otherMaskLen));
130     }
131 }