Adding ability to drop OAR files to install apps.

Change-Id: I989a92db4c94ef86d029d6b36f769f28e4fee52d
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationResource.java b/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationResource.java
index 7601478..93d9146 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationResource.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationResource.java
@@ -22,15 +22,18 @@
 import org.onosproject.core.ApplicationId;
 
 import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+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.util.Objects;
 
 /**
  * Application upload resource.
@@ -38,11 +41,20 @@
 @Path("applications")
 public class ApplicationResource extends BaseResource {
 
+    static String lastInstalledAppName = null;
+
+
     @Path("upload")
     @POST
     @Consumes(MediaType.MULTIPART_FORM_DATA)
-    public Response upload(@FormDataParam("file") InputStream stream) throws IOException {
-        get(ApplicationAdminService.class).install(stream);
+    public Response upload(@QueryParam("activate") @DefaultValue("false") String activate,
+                           @FormDataParam("file") InputStream stream) throws IOException {
+        ApplicationAdminService service = get(ApplicationAdminService.class);
+        Application app = service.install(stream);
+        lastInstalledAppName = app.id().name();
+        if (Objects.equals(activate, "true")) {
+            service.activate(app.id());
+        }
         return Response.ok().build();
     }
 
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java
index 51e538b..e6a5d00 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java
@@ -30,6 +30,7 @@
 
 import java.util.Collection;
 
+import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onosproject.app.ApplicationState.ACTIVE;
 
 /**
@@ -113,15 +114,15 @@
             String iconId = state == ACTIVE ? ICON_ID_ACTIVE : ICON_ID_INACTIVE;
 
             row.cell(STATE, state)
-                .cell(STATE_IID, iconId)
-                .cell(ID, id.name())
-                .cell(ICON, id.name())
-                .cell(VERSION, app.version())
-                .cell(CATEGORY, app.category())
-                .cell(ORIGIN, app.origin())
-                .cell(TITLE, app.title())
-                .cell(DESC, app.description())
-                .cell(URL, app.url());
+                    .cell(STATE_IID, iconId)
+                    .cell(ID, id.name())
+                    .cell(ICON, id.name())
+                    .cell(VERSION, app.version())
+                    .cell(CATEGORY, app.category())
+                    .cell(ORIGIN, app.origin())
+                    .cell(TITLE, app.title())
+                    .cell(DESC, app.description())
+                    .cell(URL, app.url());
         }
     }
 
@@ -160,6 +161,13 @@
         public void process(long sid, ObjectNode payload) {
             String id = string(payload, ID);
             ApplicationService as = get(ApplicationService.class);
+
+            // If the ID was not specified in the payload, use the name of the
+            // most recently uploaded app.
+            if (isNullOrEmpty(id)) {
+                id = ApplicationResource.lastInstalledAppName;
+            }
+
             ApplicationId appId = as.getId(id);
             ApplicationState state = as.getState(appId);
             Application app = as.getApplication(appId);
@@ -198,5 +206,6 @@
             rootNode.set(DETAILS, data);
             sendMessage(APP_DETAILS_RESP, 0, rootNode);
         }
+
     }
 }