[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/tools/package/maven-plugin/src/main/java/org/onosproject/maven/OnosAppMojo.java b/tools/package/maven-plugin/src/main/java/org/onosproject/maven/OnosAppMojo.java
index 09cf4dd..d52c3b7 100644
--- a/tools/package/maven-plugin/src/main/java/org/onosproject/maven/OnosAppMojo.java
+++ b/tools/package/maven-plugin/src/main/java/org/onosproject/maven/OnosAppMojo.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.ImmutableList;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.commons.lang.StringUtils;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -28,6 +29,11 @@
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 
+import javax.imageio.ImageIO;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferByte;
+import java.awt.image.WritableRaster;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -55,6 +61,7 @@
     private static final String ARTIFACT = "artifact";
 
     private static final String APP_XML = "app.xml";
+    private static final String ICON_PNG = "icon.png";
     private static final String FEATURES_XML = "features.xml";
 
     private static final String MVN_URL = "mvn:";
@@ -64,6 +71,10 @@
     private static final String ONOS_APP_ORIGIN = "onos.app.origin";
     private static final String ONOS_APP_REQUIRES = "onos.app.requires";
 
+    private static final String ONOS_APP_CATEGORY = "onos.app.category";
+    private static final String ONOS_APP_URL = "onos.app.url";
+    private static final String ONOS_APP_README = "onos.app.readme";
+
     private static final String JAR = "jar";
     private static final String XML = "xml";
     private static final String APP_ZIP = "oar";
@@ -72,6 +83,9 @@
     private static final String DEFAULT_ORIGIN = "ON.Lab";
     private static final String DEFAULT_VERSION = "${project.version}";
 
+    private static final String DEFAULT_CATEGORY = "Default";
+    private static final String DEFAULT_URL = "http://onosproject.org";
+
     private static final String DEFAULT_FEATURES_REPO =
             "mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features";
     private static final String DEFAULT_ARTIFACT =
@@ -82,6 +96,9 @@
     private String name;
     private String origin;
     private String requiredApps;
+    private String category;
+    private String url;
+    private String readme;
     private String version = DEFAULT_VERSION;
     private String featuresRepo = DEFAULT_FEATURES_REPO;
     private List<String> artifacts;
@@ -137,7 +154,6 @@
     @Component
     protected MavenProjectHelper projectHelper;
 
-
     private File m2Directory;
     protected File stageDirectory;
     protected String projectPath;
@@ -165,6 +181,16 @@
         requiredApps = (String) project.getProperties().get(ONOS_APP_REQUIRES);
         requiredApps = requiredApps == null ? "" : requiredApps.replaceAll("[\\s]", "");
 
+        category = (String) project.getProperties().get(ONOS_APP_CATEGORY);
+        category = category != null ? category : DEFAULT_CATEGORY;
+
+        url = (String) project.getProperties().get(ONOS_APP_URL);
+        url = url != null ? url : DEFAULT_URL;
+
+        // if readme does not exist, we simply fallback to use description
+        readme = (String) project.getProperties().get(ONOS_APP_README);
+        readme = readme != null ? readme : projectDescription;
+
         if (appFile.exists()) {
             loadAppFile(appFile);
         } else {
@@ -303,7 +329,7 @@
     // Generates the ONOS package ZIP file.
     private void generateAppPackage() throws MojoExecutionException {
         File appZip = new File(dstDirectory, artifactFile(projectArtifactId, projectVersion,
-                                                          APP_ZIP, null));
+                APP_ZIP, null));
         try (FileOutputStream fos = new FileOutputStream(appZip);
              ZipOutputStream zos = new ZipOutputStream(fos)) {
             zipDirectory("", stageDirectory, zos);
@@ -327,7 +353,7 @@
     private String artifactFile(String[] fields) {
         return fields.length < 5 ?
                 artifactFile(fields[1], fields[2],
-                             (fields.length < 4 ? JAR : fields[3]), null) :
+                        (fields.length < 4 ? JAR : fields[3]), null) :
                 artifactFile(fields[1], fields[2], fields[3], fields[4]);
     }
 
@@ -344,6 +370,9 @@
                 string.replaceAll("\\$\\{onos.app.name\\}", name)
                         .replaceAll("\\$\\{onos.app.origin\\}", origin)
                         .replaceAll("\\$\\{onos.app.requires\\}", requiredApps)
+                        .replaceAll("\\$\\{onos.app.category\\}", category)
+                        .replaceAll("\\$\\{onos.app.url\\}", url)
+                        .replaceAll("\\$\\{onos.app.readme\\}", readme)
                         .replaceAll("\\$\\{project.groupId\\}", projectGroupId)
                         .replaceAll("\\$\\{project.artifactId\\}", projectArtifactId)
                         .replaceAll("\\$\\{project.version\\}", projectVersion)
@@ -375,4 +404,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file