Cherry pick ONOS-4835 fix

Change-Id: I82ecb542dad4430d55af0fc684f8d13d6e45b45e
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/GroupsWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/GroupsWebResource.java
index 5d61c0b..77e6287 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/GroupsWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/GroupsWebResource.java
@@ -44,6 +44,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.onlab.util.HexString;
 import static org.onlab.util.Tools.nullIsNotFound;
 
 /**
@@ -115,7 +116,12 @@
     public Response getGroupByDeviceIdAndAppCookie(@PathParam("deviceId") String deviceId,
                                                    @PathParam("appCookie") String appCookie) {
         final DeviceId deviceIdInstance = DeviceId.deviceId(deviceId);
-        final GroupKey appCookieInstance = new DefaultGroupKey(appCookie.getBytes());
+
+        if (!appCookie.startsWith("0x")) {
+            throw new IllegalArgumentException("APP_COOKIE must be a hex string starts with 0x");
+        }
+        final GroupKey appCookieInstance = new DefaultGroupKey(HexString.fromHexString(
+                appCookie.split("0x")[1], ""));
 
         Group group = nullIsNotFound(groupService.getGroup(deviceIdInstance, appCookieInstance),
                 GROUP_NOT_FOUND);
@@ -179,7 +185,12 @@
     public Response deleteGroupByDeviceIdAndAppCookie(@PathParam("deviceId") String deviceId,
                                                       @PathParam("appCookie") String appCookie) {
         DeviceId deviceIdInstance = DeviceId.deviceId(deviceId);
-        GroupKey appCookieInstance = new DefaultGroupKey(appCookie.getBytes());
+
+        if (!appCookie.startsWith("0x")) {
+            throw new IllegalArgumentException("APP_COOKIE must be a hex string starts with 0x");
+        }
+        GroupKey appCookieInstance = new DefaultGroupKey(HexString.fromHexString(
+                appCookie.split("0x")[1], ""));
 
         groupService.removeGroup(deviceIdInstance, appCookieInstance, null);
         return Response.noContent().build();
diff --git a/web/api/src/main/resources/definitions/Groups.json b/web/api/src/main/resources/definitions/Groups.json
index 22f36fb..04273e0 100644
--- a/web/api/src/main/resources/definitions/Groups.json
+++ b/web/api/src/main/resources/definitions/Groups.json
@@ -67,6 +67,11 @@
             "description": "types of the group",
             "example": "ALL"
           },
+          "deviceId": {
+            "type": "string",
+            "description": "device identifier",
+            "example": "of:0000000000000003"
+          },
           "appId": {
             "type": "string",
             "description": "application identifier",
@@ -154,4 +159,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/web/api/src/main/resources/definitions/GroupsPost.json b/web/api/src/main/resources/definitions/GroupsPost.json
index 7ea7b50..203e2e4 100644
--- a/web/api/src/main/resources/definitions/GroupsPost.json
+++ b/web/api/src/main/resources/definitions/GroupsPost.json
@@ -3,7 +3,6 @@
   "title": "group",
   "required": [
     "type",
-    "deviceId",
     "appCookie",
     "groupId",
     "buckets"
@@ -13,10 +12,6 @@
       "type": "string",
       "example": "ALL"
     },
-    "deviceId": {
-      "type": "string",
-      "example": "of:0000000000000001"
-    },
     "appCookie": {
       "type": "string",
       "description": "application cookie. Arbitrary length byte array represented in hex string",
@@ -82,4 +77,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/web/api/src/test/java/org/onosproject/rest/resources/GroupsResourceTest.java b/web/api/src/test/java/org/onosproject/rest/resources/GroupsResourceTest.java
index 11334d2..63a7daa 100644
--- a/web/api/src/test/java/org/onosproject/rest/resources/GroupsResourceTest.java
+++ b/web/api/src/test/java/org/onosproject/rest/resources/GroupsResourceTest.java
@@ -95,14 +95,14 @@
     final Device device2 = new DefaultDevice(null, deviceId2, Device.Type.OTHER,
             "", "", "", "", null);
 
-    final MockGroup group1 = new MockGroup(deviceId1, 1, "111", 1);
-    final MockGroup group2 = new MockGroup(deviceId1, 2, "222", 2);
+    final MockGroup group1 = new MockGroup(deviceId1, 1, "0x111", 1);
+    final MockGroup group2 = new MockGroup(deviceId1, 2, "0x222", 2);
 
-    final MockGroup group3 = new MockGroup(deviceId2, 3, "333", 3);
-    final MockGroup group4 = new MockGroup(deviceId2, 4, "444", 4);
+    final MockGroup group3 = new MockGroup(deviceId2, 3, "0x333", 3);
+    final MockGroup group4 = new MockGroup(deviceId2, 4, "0x444", 4);
 
-    final MockGroup group5 = new MockGroup(deviceId3, 5, "555", 5);
-    final MockGroup group6 = new MockGroup(deviceId3, 6, "666", 6);
+    final MockGroup group5 = new MockGroup(deviceId3, 5, "0x555", 5);
+    final MockGroup group6 = new MockGroup(deviceId3, 6, "0x666", 6);
 
     /**
      * Mock class for a group.
@@ -462,7 +462,7 @@
                 .andReturn(group5).anyTimes();
         replay(mockGroupService);
         final WebTarget wt = target();
-        final String response = wt.path("groups/" + deviceId3 + "/" + "111")
+        final String response = wt.path("groups/" + deviceId3 + "/" + "0x111")
                 .request().get(String.class);
         final JsonObject result = Json.parse(response).asObject();
         assertThat(result, notNullValue());
@@ -484,7 +484,7 @@
                 .andReturn(null).anyTimes();
         replay(mockGroupService);
         final WebTarget wt = target();
-        final Response response = wt.path("groups/" + deviceId3 + "/" + "222").request().get();
+        final Response response = wt.path("groups/" + deviceId3 + "/" + "0x222").request().get();
 
         assertEquals(404, response.getStatus());
     }
@@ -522,7 +522,7 @@
 
         WebTarget wt = target();
 
-        String location = "/groups/1/111";
+        String location = "/groups/1/0x111";
 
         Response deleteResponse = wt.path(location)
                 .request(MediaType.APPLICATION_JSON_TYPE)