Additional Implementation of installApp to CLI interface

Change-Id: Iea7ed2f4be5ffd9acc7e682d6f1625a9af53f902
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java
index ff0cbf8..9b5e91f 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java
@@ -21,13 +21,19 @@
 import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.app.ApplicationAdminService;
+import org.onosproject.app.ApplicationService;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.Application;
 import org.onosproject.core.ApplicationId;
+import org.onosproject.core.VersionService;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 
 import java.io.IOException;
 import java.net.URL;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -44,6 +50,9 @@
     static final String DEACTIVATE = "deactivate";
     static final String DOWNLOAD = "download";
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected VersionService versionService;
+
     @Argument(index = 0, name = "command",
             description = "Command name (install|activate|deactivate|uninstall|download)",
             required = true)
@@ -64,7 +73,6 @@
                     return;
                 }
             }
-
         } else if (command.equals(DOWNLOAD)) {
             for (String name : names) {
                 if (!downloadApp(service, name)) {
@@ -86,7 +94,20 @@
             if ("-".equals(url)) {
                 service.install(System.in);
             } else {
-                service.install(new URL(url).openStream());
+                Set<Application> app = get(ApplicationService.class)
+                        .getRegisteredApplications().stream()
+                        .filter(ra -> ra.id().toString().equals(url))
+                        .collect(Collectors.toSet());
+                if (app.isEmpty()) {
+                    service.install(new URL(url).openStream());
+                }
+                Iterator<Application> iterator = app.iterator();
+                while (iterator.hasNext()) {
+                    Application application = iterator.next();
+                    if (application.version().toString().equals(versionService.version().toString())) {
+                        service.install(application.imageUrl().openStream());
+                    }
+                }
             }
         } catch (IOException e) {
             error("Unable to get URL: %s", url);
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
index 2d0a6f7..03409d0 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
@@ -54,30 +54,24 @@
         // Command name is the second argument.
         String cmd = commandLine.getArguments()[1];
 
-        // Grab apps already on the command (to prevent tab-completed duplicates)
-        // FIXME: This does not work.
-//        final Set previousApps;
-//        if (list.getArguments().length > 2) {
-//            previousApps = Sets.newHashSet(
-//                    Arrays.copyOfRange(list.getArguments(), 2, list.getArguments().length));
-//        } else {
-//            previousApps = Collections.emptySet();
-//        }
-
         // Fetch our service and feed it's offerings to the string completer
         ApplicationService service = get(ApplicationService.class);
         Iterator<Application> it = service.getApplications().iterator();
         SortedSet<String> strings = delegate.getStrings();
-        while (it.hasNext()) {
-            Application app = it.next();
-            ApplicationState state = service.getState(app.id());
-//            if (previousApps.contains(app.id().name())) {
-//                continue;
-//            }
-            if ("uninstall".equals(cmd) || "download".equals(cmd) ||
-                    ("activate".equals(cmd) && state == INSTALLED) ||
-                    ("deactivate".equals(cmd) && state == ACTIVE)) {
-                strings.add(app.id().name());
+        if ("install".equals(cmd)) {
+            it = service.getRegisteredApplications().iterator();
+            while (it.hasNext()) {
+                strings.add(it.next().id().name());
+            }
+        } else {
+            while (it.hasNext()) {
+                Application app = it.next();
+                ApplicationState state = service.getState(app.id());
+                if ("uninstall".equals(cmd) || "download".equals(cmd) ||
+                        ("activate".equals(cmd) && state == INSTALLED) ||
+                        ("deactivate".equals(cmd) && state == ACTIVE)) {
+                    strings.add(app.id().name());
+                }
             }
         }