ONOS-542 Added ability for app bundle to carry it's own artifacts, including feature repo. Fixed onos-package script. Added JSON output to CLI.

Change-Id: If4f2c774d3fc2d68c0a8e91b3084b99d7c75d927
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 ec7958d..64f04a6 100644
--- a/core/api/src/main/java/org/onosproject/app/ApplicationDescription.java
+++ b/core/api/src/main/java/org/onosproject/app/ApplicationDescription.java
@@ -19,6 +19,7 @@
 import org.onosproject.core.Version;
 
 import java.net.URI;
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
@@ -71,10 +72,10 @@
     Optional<URI> featuresRepo();
 
     /**
-     * Returns the set of features comprising the application. At least one
+     * Returns the list of features comprising the application. At least one
      * feature must be given.
      *
      * @return application features
      */
-    Set<String> features();
+    List<String> features();
 }
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 9c53542..78b902b 100644
--- a/core/api/src/main/java/org/onosproject/app/DefaultApplicationDescription.java
+++ b/core/api/src/main/java/org/onosproject/app/DefaultApplicationDescription.java
@@ -19,6 +19,7 @@
 import org.onosproject.core.Version;
 
 import java.net.URI;
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
@@ -37,7 +38,7 @@
     private final String origin;
     private final Set<Permission> permissions;
     private final Optional<URI> featuresRepo;
-    private final Set<String> features;
+    private final List<String> features;
 
     /**
      * Creates a new application descriptor using the supplied data.
@@ -53,7 +54,7 @@
     public DefaultApplicationDescription(String name, Version version,
                                          String description, String origin,
                                          Set<Permission> permissions,
-                                         URI featuresRepo, Set<String> features) {
+                                         URI featuresRepo, List<String> features) {
         this.name = checkNotNull(name, "Name cannot be null");
         this.version = checkNotNull(version, "Version cannot be null");
         this.description = checkNotNull(description, "Description cannot be null");
@@ -95,7 +96,7 @@
     }
 
     @Override
-    public Set<String> features() {
+    public List<String> features() {
         return features;
     }
 
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 d876a67..da2be13 100644
--- a/core/api/src/main/java/org/onosproject/core/Application.java
+++ b/core/api/src/main/java/org/onosproject/core/Application.java
@@ -16,6 +16,7 @@
 package org.onosproject.core;
 
 import java.net.URI;
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
@@ -68,10 +69,10 @@
     Optional<URI> featuresRepo();
 
     /**
-     * Returns the set of features comprising the application. At least one
+     * Returns the list of features comprising the application. At least one
      * feature must be given.
      *
      * @return application features
      */
-    Set<String> features();
+    List<String> features();
 }
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 4da85a5..b765e70 100644
--- a/core/api/src/main/java/org/onosproject/core/DefaultApplication.java
+++ b/core/api/src/main/java/org/onosproject/core/DefaultApplication.java
@@ -16,6 +16,7 @@
 package org.onosproject.core;
 
 import java.net.URI;
+import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
@@ -35,7 +36,7 @@
     private final String origin;
     private final Set<Permission> permissions;
     private final Optional<URI> featuresRepo;
-    private final Set<String> features;
+    private final List<String> features;
 
     /**
      * Creates a new application descriptor using the supplied data.
@@ -51,7 +52,7 @@
     public DefaultApplication(ApplicationId appId, Version version,
                               String description, String origin,
                               Set<Permission> permissions,
-                              Optional<URI> featuresRepo, Set<String> features) {
+                              Optional<URI> featuresRepo, List<String> features) {
         this.appId = checkNotNull(appId, "ID cannot be null");
         this.version = checkNotNull(version, "Version cannot be null");
         this.description = checkNotNull(description, "Description cannot be null");
@@ -93,7 +94,7 @@
     }
 
     @Override
-    public Set<String> features() {
+    public List<String> features() {
         return features;
     }
 
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 7079427..3c33a7f 100644
--- a/core/api/src/test/java/org/onosproject/app/DefaultApplicationDescriptionTest.java
+++ b/core/api/src/test/java/org/onosproject/app/DefaultApplicationDescriptionTest.java
@@ -15,12 +15,14 @@
  */
 package org.onosproject.app;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import org.junit.Test;
 import org.onosproject.core.Permission;
 import org.onosproject.core.Version;
 
 import java.net.URI;
+import java.util.List;
 import java.util.Set;
 
 import static org.junit.Assert.assertEquals;
@@ -37,7 +39,7 @@
     public static final String ORIGIN = "Circus";
     public static final Set<Permission> PERMS = ImmutableSet.of();
     public static final URI FURL = URI.create("mvn:org.foo-features/1.2a/xml/features");
-    public static final Set<String> FEATURES = ImmutableSet.of("foo");
+    public static final List<String> FEATURES = ImmutableList.of("foo", "bar");
 
     @Test
     public void basics() {