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.LapType;
5 import cz.cuni.amis.pogamut.sposh.elements.PoshElement;
6 import cz.cuni.amis.pogamut.sposh.elements.Sense;
7 import cz.cuni.amis.pogamut.sposh.elements.Trigger;
8 import cz.cuni.amis.pogamut.sposh.executor.IWorkExecutor;
9 import java.util.ArrayList;
10 import java.util.Collections;
11 import java.util.Iterator;
12 import java.util.LinkedList;
13 import java.util.List;
14 import java.util.logging.Logger;
15
16
17
18
19
20 class TriggerResult implements Iterable<SenseResult> {
21
22 private final List<SenseResult> senses;
23 private final boolean success;
24
25
26
27
28
29
30
31 public TriggerResult(List<SenseResult> senses, boolean success) {
32 this.success = success;
33 this.senses = Collections.unmodifiableList(new ArrayList<SenseResult>(senses));
34 }
35
36
37
38
39
40
41 public TriggerResult(boolean success) {
42 this(Collections.<SenseResult>emptyList(), success);
43 }
44
45 public boolean wasSuccess() {
46 return success;
47 }
48
49
50
51
52
53
54 @Override
55 public Iterator<SenseResult> iterator() {
56 return senses.iterator();
57 }
58 }
59
60
61
62
63
64
65
66 final class SenseListExecutor<T extends PoshElement> extends AbstractExecutor {
67
68 private List<SenseExecutor> sensesExecutors = new ArrayList<SenseExecutor>();
69
70
71
72
73
74
75
76
77
78
79
80 SenseListExecutor(Trigger<T> trigger, LapPath senseListPath, VariableContext ctx, EngineLog engineLog) {
81 super(senseListPath, ctx, engineLog);
82
83 int triggerSenseId = 0;
84 for (Sense sense : trigger) {
85 LapPath triggerSensePath = senseListPath.concat(LapType.SENSE, triggerSenseId++);
86 SenseExecutor senseExecutor = new SenseExecutor(sense, triggerSensePath, ctx, engineLog);
87 sensesExecutors.add(senseExecutor);
88 }
89 }
90
91
92
93
94
95
96
97
98
99
100 SenseListExecutor(LapPath senseListPath, VariableContext ctx, EngineLog log) {
101 super(senseListPath, ctx, log);
102 }
103
104
105
106
107
108
109
110
111
112
113 public TriggerResult fire(IWorkExecutor workExecuter, boolean defaultReturn) {
114 List<SenseResult> senses = new LinkedList<SenseResult>();
115
116 for (SenseExecutor senseExecutor : sensesExecutors) {
117 defaultReturn = true;
118
119 SenseResult res = senseExecutor.fire(workExecuter);
120 senses.add(res);
121
122 if (!res.wasSuccessful()) {
123 return new TriggerResult(senses, false);
124 }
125 }
126 return new TriggerResult(senses, defaultReturn);
127 }
128 }