Add static factory method to create ConnectPoints from strings.

Change-Id: I743b4a4fb433ad07cf6f2cbed3da7b6e19a74ebb
diff --git a/core/api/src/main/java/org/onosproject/net/ConnectPoint.java b/core/api/src/main/java/org/onosproject/net/ConnectPoint.java
index 621cb2d..b5ff42c 100644
--- a/core/api/src/main/java/org/onosproject/net/ConnectPoint.java
+++ b/core/api/src/main/java/org/onosproject/net/ConnectPoint.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.net;
 
+import com.google.common.base.MoreObjects;
+
 import java.util.Objects;
 
-import com.google.common.base.MoreObjects;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Abstraction of a network connection point expressed as a pair of the
@@ -90,6 +93,42 @@
         return portNumber;
     }
 
+    /**
+     * Parse a device connect point from a string.
+     * The connect point should be in the format "deviceUri/portNumber".
+     *
+     * @param string string to parse
+     * @return a ConnectPoint based on the information in the string.
+     */
+    public static ConnectPoint deviceConnectPoint(String string) {
+        checkNotNull(string);
+        String[] splitted = string.split("/");
+        checkArgument(splitted.length == 2,
+                      "Connect point must be in \"deviceUri/portNumber\" format");
+
+        return new ConnectPoint(DeviceId.deviceId(splitted[0]),
+                                PortNumber.portNumber(splitted[1]));
+    }
+
+    /**
+     * Parse a host connect point from a string.
+     * The connect point should be in the format "hostId/vlanId/portNumber".
+     *
+     * @param string string to parse
+     * @return a ConnectPoint based on the information in the string.
+     */
+    public static ConnectPoint hostConnectPoint(String string) {
+        checkNotNull(string);
+        String[] splitted = string.split("/");
+        checkArgument(splitted.length == 3,
+                      "Connect point must be in \"hostId/vlanId/portNumber\" format");
+
+        int lastSlash = string.lastIndexOf("/");
+
+        return new ConnectPoint(HostId.hostId(string.substring(0, lastSlash)),
+                                PortNumber.portNumber(string.substring(lastSlash + 1, string.length())));
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(elementId, portNumber);
diff --git a/core/api/src/test/java/org/onosproject/net/ConnectPointTest.java b/core/api/src/test/java/org/onosproject/net/ConnectPointTest.java
index 9580481..2aecabd 100644
--- a/core/api/src/test/java/org/onosproject/net/ConnectPointTest.java
+++ b/core/api/src/test/java/org/onosproject/net/ConnectPointTest.java
@@ -18,12 +18,14 @@
 import com.google.common.testing.EqualsTester;
 import org.junit.Test;
 
+import static junit.framework.TestCase.fail;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.onosproject.net.DeviceId.deviceId;
 import static org.onosproject.net.PortNumber.portNumber;
 
 /**
- * Test of the connetion point entity.
+ * Test of the connection point entity.
  */
 public class ConnectPointTest {
 
@@ -39,7 +41,6 @@
         assertEquals("incorrect element id", P2, p.port());
     }
 
-
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -48,4 +49,62 @@
                 .addEqualityGroup(new ConnectPoint(DID2, P1), new ConnectPoint(DID2, P1))
                 .testEquals();
     }
+
+    @Test
+    public void testParseDeviceConnectPoint() {
+        String cp = "of:0011223344556677/1";
+
+        ConnectPoint connectPoint = ConnectPoint.deviceConnectPoint(cp);
+        assertEquals("of:0011223344556677", connectPoint.deviceId().toString());
+        assertEquals("1", connectPoint.port().toString());
+
+        expectDeviceParseException("");
+        expectDeviceParseException("1/");
+        expectDeviceParseException("1/1/1");
+        expectDeviceParseException("of:0011223344556677/word");
+    }
+
+    /**
+     * Parse a device connect point and expect an exception to be thrown.
+     *
+     * @param string string to parse
+     */
+    private static void expectDeviceParseException(String string) {
+        try {
+            ConnectPoint.deviceConnectPoint(string);
+            fail("Expected exception was not thrown");
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
+
+    @Test
+    public void testParseHostConnectPoint() {
+        String cp = "16:3A:BD:6E:31:E4/-1/1";
+
+        ConnectPoint connectPoint = ConnectPoint.hostConnectPoint(cp);
+        assertEquals("16:3A:BD:6E:31:E4/-1", connectPoint.hostId().toString());
+        assertEquals("1", connectPoint.port().toString());
+
+        expectHostParseException("");
+        expectHostParseException("1/");
+        expectHostParseException("1/1");
+        expectHostParseException("1/1/1/1");
+        expectHostParseException("16:3A:BD:6E:31:E4/word/1");
+        expectHostParseException("16:3A:BD:6E:31:E4/1/word");
+    }
+
+    /**
+     * Parse a host connect point and expect an exception to be thrown.
+     *
+     * @param string string to parse
+     */
+    private static void expectHostParseException(String string) {
+        try {
+            ConnectPoint.hostConnectPoint(string);
+            fail("Expected exception was not thrown");
+        } catch (Exception e) {
+            assertTrue(true);
+        }
+    }
 }