Add JSON decoders for Host and HostLocation

- HostsWebResource will use the Host codec in parsing JSON for create-host requests

Change-Id: If51bf3433a4ab45889a94a6d11bbd3db6b96d074
(cherry picked from commit 46d2462e4e49855b0d533035250776589fd05d88)
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/HostLocationCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/HostLocationCodec.java
index efcd133..da4405d 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/HostLocationCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/HostLocationCodec.java
@@ -17,23 +17,45 @@
 
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.HostLocation;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.net.PortNumber;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
 
 /**
- * Host JSON codec.
+ * HostLocation JSON codec.
  */
 public final class HostLocationCodec extends JsonCodec<HostLocation> {
 
+    public static final String ELEMENT_ID = "elementId";
+    public static final String PORT = "port";
+
+    private static final String MISSING_MEMBER_MESSAGE =
+            " member is required in HostLocation";
+
     @Override
     public ObjectNode encode(HostLocation hostLocation, CodecContext context) {
         checkNotNull(hostLocation, "Host location cannot be null");
         return context.mapper().createObjectNode()
-                .put("elementId", hostLocation.elementId().toString())
-                .put("port", hostLocation.port().toString());
+                .put(ELEMENT_ID, hostLocation.elementId().toString())
+                .put(PORT, hostLocation.port().toString());
     }
 
+    @Override
+    public HostLocation decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        DeviceId deviceId = DeviceId.deviceId(nullIsIllegal(
+                json.get(ELEMENT_ID), ELEMENT_ID + MISSING_MEMBER_MESSAGE).asText());
+        PortNumber portNumber = PortNumber.portNumber(nullIsIllegal(
+                json.get(PORT), PORT + MISSING_MEMBER_MESSAGE).asText());
+
+        return new HostLocation(deviceId, portNumber, 0);
+    }
 }