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
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 }