Make results of application codec and swagger doc desc consistent

Application codec returns permissions, requiredApps and features
in string format. However, based on swagger doc, the codec is
supposed to return array. This commit fixes the type inconsistent
issue raised in application rest api.

Change-Id: If47338b287518a981c98ff89ca543802579c7610
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/ApplicationCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/ApplicationCodec.java
index 3c6f37c..4886e60 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/ApplicationCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/ApplicationCodec.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.codec.impl;
 
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.commons.lang3.StringEscapeUtils;
 import org.onosproject.app.ApplicationService;
@@ -33,7 +34,16 @@
     public ObjectNode encode(Application app, CodecContext context) {
         checkNotNull(app, "Application cannot be null");
         ApplicationService service = context.getService(ApplicationService.class);
-        return context.mapper().createObjectNode()
+
+        ArrayNode permissions = context.mapper().createArrayNode();
+        ArrayNode features = context.mapper().createArrayNode();
+        ArrayNode requiredApps = context.mapper().createArrayNode();
+
+        app.permissions().forEach(p -> permissions.add(p.toString()));
+        app.features().forEach(f -> features.add(f));
+        app.requiredApps().forEach(a -> requiredApps.add(a));
+
+        ObjectNode result = context.mapper().createObjectNode()
                 .put("name", app.id().name())
                 .put("id", app.id().id())
                 .put("version", app.version().toString())
@@ -42,11 +52,14 @@
                 .put("readme", StringEscapeUtils.escapeJson(app.readme()))
                 .put("origin", app.origin())
                 .put("url", app.url())
-                .put("permissions", app.permissions().toString()) // FIXME: change to an array
                 .put("featuresRepo", app.featuresRepo().isPresent() ?
                         app.featuresRepo().get().toString() : "")
-                .put("features", app.features().toString()) // FIXME: change to an array
-                .put("requiredApps", app.requiredApps().toString()) // FIXME: change to an array
                 .put("state", service.getState(app.id()).toString());
+
+        result.set("features", features);
+        result.set("permissions", permissions);
+        result.set("requiredApps", requiredApps);
+
+        return result;
     }
 }
diff --git a/web/api/src/main/resources/definitions/Application.json b/web/api/src/main/resources/definitions/Application.json
index 9be4fe4..d55f7b9 100644
--- a/web/api/src/main/resources/definitions/Application.json
+++ b/web/api/src/main/resources/definitions/Application.json
@@ -53,7 +53,7 @@
     "permissions": {
       "type": "array",
       "xml": {
-        "name": "hosts",
+        "name": "permissions",
         "wrapped": true
       },
       "items": {
diff --git a/web/api/src/main/resources/definitions/ApplicationPost.json b/web/api/src/main/resources/definitions/ApplicationPost.json
index 9be4fe4..d55f7b9 100644
--- a/web/api/src/main/resources/definitions/ApplicationPost.json
+++ b/web/api/src/main/resources/definitions/ApplicationPost.json
@@ -53,7 +53,7 @@
     "permissions": {
       "type": "array",
       "xml": {
-        "name": "hosts",
+        "name": "permissions",
         "wrapped": true
       },
       "items": {
diff --git a/web/api/src/main/resources/definitions/Applications.json b/web/api/src/main/resources/definitions/Applications.json
index 32a225d..9e4f2eb 100644
--- a/web/api/src/main/resources/definitions/Applications.json
+++ b/web/api/src/main/resources/definitions/Applications.json
@@ -66,7 +66,7 @@
           "permissions": {
             "type": "array",
             "xml": {
-              "name": "hosts",
+              "name": "permissions",
               "wrapped": true
             },
             "items": {