[ONOS-3857] BGP flow specification prefix implementation.

Change-Id: I49228f85f8efd5e972092df798a42ffc316d784d
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java
new file mode 100755
index 0000000..cbf4269
--- /dev/null
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.bgpio.protocol.flowspec;
+
+import java.util.Objects;
+import org.onlab.packet.IpPrefix;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.nio.ByteBuffer;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Provides BGP flow specification rule index.
+ */
+public class BgpFlowSpecPrefix implements Comparable<Object> {
+
+    private static final Logger log = LoggerFactory.getLogger(BgpFlowSpecPrefix.class);
+
+    private final IpPrefix destinationPrefix;
+    private final IpPrefix sourcePrefix;
+
+    /**
+     * Constructor to initialize parameters.
+     *
+     * @param destinationPrefix destination prefix
+     * @param sourcePrefix source prefix
+     */
+    public BgpFlowSpecPrefix(IpPrefix destinationPrefix, IpPrefix sourcePrefix) {
+        this.destinationPrefix = destinationPrefix;
+        this.sourcePrefix = sourcePrefix;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(destinationPrefix, sourcePrefix);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof BgpFlowSpecPrefix) {
+             BgpFlowSpecPrefix other = (BgpFlowSpecPrefix) obj;
+
+             if (this.destinationPrefix.equals(other.destinationPrefix)) {
+                 return this.sourcePrefix.equals(other.sourcePrefix);
+             }
+             return false;
+        }
+        return false;
+    }
+
+    /**
+     * Returns destination prefix.
+     *
+     * @return destination prefix
+     */
+    public IpPrefix destinationPrefix() {
+        return this.destinationPrefix;
+    }
+
+    /**
+     * Returns source prefix.
+     *
+     * @return source prefix
+     */
+    public IpPrefix sourcePrefix() {
+        return this.sourcePrefix;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass()).omitNullValues()
+                .add("destinationPrefix", destinationPrefix)
+                .add("sourcePrefix", destinationPrefix)
+                .toString();
+    }
+
+    /**
+     * Compares this and o object.
+     *
+     * @param o object to be compared with this object
+     * @return which object is greater
+     */
+    public int compareTo(Object o) {
+        if (this.equals(o)) {
+            return 0;
+        }
+
+        if (o instanceof BgpFlowSpecPrefix) {
+            BgpFlowSpecPrefix that = (BgpFlowSpecPrefix) o;
+
+            if (this.destinationPrefix().prefixLength() == that.destinationPrefix().prefixLength()) {
+                ByteBuffer value1 = ByteBuffer.wrap(this.destinationPrefix().address().toOctets());
+                ByteBuffer value2 = ByteBuffer.wrap(that.destinationPrefix().address().toOctets());
+                int cmpVal = value1.compareTo(value2);
+                if (cmpVal != 0) {
+                    return cmpVal;
+                }
+            } else {
+                if (this.destinationPrefix().prefixLength() > that.destinationPrefix().prefixLength()) {
+                    return 1;
+                } else if (this.destinationPrefix().prefixLength() < that.destinationPrefix().prefixLength()) {
+                    return -1;
+                }
+            }
+
+            if (this.sourcePrefix().prefixLength() == that.sourcePrefix().prefixLength()) {
+                ByteBuffer value1 = ByteBuffer.wrap(this.sourcePrefix().address().toOctets());
+                ByteBuffer value2 = ByteBuffer.wrap(that.sourcePrefix().address().toOctets());
+                return value1.compareTo(value2);
+            }
+
+            if (this.sourcePrefix().prefixLength() > that.sourcePrefix().prefixLength()) {
+                return 1;
+            } else if (this.sourcePrefix().prefixLength() < that.sourcePrefix().prefixLength()) {
+                return -1;
+            }
+        }
+        return 1;
+    }
+}
diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefixTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefixTest.java
new file mode 100644
index 0000000..f9d9d89
--- /dev/null
+++ b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefixTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.bgpio.protocol.flowspec;
+
+import org.junit.Test;
+
+import org.onlab.packet.IpPrefix;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Test for BgpFsDestinationPrefix flow specification component.
+ */
+public class BgpFlowSpecPrefixTest {
+    private IpPrefix destinationPrefix1 = IpPrefix.valueOf("21.21.21.21/16");
+    private IpPrefix sourcePrefix1 = IpPrefix.valueOf("11.11.11.11/16");
+    private IpPrefix destinationPrefix2 = IpPrefix.valueOf("42.42.42.42/16");
+    private IpPrefix sourcePrefix2 = IpPrefix.valueOf("32.32.32.32/16");
+
+    private final BgpFlowSpecPrefix tlv1 = new BgpFlowSpecPrefix(destinationPrefix1, sourcePrefix1);
+    private final BgpFlowSpecPrefix sameAsTlv1 = new BgpFlowSpecPrefix(destinationPrefix1, sourcePrefix1);
+    private final BgpFlowSpecPrefix tlv2 = new BgpFlowSpecPrefix(destinationPrefix2, sourcePrefix2);
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+        .addEqualityGroup(tlv1, sameAsTlv1)
+        .addEqualityGroup(tlv2)
+        .testEquals();
+    }
+}