Renamed SDN-IP packages and classes.

The code use to use the name 'BgpRoute' in a number of places, which is not
descriptive and doesn't map to how we talk about SDN-IP (we always call it
SDN-IP in all other documents/presentations).

Details of changes are as follows:

net.onrc.onos.apps.bgproute -> net.onrc.onos.apps.sdnip
    BgpRoute.java -> SdnIp.java
    IBgpRouteService.java -> ISdnIpService.java

created new package for web classes: net.onrc.onos.apps.sdnip.web
    BgpRouteResource.java -> IncomingRequestResource.java
    BgpRouteResourceSynch.java -> OutgoingRequestResource.java
    BgpRouteWebRoutable.java -> SdnIpWebRoutable.java

Change-Id: Ie6b1cbe4e95736d4cbd53b9f4def7cc3e0b46132
diff --git a/src/test/java/net/onrc/onos/apps/sdnip/PatriciaTreeTest.java b/src/test/java/net/onrc/onos/apps/sdnip/PatriciaTreeTest.java
new file mode 100644
index 0000000..686971e
--- /dev/null
+++ b/src/test/java/net/onrc/onos/apps/sdnip/PatriciaTreeTest.java
@@ -0,0 +1,204 @@
+package net.onrc.onos.apps.sdnip;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PatriciaTreeTest {
+
+    IPatriciaTree<RibEntry> ptree;
+    Prefix[] prefixes;
+    Map<Prefix, RibEntry> mappings;
+
+    @Before
+    public void setUp() throws Exception {
+        ptree = new PatriciaTree<RibEntry>(32);
+        mappings = new HashMap<Prefix, RibEntry>();
+
+        prefixes = new Prefix[]{
+                new Prefix("192.168.10.0", 24),
+                new Prefix("192.168.8.0", 23),
+                new Prefix("192.168.8.0", 22),
+                new Prefix("192.0.0.0", 7),
+                new Prefix("192.168.11.0", 24),
+                new Prefix("10.0.23.128", 25),
+                new Prefix("206.17.144.0", 20),
+                new Prefix("9.17.0.0", 12),
+                new Prefix("192.168.0.0", 16)
+        };
+
+        for (int i = 0; i < prefixes.length; i++) {
+            mappings.put(prefixes[i], new RibEntry("192.168.10.101", "192.168.20." + i));
+            ptree.put(prefixes[i], new RibEntry("192.168.10.101", "192.168.20." + i));
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testPut() {
+        IPatriciaTree<RibEntry> ptree = new PatriciaTree<RibEntry>(32);
+
+        Prefix p1 = new Prefix("192.168.240.0", 20);
+        RibEntry r1 = new RibEntry("192.168.10.101", "192.168.60.2");
+        RibEntry retval = ptree.put(p1, r1);
+        assertNull(retval);
+        retval = ptree.lookup(p1);
+        assertTrue(r1 == retval); //should be the same object
+
+        Prefix p2 = new Prefix("192.160.0.0", 12);
+        RibEntry r2 = new RibEntry("192.168.10.101", "192.168.20.1");
+        retval = ptree.put(p2, r2);
+        assertNull(retval);
+
+        Prefix p3 = new Prefix("192.168.208.0", 20);
+        RibEntry r3 = new RibEntry("192.168.10.101", "192.168.30.1");
+        retval = ptree.put(p3, r3);
+        assertNull(retval);
+
+        //Insert a new RibEntry entry over a previous one
+        RibEntry r3new = new RibEntry("192.168.10.101", "192.168.60.2");
+        retval = ptree.put(p3, r3new);
+        assertNotNull(retval);
+        assertTrue(retval.equals(r3));
+        assertTrue(retval == r3); //should be the same object
+
+        //Now we have an aggregate node with prefix 192.168.192.0/18.
+        //We will insert a RibEntry at this prefix
+        Prefix p4 = new Prefix("192.168.192.0", 18);
+        RibEntry r4 = new RibEntry("192.168.10.101", "192.168.40.1");
+        retval = ptree.put(p4, r4);
+        assertNull(retval);
+        retval = ptree.lookup(p4);
+        assertTrue(retval == r4); //should be the same object
+    }
+
+    @Test
+    public void testLookup() {
+        for (Map.Entry<Prefix, RibEntry> entry : mappings.entrySet()) {
+            RibEntry r = ptree.lookup(entry.getKey());
+            assertTrue(entry.getValue().equals(r));
+        }
+
+        //These are aggregate nodes in the tree. Shouldn't be returned by lookup
+        Prefix p1 = new Prefix("0.0.0.0", 0);
+        RibEntry retval = ptree.lookup(p1);
+        assertNull(retval);
+
+        //We'll put a RibEntry at an aggregate node and check if lookup returns correctly
+        Prefix p2 = new Prefix("192.0.0.0", 4);
+        RibEntry r2 = new RibEntry("192.168.10.101", "192.168.60.1");
+        retval = ptree.put(p2, r2);
+        assertNull(retval);
+        retval = ptree.lookup(p2);
+        assertTrue(retval.equals(r2));
+    }
+
+    //@Ignore
+    @Test
+    public void testMatch() {
+        Prefix p1 = new Prefix("192.168.10.30", 32);
+        Prefix p2 = new Prefix("192.168.10.30", 31);
+        Prefix p3 = new Prefix("192.168.8.241", 32);
+        Prefix p4 = new Prefix("1.0.0.0", 32);
+        Prefix p5 = new Prefix("192.168.8.0", 22);
+        Prefix p6 = new Prefix("192.168.8.0", 21);
+
+        assertTrue(ptree.match(p1).equals(mappings.get(prefixes[0])));
+        assertTrue(ptree.match(p2).equals(mappings.get(prefixes[0])));
+        assertTrue(ptree.match(p3).equals(mappings.get(prefixes[1])));
+        assertNull(ptree.match(p4));
+        assertTrue(ptree.match(p5).equals(mappings.get(prefixes[2])));
+        //System.out.println(ptree.match(p6).getNextHop().getHostAddress());
+        assertTrue(ptree.match(p6).equals(mappings.get(prefixes[8])));
+
+
+        //TODO more extensive tests
+        //fail("Not yet implemented");
+    }
+
+    @Test
+    public void testRemove() {
+        Prefix p1 = new Prefix("192.168.8.0", 23);
+        RibEntry retval = ptree.lookup(p1);
+        assertNotNull(retval);
+        boolean success = ptree.remove(p1, retval);
+        assertTrue(success);
+
+        Prefix p2 = new Prefix("192.168.8.0", 22);
+        Prefix p3 = new Prefix("192.168.10.0", 24);
+
+        //Test it does the right thing with null arguments
+        success = ptree.remove(null, null);
+        assertFalse(success);
+        success = ptree.remove(p2, null);
+        assertFalse(success);
+
+        //Check other prefixes are still there
+        retval = ptree.lookup(p2);
+        assertNotNull(retval);
+        retval = ptree.lookup(p3);
+        assertNotNull(retval);
+
+        Prefix p4 = new Prefix("9.17.0.0", 12);
+        retval = ptree.lookup(p4);
+        assertNotNull(retval);
+        success = ptree.remove(p4, retval);
+        assertTrue(success);
+        success = ptree.remove(p4, retval);
+        assertFalse(success);
+
+        //Check other prefixes are still there
+        retval = ptree.lookup(p2);
+        assertNotNull(retval);
+        retval = ptree.lookup(p3);
+        assertNotNull(retval);
+
+        Prefix p5 = new Prefix("192.0.0.0", 7);
+        retval = ptree.lookup(p5);
+        assertNotNull(retval);
+        success = ptree.remove(p5, retval);
+        assertTrue(success);
+
+        //Check other prefixes are still there
+        retval = ptree.lookup(p2);
+        assertNotNull(retval);
+        retval = ptree.lookup(p3);
+        assertNotNull(retval);
+
+
+    }
+
+    @Test(expected = java.util.NoSuchElementException.class)
+    public void testIterator() {
+        int[] order = new int[]{7, 5, 3, 8, 2, 1, 0, 4, 6};
+
+        Iterator<IPatriciaTree.Entry<RibEntry>> it = ptree.iterator();
+        int i = 0;
+        assertTrue(it.hasNext());
+        while (it.hasNext()) {
+            IPatriciaTree.Entry<RibEntry> entry = it.next();
+            assertTrue(entry.getPrefix().equals(prefixes[order[i]]));
+            i++;
+        }
+        assertFalse(it.hasNext());
+        assertTrue(i == order.length);
+
+        IPatriciaTree<RibEntry> pt = new PatriciaTree<RibEntry>(32);
+        Iterator<IPatriciaTree.Entry<RibEntry>> it2 = pt.iterator();
+        assertFalse(it2.hasNext());
+        it.next(); //throws NoSuchElementException
+    }
+
+}
diff --git a/src/test/java/net/onrc/onos/apps/sdnip/PrefixTest.java b/src/test/java/net/onrc/onos/apps/sdnip/PrefixTest.java
new file mode 100644
index 0000000..d1e5f9a
--- /dev/null
+++ b/src/test/java/net/onrc/onos/apps/sdnip/PrefixTest.java
@@ -0,0 +1,101 @@
+package net.onrc.onos.apps.sdnip;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PrefixTest {
+
+    @Before
+    public void setUp() throws Exception {
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testPrefixByteArray() {
+        byte[] b1 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0x00, (byte) 0x00};
+        byte[] b2 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0xff, (byte) 0xff};
+        byte[] b3 = new byte[]{(byte) 0x8f, (byte) 0xac, (byte) 0x00, (byte) 0x00};
+        byte[] b4 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0x00, (byte) 0x00};
+
+        Prefix p1 = new Prefix(b1, 12);
+        Prefix p2 = new Prefix(b2, 12);
+        Prefix p3 = new Prefix(b3, 12);
+        Prefix p4 = new Prefix(b4, 11);
+
+        //Have different byte arrays, but should be equal after construction
+        assertTrue(p1.equals(p2));
+        assertTrue(p2.equals(p3));
+
+        //Same byte array, but should be false
+        assertFalse(p1.equals(p4));
+
+        assertTrue(Arrays.equals(p1.getAddress(), p3.getAddress()));
+        assertTrue(p1.toString().equals(p2.toString()));
+        assertTrue(Arrays.equals(p1.getAddress(), p4.getAddress()));
+        assertFalse(p1.toString().equals(p4.toString()));
+    }
+
+    @Test
+    public void testPrefixString() {
+        Prefix p1 = new Prefix("192.168.166.0", 24);
+        Prefix p2 = new Prefix("192.168.166.0", 23);
+        Prefix p3 = new Prefix("192.168.166.128", 24);
+        Prefix p4 = new Prefix("192.168.166.128", 25);
+
+        assertFalse(p1.equals(p2));
+        assertTrue(Arrays.equals(p1.getAddress(), p2.getAddress()));
+
+        assertTrue(p1.equals(p3));
+        assertTrue(Arrays.equals(p1.getAddress(), p2.getAddress()));
+
+        assertFalse(p3.equals(p4));
+        assertFalse(Arrays.equals(p3.getAddress(), p4.getAddress()));
+
+        assertTrue(p1.toString().equals(p3.toString()));
+        assertEquals(p1.hashCode(), p3.hashCode());
+    }
+
+    @Test
+    public void testPrefixReturnsSame() {
+        //Create a prefix of all 1s for each prefix length.
+        //Check that Prefix doesn't mangle it
+        int MAX_PREFIX_LENGTH = 32;
+        for (int prefixLength = 1; prefixLength <= MAX_PREFIX_LENGTH; prefixLength++) {
+            byte address[] = new byte[MAX_PREFIX_LENGTH / Byte.SIZE];
+
+            int lastByte = (prefixLength - 1) / Byte.SIZE;
+            int lastBit = (prefixLength - 1) % Byte.SIZE;
+
+            for (int j = 0; j < address.length; j++) {
+                if (j < lastByte) {
+                    address[j] = (byte) 0xff;
+                } else if (j == lastByte) {
+                    byte b = 0;
+                    byte msb = (byte) 0x80;
+                    for (int k = 0; k < Byte.SIZE; k++) {
+                        if (k <= lastBit) {
+                            b |= (msb >> k);
+                        }
+                    }
+                    address[j] = b;
+                } else {
+                    address[j] = 0;
+                }
+            }
+
+            Prefix p = new Prefix(address, prefixLength);
+            System.out.println(p.printAsBits());
+            assertTrue(Arrays.equals(address, p.getAddress()));
+        }
+    }
+}
diff --git a/src/test/java/net/onrc/onos/apps/sdnip/PtreeTest.java b/src/test/java/net/onrc/onos/apps/sdnip/PtreeTest.java
new file mode 100644
index 0000000..4fac2f2
--- /dev/null
+++ b/src/test/java/net/onrc/onos/apps/sdnip/PtreeTest.java
@@ -0,0 +1,230 @@
+package net.onrc.onos.apps.sdnip;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.net.InetAddresses;
+
+public class PtreeTest {
+
+    private Logger log = LoggerFactory.getLogger(PtreeTest.class);
+
+    private Ptree ptree;
+    private PatriciaTree<RibEntry> ooPtree;
+
+    private Map<String, byte[]> byteAddresses;
+
+    @Before
+    public void setUp() throws Exception {
+        ptree = new Ptree(32);
+        ooPtree = new PatriciaTree<RibEntry>(32);
+
+        String[] strPrefixes = {
+                "192.168.10.0/24",
+                "192.168.10.0/23",
+                "192.168.10.0/22",
+                "192.0.0.0/7",
+                "192.168.11.0/24",
+                "10.0.23.128/25",
+                "206.17.144.0/20",
+                "9.17.0.0/12",
+                "192.168.0.0/16"
+        };
+
+        byteAddresses = new HashMap<String, byte[]>(strPrefixes.length + 10);
+        for (String prefix : strPrefixes) {
+            String address = prefix.split("/")[0];
+            int prefixLength = Integer.parseInt(prefix.split("/")[1]);
+            byteAddresses.put(prefix, InetAddresses.forString(address).getAddress());
+
+            PtreeNode node = ptree.acquire(byteAddresses.get(prefix), prefixLength);
+            // node.rib = new RibEntry("192.168.10.101", "192.168.60.1");
+            ooPtree.put(new Prefix(byteAddresses.get(prefix), prefixLength),
+                    new RibEntry("192.168.10.101", "192.168.60.1"));
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Ignore
+    @Test
+    public void testAcquireByteArray() {
+        fail("Not yet implemented");
+    }
+
+    @Ignore
+    @Test
+    public void testAcquireByteArrayInt() {
+        //First let's test an empty Ptree
+        Ptree localPtree = new Ptree(32);
+        PtreeNode node = localPtree.acquire(new byte[]{0x00, 0x00, 0x00, 0x00});
+        // assertTrue(node != null && node.rib == null);
+        assertTrue(node != null);
+
+        //Now let's look at the prepopulated tree
+        String testPrefix = "206.17.144.0/20";
+        PtreeNode existingNode = ptree.acquire(byteAddresses.get(testPrefix), 20);
+        printByteArray(existingNode.key);
+        printByteArray(byteAddresses.get(testPrefix));
+        // assertTrue(existingNode != null && existingNode.rib == null);
+        assertTrue(existingNode != null);
+
+        assertTrue(Arrays.equals(existingNode.key, byteAddresses.get(testPrefix)));
+    }
+
+    @Test
+    public void testLookup() {
+        String prefix1 = "192.168.10.12";
+        int length1 = 29;
+        PtreeNode node1 = ptree.lookup(InetAddresses.forString(prefix1).getAddress(), length1);
+
+        //There should be no direct match
+        assertTrue(node1 == null);
+
+        log.debug("{} null: {}", "node1", node1 == null ? "true" : "false");
+
+        String prefix2 = "206.17.144.0";
+        int length2 = 20;
+        PtreeNode node2 = ptree.lookup(InetAddresses.forString(prefix2).getAddress(), length2);
+
+        assertTrue(node2 != null);
+        assertTrue(Arrays.equals(node2.key, byteAddresses.get(prefix2 + "/" + length2)));
+
+        log.debug("{} null: {}", "node2", node2 == null ? "true" : "false");
+        if (node2 != null) {
+            log.debug("{} key: {}, keybits: {}", new Object[]{"node2", node2.key, node2.keyBits});
+        }
+
+        String prefix3 = "192.0.0.0";
+        int length3 = 7;
+        PtreeNode node3 = ptree.lookup(InetAddresses.forString(prefix3).getAddress(), length3);
+        assertTrue(node3 != null);
+    }
+
+    @Test
+    public void testMatch() {
+        String prefix1 = "192.168.10.12";
+        int length1 = 29;
+        PtreeNode node1 = ptree.match(InetAddresses.forString(prefix1).getAddress(), length1);
+
+        //There should be no direct match, but we should get the covering prefix
+        assertTrue(node1 != null);
+        assertTrue(Arrays.equals(node1.key, byteAddresses.get("192.168.10.0/24")));
+
+        log.debug("{} null: {}", "node1", node1 == null ? "true" : "false");
+        if (node1 != null) {
+            log.debug("{} key: {}, keybits: {}", new Object[]{"node1", node1.key, node1.keyBits});
+        }
+    }
+
+    @Ignore
+    @Test
+    public void testTraverse() {
+
+        String expected = "[0, 0, 0, 0]/0\n";
+        expected += "[8, 0, 0, 0]/6\n";
+        expected += "[9, 17, 0, 0]/12\n";
+        expected += "[10, 0, 23, -128]/25\n";
+        expected += "[-64, 0, 0, 0]/4\n";
+        expected += "[-64, -88, 0, 0]/16\n";
+        expected += "[-64, -88, 8, 0]/22\n";
+        expected += "[-64, -88, 10, 0]/23\n";
+        expected += "[-64, -88, 10, 0]/24\n";
+        expected += "[-64, -88, 11, 0]/24\n";
+        expected += "[-50, 17, -112, 0]/20\n";
+
+        PtreeNode node;
+        String result = "";
+
+        for (node = ptree.begin(); node != null; node = ptree.next(node)) {
+            result += printByteArray(node.key) + "/" + node.keyBits + "\n";
+        }
+
+        assertEquals(expected, result);
+    }
+
+    @Ignore
+    @Test
+    public void testBegin() {
+        fail("Not yet implemented");
+    }
+
+    @Ignore
+    @Test
+    public void testNext() {
+        fail("Not yet implemented");
+    }
+
+    @Ignore
+    @Test
+    public void testDelReference() {
+        fail("Not yet implemented");
+    }
+
+    @Ignore
+    @Test
+    public void testMisc() {
+        int bitIndex = -1;
+        int index = (int) (bitIndex / Byte.SIZE);
+        int bit = (int) (bitIndex % Byte.SIZE);
+
+        log.debug("index {} bit {}", index, bit);
+        log.debug("percent {}", 1 % 8);
+
+        //PtreeNode node1 = new PtreeNode(new byte[] {0x0, 0x0, 0x0, 0x0}, 0, 4);
+        PtreeNode node1 = new PtreeNode(null, 0, 4);
+        log.debug("node1: key {}, keybits {}", printByteArray(node1.key), node1.keyBits);
+
+        //PtreeNode node2 = new PtreeNode(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff},
+        PtreeNode node2 = new PtreeNode(null,
+                32, 4);
+        log.debug("node2: key {}, keybits {}", printByteArray(node2.key), node2.keyBits);
+    }
+
+    @Test
+    public void testIteration() {
+        Iterator<IPatriciaTree.Entry<RibEntry>> it = ooPtree.iterator();
+
+        while (it.hasNext()) {
+            IPatriciaTree.Entry<RibEntry> entry = it.next();
+            log.debug("PatriciaTree prefix {} \t {}", entry.getPrefix(), entry.getPrefix().printAsBits());
+        }
+
+        try {
+            PtreeNode node;
+            for (node = ptree.begin(); node != null; node = ptree.next(node)) {
+                log.debug("Ptree prefix {}/{}", InetAddress.getByAddress(node.key).getHostAddress(), node.keyBits);
+            }
+        } catch (UnknownHostException e) {
+
+        }
+    }
+
+    private String printByteArray(byte[] array) {
+        String result = "[";
+        for (byte b : array) {
+            result += b + ", ";
+        }
+        result = result.substring(0, result.length() - 2);
+        result += "]";
+        return result;
+    }
+
+}