View Javadoc

1   package cz.cuni.amis.pogamut.sposh.engine;
2   
3   import cz.cuni.amis.pogamut.sposh.elements.Adopt;
4   import cz.cuni.amis.pogamut.sposh.elements.LapPath;
5   import cz.cuni.amis.pogamut.sposh.elements.LapType;
6   import cz.cuni.amis.pogamut.sposh.elements.PoshPlan;
7   import cz.cuni.amis.pogamut.sposh.elements.PrimitiveCall;
8   import cz.cuni.amis.pogamut.sposh.elements.Trigger;
9   import cz.cuni.amis.pogamut.sposh.elements.TriggeredAction;
10  import cz.cuni.amis.pogamut.sposh.engine.FireResult.Type;
11  import cz.cuni.amis.pogamut.sposh.executor.IWorkExecutor;
12  
13  class ADExecutor extends AbstractExecutor implements ElementExecutor {
14  
15      private Adopt adopt;
16      private PoshPlan plan;
17      private SenseListExecutor<Adopt> exitConditionExecutor;
18  
19      protected ADExecutor(PoshPlan plan, Adopt ad, LapPath adoptPath, VariableContext ctx, EngineLog engineLog) {
20          super(adoptPath, ctx, engineLog);
21          
22          assert adoptPath.traversePath(plan) == ad;
23          
24          this.plan = plan;
25          this.adopt = ad;
26          this.exitConditionExecutor = new SenseListExecutor<Adopt>(ad.getExitCondition(), adoptPath, ctx, engineLog);
27      }
28  
29      public boolean isExit(IWorkExecutor workExecutor) {
30          return exitConditionExecutor.fire(workExecutor, true).wasSuccess();
31      }
32  
33      public Trigger<Adopt> getExitCondition() {
34          return adopt.getExitCondition();
35      }
36  
37      public TriggeredAction getAdoptedElement() {
38          return adopt.getAdoptedElement();
39      }
40  
41      @Override
42      public FireResult fire(IWorkExecutor workExecuter) {
43          engineLog.pathReached(path);
44          if (isExit(workExecuter)) {
45              // we've met exit-condition
46              return new FireResult(Type.SURFACE);
47          }
48          return new FireResult(Type.FOLLOW, createActionExecutor());
49      }
50  
51      private LapPath createAdoptActionPath() {
52          return path.concat(LapType.ACTION, 0);
53      }
54      
55      private StackElement createActionExecutor() {
56          PrimitiveCall actionCall = getAdoptedElement().getActionCall();
57          LapPath adoptActionPath = createAdoptActionPath();
58          return getElement(plan, actionCall, adoptActionPath);
59      }
60  }