[ONOS-7732] Automating switch workflow: annotation based data model injection, applying programming counter, and small fixes

Change-Id: I4092d9c2695bcc8c4e8e01d54c442d3fac284eb6
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowCommand.java
index 3f96ba9..5c0f5de 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowCommand.java
@@ -21,23 +21,22 @@
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.workflow.api.DefaultWorkflowDescription;
+import org.onosproject.workflow.api.WorkflowContext;
+import org.onosproject.workflow.api.WorkflowExecutionService;
 import org.onosproject.workflow.api.WorkflowService;
 import org.onosproject.workflow.api.WorkflowException;
+import org.onosproject.workflow.api.WorkplaceStore;
 
-import java.util.Arrays;
 import java.util.Objects;
 
 @Service
 @Command(scope = "onos", name = "workflow", description = "workflow cli")
 public class WorkFlowCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "cmd", description = "command(invoke)", required = true)
+    @Argument(index = 0, name = "cmd", description = "command(invoke|eval)", required = true)
     private String cmd = null;
 
-    @Argument (index = 1, name = "id", description = "workflow id(URI)", required = true)
-    private String id = null;
-
-    @Argument (index = 2, name = "name", description = "workplace name", required = true)
+    @Argument(index = 1, name = "name", description = "workflow context name(workflow@workplace)", required = true)
     private String name = null;
 
     @Override
@@ -47,19 +46,26 @@
             return;
         }
 
+        if (Objects.isNull(name)) {
+            error("invalid workflow context name");
+            return;
+        }
+
+        String[] tokens = name.split("@");
+        if (tokens != null && tokens.length != 2) {
+            error("invalid workflow context name(workflow@workplace)");
+            return;
+        }
+
+        String workflowId = tokens[0];
+        String workplace = tokens[1];
+
         switch (cmd) {
             case "invoke":
-                if (Objects.isNull(id)) {
-                    error("invalid workflow id parameter");
-                    return;
-                }
-
-                if (Objects.isNull(name)) {
-                    error("invalid workplace name parameter");
-                    return;
-                }
-
-                invoke(id, name);
+                invoke(workflowId, workplace);
+                break;
+            case "eval":
+                eval(name);
                 break;
             default:
                 print("Unsupported cmd: " + cmd);
@@ -74,15 +80,33 @@
     private void invoke(String workflowId, String workplaceName) {
 
         WorkflowService service = get(WorkflowService.class);
-        DefaultWorkflowDescription wfDesc = DefaultWorkflowDescription.builder()
-                .workplaceName(workplaceName)
-                .id(workflowId)
-                .data(JsonNodeFactory.instance.objectNode())
-                .build();
         try {
+            DefaultWorkflowDescription wfDesc = DefaultWorkflowDescription.builder()
+                    .workplaceName(workplaceName)
+                    .id(workflowId)
+                    .data(JsonNodeFactory.instance.objectNode())
+                    .build();
+
             service.invokeWorkflow(wfDesc);
         } catch (WorkflowException e) {
-            error(e.getMessage() + ", trace: " + Arrays.asList(e.getStackTrace()));
+            error("Exception: ", e);
         }
     }
+
+    /**
+     * Evaluates workflow context.
+     * @param workflowContextName workflow context name
+     */
+    private void eval(String workflowContextName) {
+        WorkplaceStore storService = get(WorkplaceStore.class);
+        WorkflowExecutionService execService = get(WorkflowExecutionService.class);
+
+        WorkflowContext context = storService.getContext(workflowContextName);
+        if (context == null) {
+            error("failed to find workflow context {}", workflowContextName);
+            return;
+        }
+        execService.eval(workflowContextName);
+    }
+
 }
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowEventMapCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowEventMapCommand.java
index e23e97d..5240252 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowEventMapCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowEventMapCommand.java
@@ -51,7 +51,7 @@
                     try {
                         print(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(tree));
                     } catch (JsonProcessingException e) {
-                        error(e.getMessage() + ", trace: " + Arrays.asList(e.getStackTrace()));
+                        error("Exception: " + e.getMessage() + ", trace: " + Arrays.asList(e.getStackTrace()));
                     }
                     break;
 
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowStoreCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowStoreCommand.java
index f5e795a..d1e37c8 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowStoreCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowStoreCommand.java
@@ -32,7 +32,7 @@
     @Argument(index = 0, name = "cmd", description = "command(rm)", required = false)
     private String cmd = null;
 
-    @Argument (index = 1, name = "id", description = "workflow id(URI)", required = false)
+    @Argument(index = 1, name = "id", description = "workflow id(URI)", required = false)
     private String id = null;
 
     @Override
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowTestCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowTestCommand.java
index b3c34ec..8d13508 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowTestCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowTestCommand.java
@@ -16,6 +16,7 @@
 package org.onosproject.workflow.cli;
 
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
@@ -34,7 +35,7 @@
     @Argument(index = 0, name = "cmd", description = "command(invoke)", required = true)
     private String cmd = null;
 
-    @Argument (index = 1, name = "number", description = "number of test", required = true)
+    @Argument(index = 1, name = "number", description = "number of test", required = true)
     private String number = null;
 
     @Override
@@ -74,12 +75,16 @@
     private void invoke(String workflowId, String workplaceName) {
 
         WorkflowService service = get(WorkflowService.class);
-        DefaultWorkflowDescription wfDesc = DefaultWorkflowDescription.builder()
-                .workplaceName(workplaceName)
-                .id(workflowId)
-                .data(JsonNodeFactory.instance.objectNode())
-                .build();
+
+        ObjectNode dataModel = JsonNodeFactory.instance.objectNode();
+        dataModel.put("count", 0);
+
         try {
+            DefaultWorkflowDescription wfDesc = DefaultWorkflowDescription.builder()
+                    .workplaceName(workplaceName)
+                    .id(workflowId)
+                    .data(dataModel)
+                    .build();
             service.invokeWorkflow(wfDesc);
         } catch (WorkflowException e) {
             error(e.getMessage() + "trace: " + Arrays.asList(e.getStackTrace()));
@@ -94,6 +99,8 @@
         for (int i = 0; i <= num; i++) {
             String wpName = "test-" + i;
             invoke("sample.workflow-0", wpName);
+            invoke("sample.workflow-1", wpName);
+            invoke("sample.workflow-2", wpName);
         }
     }
 }
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkplaceStoreCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkplaceStoreCommand.java
index db1a736..1b4ba8a 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkplaceStoreCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkplaceStoreCommand.java
@@ -38,7 +38,7 @@
     @Argument(index = 0, name = "cmd", description = "command(add/rm/clear/print)", required = false)
     private String cmd = null;
 
-    @Argument (index = 1, name = "name", description = "workspace name", required = false)
+    @Argument(index = 1, name = "name", description = "workspace name", required = false)
     private String name = null;
 
     @Option(name = "-f", aliases = "--filter", description = "including filter",
@@ -97,10 +97,10 @@
      */
     private void addEmptyWorkplace(String name) {
         WorkflowService service = get(WorkflowService.class);
-        DefaultWorkplaceDescription wpDesc = DefaultWorkplaceDescription.builder()
-                .name(name)
-                .build();
         try {
+            DefaultWorkplaceDescription wpDesc = DefaultWorkplaceDescription.builder()
+                    .name(name)
+                    .build();
             service.createWorkplace(wpDesc);
         } catch (WorkflowException e) {
             error(e.getMessage() + ", trace: " + Arrays.asList(e.getStackTrace()));
@@ -125,10 +125,10 @@
      */
     private void rmWorkplace(String name) {
         WorkflowService service = get(WorkflowService.class);
-        DefaultWorkplaceDescription wpDesc = DefaultWorkplaceDescription.builder()
-                .name(name)
-                .build();
         try {
+            DefaultWorkplaceDescription wpDesc = DefaultWorkplaceDescription.builder()
+                    .name(name)
+                    .build();
             service.removeWorkplace(wpDesc);
         } catch (WorkflowException e) {
             error(e.getMessage() + ", trace: " + Arrays.asList(e.getStackTrace()));