View Javadoc

1   package cz.cuni.amis.pogamut.sposh.engine;
2   
3   import cz.cuni.amis.pogamut.sposh.elements.LapPath;
4   import cz.cuni.amis.pogamut.sposh.elements.PrimitiveCall;
5   import cz.cuni.amis.pogamut.sposh.exceptions.FubarException;
6   import cz.cuni.amis.pogamut.sposh.executor.ActionResult;
7   import cz.cuni.amis.pogamut.sposh.executor.IWorkExecutor;
8   
9   /**
10   * This is used to execute single primitive, like in DE or C.
11   * @author Honza
12   */
13  class ActionExecutor extends AbstractExecutor implements ElementExecutor {
14      final private PrimitiveCall actionCall;
15      
16      final private FireResult.Type finishedResult = FireResult.Type.SURFACE_CONTINUE;
17      final private FireResult.Type runningResult = FireResult.Type.SURFACE;
18      final private FireResult.Type runningOnceResult = FireResult.Type.SURFACE;
19      final private FireResult.Type failedResult = FireResult.Type.FAILED;
20      
21      final private Runnable finishedResultCallback;
22      final private Runnable runningResultCallback;
23      final private Runnable runningOnceResultCallback;
24      final private Runnable failedResultCallback;
25  
26      /**
27       * Create a primitive executor that will call a specified action
28       * within context of parameters
29       * 
30       * @param actionCall actionCall to primitive
31       * @param finishedResultCallback called in case of {@link ActionResult#FINISHED}, may be null
32       * @param runningResultCallback called in case of {@link ActionResult#RUNNING}, may be null
33       * @param failedResultCallback called in case of {@link ActionResult#FAILED}, may be null
34       * @param actionPath Path in the plan to the action this executor is executing.
35       * @param ctx Context of this primitive. Shoudl differ from parent, but isn't necessary
36       * @param log logger to record actions of this executor
37       */
38      ActionExecutor(
39              PrimitiveCall actionCall,
40              Runnable finishedResultCallback,
41              Runnable runningResultCallback,
42              Runnable runningOnceResultCallback,
43              Runnable failedResultCallback,
44              LapPath actionPath,
45              VariableContext ctx,
46              EngineLog log) {
47          super(actionPath, ctx, log);
48          
49          this.actionCall = actionCall;
50          
51          this.finishedResultCallback = finishedResultCallback;
52          this.runningResultCallback = runningResultCallback;
53          this.runningOnceResultCallback = runningOnceResultCallback;
54          this.failedResultCallback = failedResultCallback;
55      }
56  
57  
58      /**
59       * Fire the action and return FireResult(false), so don't continue
60       * the execution.
61       * @param workExecuter
62       * @return failResult if result of primitive is empty or false, true otherwise
63       */
64      @Override
65      public FireResult fire(IWorkExecutor workExecuter) {
66          engineLog.pathReached(path);
67          
68          ActionResult result = workExecuter.executeAction(actionCall.getName(), ctx);
69          switch(result) {
70          case FAILED:
71          	if (failedResultCallback != null) failedResultCallback.run();
72          	return new FireResult(failedResult);
73          	
74          case FINISHED:
75          	if (finishedResultCallback != null) finishedResultCallback.run();
76          	return new FireResult(finishedResult);
77          	
78          case RUNNING:
79          	if (runningResultCallback != null) runningResultCallback.run();
80          	return new FireResult(runningResult);
81          	
82          case RUNNING_ONCE:
83          	if (runningOnceResultCallback != null) runningOnceResultCallback.run();
84          	return new FireResult(runningOnceResult);
85          	
86          default:
87          	throw new IllegalStateException("Unexpected ActionResult: " + result);
88          }        
89      }
90  
91      @Override
92      public String toString() {
93          return this.getClass().getSimpleName() + "[" + actionCall.getName() + "]";
94      }
95  }