ONOS-1684 Added support for app dependencies.

Change-Id: Iae318c24c3c9bd43d84318c79ac420fc85d5d599
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 b2cab09..a09c0bd 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
@@ -32,18 +32,18 @@
     public ObjectNode encode(Application app, CodecContext context) {
         checkNotNull(app, "Application cannot be null");
         ApplicationService service = context.getService(ApplicationService.class);
-        ObjectNode result = context.mapper().createObjectNode()
+        return context.mapper().createObjectNode()
                 .put("name", app.id().name())
                 .put("id", app.id().id())
                 .put("version", app.version().toString())
                 .put("description", app.description())
                 .put("origin", app.origin())
-                .put("permissions", app.permissions().toString())
+                .put("permissions", app.permissions().toString()) // FIXME: change to an array
                 .put("featuresRepo", app.featuresRepo().isPresent() ?
                         app.featuresRepo().get().toString() : "")
-                .put("features", app.features().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());
-        return result;
     }
 
 }
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 54f0fb8..37cdbdf 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
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.Files;
 import org.apache.commons.configuration.ConfigurationException;
@@ -33,7 +34,6 @@
 import org.onosproject.security.AppPermission;
 import org.onosproject.security.Permission;
 import org.onosproject.store.AbstractStore;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,7 +46,6 @@
 import java.net.URI;
 import java.nio.charset.Charset;
 import java.nio.file.NoSuchFileException;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
@@ -79,6 +78,7 @@
     private static final String VERSION = "[@version]";
     private static final String FEATURES_REPO = "[@featuresRepo]";
     private static final String FEATURES = "[@features]";
+    private static final String APPS = "[@apps]";
     private static final String DESCRIPTION = "description";
 
     private static final String ROLE = "security.role";
@@ -291,8 +291,13 @@
         URI featuresRepo = featRepo != null ? URI.create(featRepo) : null;
         List<String> features = ImmutableList.copyOf(cfg.getString(FEATURES).split(","));
 
+        String apps = cfg.getString(APPS, "");
+        List<String> requiredApps = apps.isEmpty() ?
+                ImmutableList.of() : ImmutableList.copyOf(apps.split(","));
+
         return new DefaultApplicationDescription(name, version, desc, origin, role,
-                                                 perms, featuresRepo, features);
+                                                 perms, featuresRepo, features,
+                                                 requiredApps);
     }
 
     // Expands the specified ZIP stream into app-specific directory.
@@ -390,7 +395,7 @@
 
     // Returns the set of Permissions specified in the app.xml file
     private ImmutableSet<Permission> getPermissions(XMLConfiguration cfg) {
-        List<Permission> permissionList = new ArrayList();
+        List<Permission> permissionList = Lists.newArrayList();
 
         for (Object o : cfg.getList(APP_PERMISSIONS)) {
             String name = (String) o;