Adding JSON output for intent list command.
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/IntentsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/IntentsListCommand.java
index 7cfe2c6..ab9fb83 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/IntentsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/IntentsListCommand.java
@@ -19,6 +19,7 @@
 import org.onlab.onos.net.intent.PointToPointIntent;
 import org.onlab.onos.net.intent.SinglePointToMultiPointIntent;
 
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -39,19 +40,23 @@
                 print("id=%s, state=%s, type=%s, appId=%s",
                       intent.id(), state, intent.getClass().getSimpleName(),
                       intent.appId().name());
-                printDetails(intent);
+                printDetails(service, intent);
             }
         }
     }
 
-    private void printDetails(Intent intent) {
+    private void printDetails(IntentService service, Intent intent) {
         if (intent.resources() != null && !intent.resources().isEmpty()) {
             print("    resources=%s", intent.resources());
         }
         if (intent instanceof ConnectivityIntent) {
             ConnectivityIntent ci = (ConnectivityIntent) intent;
-            print("    selector=%s", ci.selector().criteria());
-            print("    treatment=%s", ci.treatment().instructions());
+            if (!ci.selector().criteria().isEmpty()) {
+                print("    selector=%s", ci.selector().criteria());
+            }
+            if (!ci.treatment().instructions().isEmpty()) {
+                print("    treatment=%s", ci.treatment().instructions());
+            }
         }
 
         if (intent instanceof PointToPointIntent) {
@@ -71,6 +76,11 @@
             print("    links=%s", li.links());
             print("    egress=%s", li.egressPoint());
         }
+
+        List<Intent> installable = service.getInstallableIntents(intent.id());
+        if (installable != null && !installable.isEmpty()) {
+            print("    installable=%s", installable);
+        }
     }
 
     // Produces JSON array of the specified intents.
@@ -86,10 +96,14 @@
     private JsonNode json(IntentService service, ObjectMapper mapper, Intent intent) {
         ObjectNode result = mapper.createObjectNode()
                 .put("id", intent.id().toString())
-                .put("state", service.getIntentState(intent.id()).toString())
                 .put("type", intent.getClass().getSimpleName())
                 .put("appId", intent.appId().name());
 
+        IntentState state = service.getIntentState(intent.id());
+        if (state != null) {
+            result.put("state", state.toString());
+        }
+
         if (intent.resources() != null && !intent.resources().isEmpty()) {
             ArrayNode rnode = mapper.createArrayNode();
             for (NetworkResource resource : intent.resources()) {
@@ -136,6 +150,10 @@
             result.set("links", LinksListCommand.json(li.links()));
         }
 
+        List<Intent> installable = service.getInstallableIntents(intent.id());
+        if (installable != null && !installable.isEmpty()) {
+            result.set("installable", json(service, installable));
+        }
         return result;
     }