[ONOS-3634] Enhance app to have a category, icon, URL and readme

This commmit enhances application to have category, icon, URL and
readme. The web GUI and CLI will be implemented in separate commits

Change-Id: Ib02716d7118cc617b24f196f2213ea1fe99a34be
diff --git a/core/api/src/main/java/org/onosproject/app/ApplicationDescription.java b/core/api/src/main/java/org/onosproject/app/ApplicationDescription.java
index e8ff9ec..1528f35 100644
--- a/core/api/src/main/java/org/onosproject/app/ApplicationDescription.java
+++ b/core/api/src/main/java/org/onosproject/app/ApplicationDescription.java
@@ -44,6 +44,13 @@
     Version version();
 
     /**
+     * Returns the name of the application origin, group or company.
+     *
+     * @return application origin
+     */
+    String origin();
+
+    /**
      * Returns description of the application.
      *
      * @return application description text
@@ -51,11 +58,32 @@
     String description();
 
     /**
-     * Returns the name of the application origin, group or company.
+     * Returns category of the application.
      *
-     * @return application origin
+     * @return application category text
      */
-    String origin();
+    String category();
+
+    /**
+     * Returns url of the application.
+     *
+     * @return application url
+     */
+    String url();
+
+    /**
+     * Returns readme of the application.
+     *
+     * @return application readme
+     */
+    String readme();
+
+    /**
+     * Returns icon of the application.
+     *
+     * @return application icon
+     */
+    byte[] icon();
 
     /**
      * Returns the role of the application.
diff --git a/core/api/src/main/java/org/onosproject/app/DefaultApplicationDescription.java b/core/api/src/main/java/org/onosproject/app/DefaultApplicationDescription.java
index 569183a..3e52001 100644
--- a/core/api/src/main/java/org/onosproject/app/DefaultApplicationDescription.java
+++ b/core/api/src/main/java/org/onosproject/app/DefaultApplicationDescription.java
@@ -37,6 +37,10 @@
     private final Version version;
     private final String description;
     private final String origin;
+    private final String category;
+    private final String url;
+    private final String readme;
+    private final byte[] icon;
     private final ApplicationRole role;
     private final Set<Permission> permissions;
     private final Optional<URI> featuresRepo;
@@ -50,6 +54,10 @@
      * @param version      application version
      * @param description  application description
      * @param origin       origin company
+     * @param category     application category
+     * @param url          application URL
+     * @param readme       application readme
+     * @param icon         application icon
      * @param role         application role
      * @param permissions  requested permissions
      * @param featuresRepo optional features repo URI
@@ -57,7 +65,8 @@
      * @param requiredApps list of required application names
      */
     public DefaultApplicationDescription(String name, Version version,
-                                         String description, String origin,
+                                         String description, String origin, String category,
+                                         String url, String readme, byte[] icon,
                                          ApplicationRole role, Set<Permission> permissions,
                                          URI featuresRepo, List<String> features,
                                          List<String> requiredApps) {
@@ -65,6 +74,10 @@
         this.version = checkNotNull(version, "Version cannot be null");
         this.description = checkNotNull(description, "Description cannot be null");
         this.origin = checkNotNull(origin, "Origin cannot be null");
+        this.category = checkNotNull(category, "Category cannot be null");
+        this.url = checkNotNull(url, "URL cannot be null");
+        this.readme = readme;
+        this.icon = icon;
         this.role = checkNotNull(role, "Role cannot be null");
         this.permissions = checkNotNull(permissions, "Permissions cannot be null");
         this.featuresRepo = Optional.ofNullable(featuresRepo);
@@ -89,6 +102,26 @@
     }
 
     @Override
+    public String category() {
+        return category;
+    }
+
+    @Override
+    public String url() {
+        return url;
+    }
+
+    @Override
+    public String readme() {
+        return readme;
+    }
+
+    @Override
+    public byte[] icon() {
+        return icon;
+    }
+
+    @Override
     public String origin() {
         return origin;
     }
@@ -125,6 +158,9 @@
                 .add("version", version)
                 .add("description", description)
                 .add("origin", origin)
+                .add("category", category)
+                .add("url", url)
+                .add("readme", readme)
                 .add("role", role)
                 .add("permissions", permissions)
                 .add("featuresRepo", featuresRepo)
diff --git a/core/api/src/main/java/org/onosproject/core/Application.java b/core/api/src/main/java/org/onosproject/core/Application.java
index ea2eab9..8700cad 100644
--- a/core/api/src/main/java/org/onosproject/core/Application.java
+++ b/core/api/src/main/java/org/onosproject/core/Application.java
@@ -49,6 +49,34 @@
     String description();
 
     /**
+     * Returns category of the application.
+     *
+     * @return application category text
+     */
+    String category();
+
+    /**
+     * Returns url of the application.
+     *
+     * @return application url
+     */
+    String url();
+
+    /**
+     * Returns readme of the application.
+     *
+     * @return application readme
+     */
+    String readme();
+
+    /**
+     * Returns icon of the application.
+     *
+     * @return application icon
+     */
+    byte[] icon();
+
+    /**
      * Returns the name of the application origin, group or company.
      *
      * @return application origin
diff --git a/core/api/src/main/java/org/onosproject/core/DefaultApplication.java b/core/api/src/main/java/org/onosproject/core/DefaultApplication.java
index c351563..8d63600 100644
--- a/core/api/src/main/java/org/onosproject/core/DefaultApplication.java
+++ b/core/api/src/main/java/org/onosproject/core/DefaultApplication.java
@@ -35,6 +35,10 @@
     private final ApplicationId appId;
     private final Version version;
     private final String description;
+    private final String category;
+    private final String url;
+    private final String readme;
+    private final byte[] icon;
     private final String origin;
     private final ApplicationRole role;
     private final Set<Permission> permissions;
@@ -49,6 +53,10 @@
      * @param version      application version
      * @param description  application description
      * @param origin       origin company
+     * @param category     application category
+     * @param url          application URL
+     * @param readme       application readme
+     * @param icon         application icon
      * @param role         application role
      * @param permissions  requested permissions
      * @param featuresRepo optional features repo URI
@@ -56,7 +64,8 @@
      * @param requiredApps list of required application names
      */
     public DefaultApplication(ApplicationId appId, Version version,
-                              String description, String origin,
+                              String description, String origin, String category,
+                              String url, String readme, byte[] icon,
                               ApplicationRole role, Set<Permission> permissions,
                               Optional<URI> featuresRepo, List<String> features,
                               List<String> requiredApps) {
@@ -64,6 +73,10 @@
         this.version = checkNotNull(version, "Version cannot be null");
         this.description = checkNotNull(description, "Description cannot be null");
         this.origin = checkNotNull(origin, "Origin cannot be null");
+        this.category = checkNotNull(category, "Category cannot be null");
+        this.url = checkNotNull(url, "URL cannot be null");
+        this.readme = readme;
+        this.icon = icon;
         this.role = checkNotNull(role, "Role cannot be null");
         this.permissions = checkNotNull(permissions, "Permissions cannot be null");
         this.featuresRepo = checkNotNull(featuresRepo, "Features repo cannot be null");
@@ -88,6 +101,26 @@
     }
 
     @Override
+    public String category() {
+        return category;
+    }
+
+    @Override
+    public String url() {
+        return url;
+    }
+
+    @Override
+    public String readme() {
+        return readme;
+    }
+
+    @Override
+    public byte[] icon() {
+        return icon;
+    }
+
+    @Override
     public String origin() {
         return origin;
     }
@@ -119,8 +152,8 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(appId, version, description, origin, role, permissions,
-                            featuresRepo, features, requiredApps);
+        return Objects.hash(appId, version, description, origin, category, url,
+                            readme, role, permissions, featuresRepo, features, requiredApps);
     }
 
     @Override
@@ -136,6 +169,9 @@
                 Objects.equals(this.version, other.version) &&
                 Objects.equals(this.description, other.description) &&
                 Objects.equals(this.origin, other.origin) &&
+                Objects.equals(this.category, other.category) &&
+                Objects.equals(this.url, other.url) &&
+                Objects.equals(this.readme, other.readme) &&
                 Objects.equals(this.role, other.role) &&
                 Objects.equals(this.permissions, other.permissions) &&
                 Objects.equals(this.featuresRepo, other.featuresRepo) &&
@@ -150,6 +186,9 @@
                 .add("version", version)
                 .add("description", description)
                 .add("origin", origin)
+                .add("category", category)
+                .add("url", url)
+                .add("readme", readme)
                 .add("role", role)
                 .add("permissions", permissions)
                 .add("featuresRepo", featuresRepo)
diff --git a/core/api/src/test/java/org/onosproject/app/ApplicationEventTest.java b/core/api/src/test/java/org/onosproject/app/ApplicationEventTest.java
index 34c593c..0d4ae4c 100644
--- a/core/api/src/test/java/org/onosproject/app/ApplicationEventTest.java
+++ b/core/api/src/test/java/org/onosproject/app/ApplicationEventTest.java
@@ -32,8 +32,9 @@
 public class ApplicationEventTest extends AbstractEventTest {
 
     private Application createApp() {
-        return new DefaultApplication(APP_ID, VER, DESC, ORIGIN, ROLE,
-                                      PERMS, Optional.of(FURL), FEATURES, APPS);
+        return new DefaultApplication(APP_ID, VER, DESC, ORIGIN, CATEGORY,
+                                      URL, README, ICON, ROLE, PERMS,
+                                      Optional.of(FURL), FEATURES, APPS);
     }
 
     @Test
diff --git a/core/api/src/test/java/org/onosproject/app/DefaultApplicationDescriptionTest.java b/core/api/src/test/java/org/onosproject/app/DefaultApplicationDescriptionTest.java
index 0e93c1f..e01d4d8 100644
--- a/core/api/src/test/java/org/onosproject/app/DefaultApplicationDescriptionTest.java
+++ b/core/api/src/test/java/org/onosproject/app/DefaultApplicationDescriptionTest.java
@@ -40,6 +40,10 @@
     public static final Version VER = Version.version(1, 2, "a", null);
     public static final String DESC = "Awesome application from Circus, Inc.";
     public static final String ORIGIN = "Circus";
+    public static final String CATEGORY = "other";
+    public static final String URL = "http://www.onosproject.org";
+    public static final String README = "Awesome application from Circus, Inc.";
+    public static final byte[] ICON = new byte[] {};
     public static final ApplicationRole ROLE = ApplicationRole.ADMIN;
     public static final Set<Permission> PERMS = ImmutableSet.of(
                             new Permission(AppPermission.class.getName(), "FLOWRULE_WRITE"),
@@ -52,17 +56,20 @@
     public void basics() {
         ApplicationDescription app =
                 new DefaultApplicationDescription(APP_NAME, VER, DESC, ORIGIN,
+                                                  CATEGORY, URL, README, ICON,
                                                   ROLE, PERMS, FURL, FEATURES, APPS);
         assertEquals("incorrect id", APP_NAME, app.name());
         assertEquals("incorrect version", VER, app.version());
         assertEquals("incorrect description", DESC, app.description());
         assertEquals("incorrect origin", ORIGIN, app.origin());
-        assertEquals("incorect role", ROLE, app.role());
+        assertEquals("incorrect category", CATEGORY, app.category());
+        assertEquals("incorrect URL", URL, app.url());
+        assertEquals("incorrect readme", README, app.readme());
+        assertEquals("incorrect role", ROLE, app.role());
         assertEquals("incorrect permissions", PERMS, app.permissions());
         assertEquals("incorrect features repo", FURL, app.featuresRepo().get());
         assertEquals("incorrect features", FEATURES, app.features());
         assertEquals("incorrect apps", APPS, app.requiredApps());
         assertTrue("incorrect toString", app.toString().contains(APP_NAME));
     }
-
 }
\ No newline at end of file
diff --git a/core/api/src/test/java/org/onosproject/core/DefaultApplicationTest.java b/core/api/src/test/java/org/onosproject/core/DefaultApplicationTest.java
index 77b3812..6cb0d0c 100644
--- a/core/api/src/test/java/org/onosproject/core/DefaultApplicationTest.java
+++ b/core/api/src/test/java/org/onosproject/core/DefaultApplicationTest.java
@@ -33,12 +33,17 @@
 
     @Test
     public void basics() {
-        Application app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, ROLE,
+        Application app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN,
+                                                 CATEGORY, URL, README, ICON, ROLE,
                                                  PERMS, Optional.of(FURL), FEATURES, APPS);
         assertEquals("incorrect id", APP_ID, app.id());
         assertEquals("incorrect version", VER, app.version());
         assertEquals("incorrect description", DESC, app.description());
         assertEquals("incorrect origin", ORIGIN, app.origin());
+        assertEquals("incorrect category", CATEGORY, app.category());
+        assertEquals("incorrect URL", URL, app.url());
+        assertEquals("incorrect readme", README, app.readme());
+        assertEquals("incorrect icon", ICON, app.icon());
         assertEquals("incorrect role", ROLE, app.role());
         assertEquals("incorrect permissions", PERMS, app.permissions());
         assertEquals("incorrect features repo", FURL, app.featuresRepo().get());
@@ -49,16 +54,19 @@
 
     @Test
     public void testEquality() {
-        Application a1 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, ROLE,
+        Application a1 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN,
+                                                CATEGORY, URL, README, ICON, ROLE,
                                                 PERMS, Optional.of(FURL), FEATURES, APPS);
-        Application a2 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, ROLE,
+        Application a2 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN,
+                                                CATEGORY, URL, README, ICON, ROLE,
                                                 PERMS, Optional.of(FURL), FEATURES, APPS);
-        Application a3 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, ROLE,
+        Application a3 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN,
+                                                CATEGORY, URL, README, ICON, ROLE,
                                                 PERMS, Optional.empty(), FEATURES, APPS);
-        Application a4 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN + "asd", ROLE,
+        Application a4 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN + "asd",
+                                                CATEGORY, URL, README, ICON, ROLE,
                                                 PERMS, Optional.of(FURL), FEATURES, APPS);
         new EqualsTester().addEqualityGroup(a1, a2)
                 .addEqualityGroup(a3).addEqualityGroup(a4).testEquals();
     }
-
 }
\ No newline at end of file
diff --git a/core/common/src/main/java/org/onosproject/common/app/ApplicationArchive.java b/core/common/src/main/java/org/onosproject/common/app/ApplicationArchive.java
index ab03ab2..42f8c9c 100644
--- a/core/common/src/main/java/org/onosproject/common/app/ApplicationArchive.java
+++ b/core/common/src/main/java/org/onosproject/common/app/ApplicationArchive.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2015-2016 Open Networking Laboratory
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.commons.lang.StringUtils;
 import org.onlab.util.Tools;
 import org.onosproject.app.ApplicationDescription;
 import org.onosproject.app.ApplicationEvent;
@@ -37,6 +38,10 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferByte;
+import java.awt.image.WritableRaster;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -81,6 +86,10 @@
     private static final String APPS = "[@apps]";
     private static final String DESCRIPTION = "description";
 
+    private static final String CATEGORY = "[@category]";
+    private static final String URL = "[@url]";
+    private static final String README = "readme";
+
     private static final String ROLE = "security.role";
     private static final String APP_PERMISSIONS = "security.permissions.app-perm";
     private static final String NET_PERMISSIONS = "security.permissions.net-perm";
@@ -88,6 +97,7 @@
 
     private static final String OAR = ".oar";
     private static final String APP_XML = "app.xml";
+    private static final String ICON_PNG = "icon.png";
     private static final String M2_PREFIX = "m2";
 
     private static final String ROOT = "../";
@@ -283,8 +293,10 @@
     private ApplicationDescription loadAppDescription(XMLConfiguration cfg) {
         String name = cfg.getString(NAME);
         Version version = Version.version(cfg.getString(VERSION));
-        String desc = cfg.getString(DESCRIPTION);
         String origin = cfg.getString(ORIGIN);
+        String category = cfg.getString(CATEGORY);
+        String url = cfg.getString(URL);
+        byte[] icon = getApplicationIcon(name);
         ApplicationRole role = getRole(cfg.getString(ROLE));
         Set<Permission> perms = getPermissions(cfg);
         String featRepo = cfg.getString(FEATURES_REPO);
@@ -295,7 +307,17 @@
         List<String> requiredApps = apps.isEmpty() ?
                 ImmutableList.of() : ImmutableList.copyOf(apps.split(","));
 
-        return new DefaultApplicationDescription(name, version, desc, origin, role,
+        String desc = cfg.getString(DESCRIPTION);
+        String readme = cfg.getString(README);
+
+        if (readme == null) {
+            readme = desc;
+        } else {
+            desc = compactDescription(readme);
+        }
+
+        return new DefaultApplicationDescription(name, version, desc, origin,
+                category, url, readme, icon, role,
                                                  perms, featuresRepo, features,
                                                  requiredApps);
     }
@@ -387,7 +409,6 @@
         return appFile(appName, "active").exists();
     }
 
-
     // Returns the name of the file located under the specified app directory.
     private File appFile(String appName, String fileName) {
         return new File(new File(appsDir, appName), fileName);
@@ -420,7 +441,33 @@
         return ImmutableSet.copyOf(permissionList);
     }
 
-    //
+    // Returns the byte stream from icon.png file in oar application archive.
+    private byte[] getApplicationIcon(String appName) {
+        // open image
+        File iconFile = appFile(appName, ICON_PNG);
+
+        if (!iconFile.exists()) {
+            iconFile = new File(appsDir, ICON_PNG);
+        }
+
+        if (!iconFile.exists()) {
+            return null;
+        }
+
+        BufferedImage bufferedImage = null;
+        try {
+            bufferedImage = ImageIO.read(iconFile);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        // get DataBufferBytes from Raster
+        WritableRaster raster = bufferedImage .getRaster();
+        DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
+
+        return data.getData();
+    }
+
     // Returns application role type
     public ApplicationRole getRole(String value) {
         if (value == null) {
@@ -434,4 +481,16 @@
             }
         }
     }
+
+    // Returns the first sentence of the given sentence
+    private String compactDescription(String sentence) {
+        if (StringUtils.isNotEmpty(sentence)) {
+            if (StringUtils.contains(sentence, ".")) {
+                return StringUtils.substringBefore(sentence, ".") + ".";
+            } else {
+                return sentence + ".";
+            }
+        }
+        return sentence;
+    }
 }
diff --git a/core/common/src/test/java/org/onosproject/common/app/ApplicationArchiveTest.java b/core/common/src/test/java/org/onosproject/common/app/ApplicationArchiveTest.java
index 97012c4..b8cda1c 100644
--- a/core/common/src/test/java/org/onosproject/common/app/ApplicationArchiveTest.java
+++ b/core/common/src/test/java/org/onosproject/common/app/ApplicationArchiveTest.java
@@ -60,6 +60,10 @@
         assertEquals("incorrect origin", ORIGIN, app.origin());
         assertEquals("incorrect role", ROLE, app.role());
 
+        assertEquals("incorrect category", CATEGORY, app.category());
+        assertEquals("incorrect url", URL, app.url());
+        assertEquals("incorrect readme", README, app.readme());
+
         assertEquals("incorrect description", DESC, app.description());
         assertEquals("incorrect features URI", FURL, app.featuresRepo().get());
         assertEquals("incorrect permissions", PERMS, app.permissions());
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationStore.java
index d9f5285..98c18b4 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationStore.java
@@ -74,6 +74,8 @@
             DefaultApplication app =
                     new DefaultApplication(appId, appDesc.version(),
                                            appDesc.description(), appDesc.origin(),
+                                           appDesc.category(), appDesc.url(),
+                                           appDesc.readme(), appDesc.icon(),
                                            appDesc.role(), appDesc.permissions(),
                                            appDesc.featuresRepo(), appDesc.features(),
                                            appDesc.requiredApps());
@@ -117,7 +119,9 @@
         ApplicationId appId = idStore.registerApplication(appDesc.name());
         DefaultApplication app =
                 new DefaultApplication(appId, appDesc.version(), appDesc.description(),
-                                       appDesc.origin(), appDesc.role(), appDesc.permissions(),
+                                       appDesc.origin(), appDesc.category(), appDesc.url(),
+                                       appDesc.readme(), appDesc.icon(),
+                                       appDesc.role(), appDesc.permissions(),
                                        appDesc.featuresRepo(), appDesc.features(),
                                        appDesc.requiredApps());
         apps.put(appId, app);
diff --git a/core/common/src/test/resources/org/onosproject/common/app/app.xml b/core/common/src/test/resources/org/onosproject/common/app/app.xml
index 0d91a73..6e58cb8 100644
--- a/core/common/src/test/resources/org/onosproject/common/app/app.xml
+++ b/core/common/src/test/resources/org/onosproject/common/app/app.xml
@@ -1,5 +1,5 @@
 <!--
-  ~ Copyright 2015 Open Networking Laboratory
+  ~ Copyright 2015-2016 Open Networking Laboratory
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -13,9 +13,9 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<app name="org.foo.app" origin="Circus" version="1.2.a"
-        featuresRepo="mvn:org.foo-features/1.2a/xml/features"
-        features="foo,bar">
+<app name="org.foo.app" origin="Circus" version="1.2.a" category="other"
+     url="http://www.onosproject.org" featuresRepo="mvn:org.foo-features/1.2a/xml/features"
+     readme="Awesome application from Circus, Inc." features="foo,bar">
     <description>Awesome application from Circus, Inc.</description>
     <security>
         <role>ADMIN</role>
@@ -23,7 +23,5 @@
             <app-perm>FLOWRULE_WRITE</app-perm>
             <app-perm>FLOWRULE_READ</app-perm>
         </permissions>
-
     </security>
-
 </app>
diff --git a/core/common/src/test/resources/org/onosproject/common/app/app.zip b/core/common/src/test/resources/org/onosproject/common/app/app.zip
index 436cd75..9d48b8f 100644
--- a/core/common/src/test/resources/org/onosproject/common/app/app.zip
+++ b/core/common/src/test/resources/org/onosproject/common/app/app.zip
Binary files differ
diff --git a/core/net/src/test/java/org/onosproject/app/impl/ApplicationManagerTest.java b/core/net/src/test/java/org/onosproject/app/impl/ApplicationManagerTest.java
index a99fd21..f66fb4d 100644
--- a/core/net/src/test/java/org/onosproject/app/impl/ApplicationManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/app/impl/ApplicationManagerTest.java
@@ -138,7 +138,8 @@
 
         @Override
         public Application create(InputStream appDescStream) {
-            app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, ROLE, PERMS,
+            app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, CATEGORY,
+                                         URL, README, ICON, ROLE, PERMS,
                                          Optional.of(FURL), FEATURES, ImmutableList.of());
             state = INSTALLED;
             delegate.notify(new ApplicationEvent(APP_INSTALLED, app));
diff --git a/core/store/dist/src/main/java/org/onosproject/store/app/GossipApplicationStore.java b/core/store/dist/src/main/java/org/onosproject/store/app/GossipApplicationStore.java
index 8ef0d5b..a762659 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/app/GossipApplicationStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/app/GossipApplicationStore.java
@@ -505,8 +505,9 @@
     private Application registerApp(ApplicationDescription appDesc) {
         ApplicationId appId = idStore.registerApplication(appDesc.name());
         return new DefaultApplication(appId, appDesc.version(), appDesc.description(),
-                                      appDesc.origin(), appDesc.role(), appDesc.permissions(),
-                                      appDesc.featuresRepo(), appDesc.features(),
-                                      appDesc.requiredApps());
+                                      appDesc.origin(), appDesc.category(), appDesc.url(),
+                                      appDesc.readme(), appDesc.icon(), appDesc.role(),
+                                      appDesc.permissions(), appDesc.featuresRepo(),
+                                      appDesc.features(), appDesc.requiredApps());
     }
 }