Enhanced application name completer to consider the command context.

Change-Id: Ib77a53830d4b6d14ef99115309ea25707a8281b4
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 daabdb0..e975be0 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
@@ -15,31 +15,46 @@
  */
 package org.onosproject.cli.app;
 
-import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.ArgumentCompleter;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
 import org.onosproject.app.ApplicationService;
-import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.app.ApplicationState;
+import org.onosproject.cli.net.AbstractCompleter;
 import org.onosproject.core.Application;
 
 import java.util.Iterator;
 import java.util.List;
 import java.util.SortedSet;
 
+import static org.onosproject.app.ApplicationState.ACTIVE;
+import static org.onosproject.app.ApplicationState.INSTALLED;
+import static org.onosproject.cli.AbstractShellCommand.get;
+
 /**
  * Application name completer.
  */
-public class ApplicationNameCompleter implements Completer {
+public class ApplicationNameCompleter extends AbstractCompleter {
     @Override
     public int complete(String buffer, int cursor, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
+        // Command name is the second argument.
+        ArgumentCompleter.ArgumentList list = getArgumentList();
+        String cmd = list.getArguments()[1];
+
         // Fetch our service and feed it's offerings to the string completer
-        ApplicationService service = AbstractShellCommand.get(ApplicationService.class);
+        ApplicationService service = get(ApplicationService.class);
         Iterator<Application> it = service.getApplications().iterator();
         SortedSet<String> strings = delegate.getStrings();
         while (it.hasNext()) {
-            strings.add(it.next().id().name());
+            Application app = it.next();
+            ApplicationState state = service.getState(app.id());
+            if (cmd.equals("uninstall") ||
+                    (cmd.equals("activate") && state == INSTALLED) ||
+                    (cmd.equals("deactivate") && state == ACTIVE)) {
+                strings.add(app.id().name());
+            }
         }
 
         // Now let the completer do the work for figuring out what to offer.