diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java index ec2be65635..3e54c94ae2 100644 --- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java +++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java @@ -74,32 +74,31 @@ public final class ImmutableListWorkflow extends AbstractWorkflow { return getWorkletInstance(initWorkletType); } - @Override public ProgramCounter next(WorkflowContext context) throws WorkflowException { int cnt = 0; - ProgramCounter pc = context.current(); - check(pc != null, "Invalid program counter"); + ProgramCounter current = context.current(); + check(current != null, "Invalid program counter"); - for (int i = pc.workletIndex(); i < workletTypeList.size(); i++) { + ProgramCounter pc = current.clone(); + + for (int i = current.workletIndex(); i < workletTypeList.size(); pc = increased(pc), i++) { if (cnt++ > Worklet.MAX_WORKS) { throw new WorkflowException("Maximum worklet execution exceeded"); } - String workletType = workletTypeList.get(i); - - if (Worklet.Common.COMPLETED.tag().equals(workletType)) { - return ProgramCounter.valueOf(workletType, i); + if (pc.isCompleted()) { + return pc; } - if (Worklet.Common.INIT.tag().equals(workletType)) { + if (pc.isInit()) { continue; } - Worklet worklet = getWorkletInstance(workletType); + Worklet worklet = getWorkletInstance(pc); Class workClass = worklet.getClass(); if (BranchWorklet.class.isAssignableFrom(workClass)) { @@ -121,11 +120,12 @@ public final class ImmutableListWorkflow extends AbstractWorkflow { // isNext is read only. It does not perform 'inhale'. dataModelInjector.inject(worklet, context); if (worklet.isNext(context)) { - return ProgramCounter.valueOf(workletType, i); + return pc; } } } - throw new WorkflowException("workflow reached to end but not COMPLETED"); + throw new WorkflowException("workflow reached to end but not COMPLETED (pc:" + + current + ", workflow:" + this.toString()); } @Override @@ -140,6 +140,12 @@ public final class ImmutableListWorkflow extends AbstractWorkflow { return ProgramCounter.valueOf(workletType, increaedIndex); } + @Override + public Worklet getWorkletInstance(ProgramCounter pc) throws WorkflowException { + + return getWorkletInstance(workletTypeList.get(pc.workletIndex())); + } + @Override public Worklet getWorkletInstance(String workletType) throws WorkflowException { diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ProgramCounter.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ProgramCounter.java index 6af50e0762..b6db8e751f 100644 --- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ProgramCounter.java +++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ProgramCounter.java @@ -62,6 +62,30 @@ public final class ProgramCounter { this.workletIndex = workletIndex; } + /** + * Clones this workflow Program Counter. + * @return clone of this workflow Program Counter + */ + public ProgramCounter clone() { + return ProgramCounter.valueOf(this.workletType(), this.workletIndex()); + } + + /** + * Returns whether this program counter is INIT worklet program counter. + * @return whether this program counter is INIT worklet program counter + */ + public boolean isInit() { + return Worklet.Common.INIT.tag().equals(this.workletType); + } + + /** + * Returns whether this program counter is COMPLETED worklet program counter. + * @return whether this program counter is COMPLETED worklet program counter + */ + public boolean isCompleted() { + return Worklet.Common.COMPLETED.tag().equals(this.workletType); + } + @Override public int hashCode() { return Objects.hash(this.toString()); diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java index 848a70626a..1404f9b662 100644 --- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java +++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java @@ -54,6 +54,14 @@ public interface Workflow { */ ProgramCounter increased(ProgramCounter pc) throws WorkflowException; + /** + * Returns instance of worklet. + * @param pc program counter + * @return instance of worklet + * @throws WorkflowException workflow exception + */ + Worklet getWorkletInstance(ProgramCounter pc) throws WorkflowException; + /** * Returns instance of worklet. * @param workletType class name of worklet diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkFlowEngine.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkFlowEngine.java index b472c5f74b..5337c59850 100644 --- a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkFlowEngine.java +++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkFlowEngine.java @@ -472,7 +472,7 @@ public class WorkFlowEngine extends AbstractListenerManager