multi event support for a worklet in workflow app

Change-Id: I3178110da75b26f96f8889acc0dd2c715fc567ec
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ContextEventMapStore.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ContextEventMapStore.java
index 6d0f0fb..4b54cf3 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ContextEventMapStore.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ContextEventMapStore.java
@@ -21,6 +21,7 @@
 import org.onosproject.store.service.Versioned;
 
 import java.util.Map;
+import java.util.Set;
 
 /**
  *  WorkflowContext Event Map Store.
@@ -30,36 +31,43 @@
     /**
      * Registers workflow context event mapping.
      * @param eventType the class name of event
-     * @param eventHint event hint string value of the event
+     * @param eventHintSet Set of event hint string value of the event
      * @param contextName workflow context name
      * @param programCounterString the program counter of workflow
      * @throws WorkflowException workflow exception
      */
-    void registerEventMap(String eventType, String eventHint,
+    void registerEventMap(String eventType, Set<String> eventHintSet,
                           String contextName, String programCounterString) throws WorkflowException;
 
     /**
      * Unregisters workflow context event mapping.
      * @param eventType the class name of event
-     * @param eventHint event hint string value of the event
      * @param contextName workflow context name
      * @throws WorkflowException workflow exception
      */
-    void unregisterEventMap(String eventType, String eventHint,
+    void unregisterEventMap(String eventType,
                             String contextName) throws WorkflowException;
 
     /**
      * Returns workflow context event mapping.
      * @param eventType the class name of event
-     * @param eventHint event hint string value of the event
-     * @return workflow context event mapping
+     * @param eventHint vent hint string value of the event
+     * @return Map of workflow context and value (program counter)
      * @throws WorkflowException workflow exception
      */
-    Map<String, String> getEventMap(String eventType, String eventHint) throws WorkflowException;
+    Map<String, String> getEventMapByHint(String eventType,
+                                          String eventHint) throws WorkflowException;
+
+    /**
+     * Returns true or false depending on existence of eventMap of given context.
+     * @param contextName name of workflow context
+     * @return Boolean true or false depending on existence of eventMap of given context
+     */
+    boolean isEventMapPresent(String contextName);
 
     /**
      * Returns child nodes on document tree path.
-     * @param path document tree path
+     * @param path document tree path including eventType and Hint
      * @return children under document tree path
      * @throws WorkflowException workflow exception
      */
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/DefaultWorkflowContext.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/DefaultWorkflowContext.java
index 05c564a..8f5d3c7 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/DefaultWorkflowContext.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/DefaultWorkflowContext.java
@@ -21,6 +21,8 @@
 import org.onosproject.event.Event;
 
 import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
 
 import static org.onosproject.workflow.api.CheckCondition.check;
 
@@ -60,9 +62,9 @@
     private transient Class<? extends Event> completionEventType;
 
     /**
-     * Completion event hint.
+     * Completion event hint Set.
      */
-    private transient String completionEventHint;
+    private transient Set<String> completionEventHintSet;
 
     /**
      * Completion event generator method reference.
@@ -170,7 +172,18 @@
     public void waitCompletion(Class<? extends Event> eventType, String eventHint,
                                WorkExecutor eventGenerator, long timeoutMs) {
         this.completionEventType = eventType;
-        this.completionEventHint = eventHint;
+        this.completionEventHintSet = new HashSet<>();
+        this.completionEventHintSet.add(eventHint);
+        this.completionEventGenerator = eventGenerator;
+        this.completionEventTimeoutMs = timeoutMs;
+    }
+
+    @Override
+    public void waitAnyCompletion(Class<? extends Event> eventType, Set<String> eventHint,
+                               WorkExecutor eventGenerator, long timeoutMs) {
+        this.completionEventType = eventType;
+        this.completionEventHintSet = new HashSet<>();
+        this.completionEventHintSet.addAll(eventHint);
         this.completionEventGenerator = eventGenerator;
         this.completionEventTimeoutMs = timeoutMs;
     }
@@ -186,8 +199,8 @@
     }
 
     @Override
-    public String completionEventHint() {
-        return completionEventHint;
+    public Set<String> completionEventHints() {
+        return completionEventHintSet;
     }
 
     @Override
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/EventTimeoutTask.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/EventTimeoutTask.java
index 9aa870d..2ee2672 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/EventTimeoutTask.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/EventTimeoutTask.java
@@ -17,7 +17,9 @@
 
 import com.google.common.base.MoreObjects;
 
+import java.util.HashSet;
 import java.util.Objects;
+import java.util.Set;
 
 import static org.onosproject.workflow.api.CheckCondition.check;
 
@@ -32,9 +34,9 @@
     private final String eventType;
 
     /**
-     * Event hint value for finding target event.
+     * Set of Event hint value for finding target event.
      */
-    private final String eventHint;
+    private final Set<String> eventHintSet = new HashSet<>();
 
     /**
      * Constructor of EventTimeoutTask.
@@ -43,7 +45,7 @@
     private EventTimeoutTask(Builder builder) {
         super(builder);
         this.eventType = builder.eventType;
-        this.eventHint = builder.eventHint;
+        this.eventHintSet.addAll(builder.eventHintSet);
     }
 
     /**
@@ -55,11 +57,11 @@
     }
 
     /**
-     * Gets event hint value for finding target event.
-     * @return event hint string
+     * Gets set of event hint value for finding target event.
+     * @return event hint set
      */
-    public String eventHint() {
-        return eventHint;
+    public Set<String> eventHintSet() {
+        return eventHintSet;
     }
 
     @Override
@@ -76,7 +78,7 @@
             return false;
         }
         return Objects.equals(this.eventType(), ((EventTask) obj).eventType())
-                && Objects.equals(this.eventHint(), ((EventTask) obj).eventHint());
+                && Objects.equals(this.eventHintSet(), ((EventTask) obj).eventHint());
     }
 
     @Override
@@ -85,7 +87,7 @@
                 .add("context", context())
                 .add("programCounter", programCounter())
                 .add("eventType", eventType())
-                .add("eventHint", eventHint())
+                .add("eventHint", eventHintSet())
                 .toString();
     }
 
@@ -107,9 +109,9 @@
         private String eventType;
 
         /**
-         * Event hint value for finding target event.
+         * Set of Event hint value for finding target event.
          */
-        private String eventHint;
+        private Set<String> eventHintSet;
 
         /**
          * Sets Event type (Class name of event).
@@ -123,11 +125,11 @@
 
         /**
          * Sets event hint string for finding target event.
-         * @param eventHint event hint string
+         * @param eventHintSet Set of event hint string
          * @return builder of EventTimeoutTask
          */
-        public Builder eventHint(String eventHint) {
-            this.eventHint = eventHint;
+        public Builder eventHintSet(Set<String> eventHintSet) {
+            this.eventHintSet = eventHintSet;
             return this;
         }
 
@@ -150,7 +152,7 @@
          */
         public EventTimeoutTask build() throws WorkflowException {
             check(eventType != null, "eventType is invalid");
-            check(eventHint != null, "eventType is invalid");
+            check(eventHintSet != null, "eventHintSet is invalid");
             return new EventTimeoutTask(this);
         }
     }
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowContext.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowContext.java
index 9f0b4fe..836524d 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowContext.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowContext.java
@@ -18,6 +18,7 @@
 import org.onosproject.event.Event;
 
 import java.net.URI;
+import java.util.Set;
 
 /**
  * An abstract class representing WorkflowContext.
@@ -98,6 +99,20 @@
     public abstract void waitCompletion(Class<? extends Event> eventType, String eventHint,
                                         WorkExecutor eventGenerator, long timeoutMs);
 
+
+    /**
+     * Waits an event which has any one of eventHint from Set 'eventHintSet' after executing executor.
+     * If the event happens, Worklet.isCompleted will be called.
+     * If the event does not happen for timeoutMs, Worklet.timeout will be called.
+     * @param eventType the class of event to wait
+     * @param eventHintSet the Set of eventHints of the event to wait
+     * @param eventGenerator a method reference to be executed after executing executor
+     * @param timeoutMs timeout millisecond
+     */
+    public abstract void waitAnyCompletion(Class<? extends Event> eventType, Set<String> eventHintSet,
+                                           WorkExecutor eventGenerator, long timeoutMs);
+
+
     /**
      * Waits timeout milliseconds. After timeoutMs Worklet.timeout will be called.
      * @param timeoutMs timeout millisecond
@@ -111,10 +126,10 @@
     public abstract Class<? extends Event> completionEventType();
 
     /**
-     * Returns the event hint string to wait.
-     * @return the event hint string
+     * Returns the set of event hint string to wait.
+     * @return the event hint string set
      */
-    public abstract String completionEventHint();
+    public abstract Set<String> completionEventHints();
 
     /**
      * Returns method reference for generating completion event.
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowExecutionService.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowExecutionService.java
index 9f609b3..c5e00a7 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowExecutionService.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowExecutionService.java
@@ -18,6 +18,8 @@
 import org.onosproject.event.Event;
 import org.onosproject.event.ListenerService;
 
+import java.util.Set;
+
 /**
  * Interface for workflow execution service.
  */
@@ -45,11 +47,11 @@
     /**
      * Registers workflow event map.
      * @param eventType event type (class name of event)
-     * @param eventHint event hint value
+     * @param eventHintSet Set of event hint value
      * @param contextName workflow context name to be called by this event map
      * @param programCounterString worklet type to be called by this event map
      * @throws WorkflowException workflow exception
      */
-    void registerEventMap(Class<? extends Event> eventType, String eventHint,
+    void registerEventMap(Class<? extends Event> eventType, Set<String> eventHintSet,
                           String contextName, String programCounterString) throws WorkflowException;
 }