allow applications to be installed by URL from REST API

Change-Id: I6c28d91e1bbc6e77eefba00b8f106fe22edc475b
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/ApplicationsWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/ApplicationsWebResource.java
index 6ee5c83..f02947a 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/ApplicationsWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/ApplicationsWebResource.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.rest.resources;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.app.ApplicationAdminService;
 import org.onosproject.core.Application;
 import org.onosproject.core.ApplicationId;
@@ -32,7 +33,9 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.io.IOException;
 import java.io.InputStream;
+import java.net.URL;
 import java.util.Set;
 
 import static org.onlab.util.Tools.nullIsNotFound;
@@ -46,6 +49,9 @@
     private static final String APP_ID_NOT_FOUND = "Application ID is not found";
     private static final String APP_NOT_FOUND = "Application is not found";
 
+    private static final String URL = "url";
+    private static final String ACTIVATE = "activate";
+
     /**
      * Get all installed applications.
      * Returns array of all installed applications.
@@ -80,6 +86,38 @@
      * Install a new application.
      * Uploads application archive stream and optionally activates the
      * application.
+
+     * @param raw   json object containing location (url) of application oar
+     * @return 200 OK; 404; 401
+     */
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response installApp(InputStream raw) {
+        Application app;
+        try {
+            ObjectNode jsonTree = (ObjectNode) mapper().readTree(raw);
+            URL url = new URL(jsonTree.get(URL).asText());
+            boolean activate = false;
+            if (jsonTree.has(ACTIVATE)) {
+              activate = jsonTree.get(ACTIVATE).asBoolean();
+            }
+
+            ApplicationAdminService service = get(ApplicationAdminService.class);
+            app = service.install(url.openStream());
+            if (activate) {
+                service.activate(app.id());
+            }
+        } catch (IOException ex) {
+            throw new IllegalArgumentException(ex);
+        }
+        return ok(codec(Application.class).encode(app, this)).build();
+    }
+
+    /**
+     * Install a new application.
+     * Uploads application archive stream and optionally activates the
+     * application.
      *
      * @param activate true to activate app also
      * @param stream   application archive stream