a3f626f4878089f3e3eade42b6a28d8a204b0829
[policy/apex-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  * 
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  * 
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  * 
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.apex.test.common.model;
22
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Set;
28 import java.util.TreeMap;
29 import java.util.TreeSet;
30
31 import org.onap.policy.apex.model.basicmodel.concepts.ApexRuntimeException;
32 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
33 import org.onap.policy.apex.model.basicmodel.concepts.AxKeyInformation;
34 import org.onap.policy.apex.model.basicmodel.concepts.AxReferenceKey;
35 import org.onap.policy.apex.model.basicmodel.concepts.AxValidationResult;
36 import org.onap.policy.apex.model.contextmodel.concepts.AxContextAlbums;
37 import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema;
38 import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchemas;
39 import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
40 import org.onap.policy.apex.model.eventmodel.concepts.AxEvents;
41 import org.onap.policy.apex.model.eventmodel.concepts.AxField;
42 import org.onap.policy.apex.model.policymodel.concepts.AxLogicReader;
43 import org.onap.policy.apex.model.policymodel.concepts.AxPolicies;
44 import org.onap.policy.apex.model.policymodel.concepts.AxPolicy;
45 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
46 import org.onap.policy.apex.model.policymodel.concepts.AxState;
47 import org.onap.policy.apex.model.policymodel.concepts.AxStateOutput;
48 import org.onap.policy.apex.model.policymodel.concepts.AxStateTaskOutputType;
49 import org.onap.policy.apex.model.policymodel.concepts.AxStateTaskReference;
50 import org.onap.policy.apex.model.policymodel.concepts.AxTask;
51 import org.onap.policy.apex.model.policymodel.concepts.AxTaskLogic;
52 import org.onap.policy.apex.model.policymodel.concepts.AxTaskSelectionLogic;
53 import org.onap.policy.apex.model.policymodel.concepts.AxTasks;
54 import org.onap.policy.apex.model.policymodel.handling.PolicyLogicReader;
55
56 /**
57  * This class creates sample evaluation Policy Models.
58  *
59  * @author John Keeney (john.keeney@ericsson.com)
60  */
61 public class EvalDomainModelFactory {
62     private static final int THIRD_MEMBER = 3;
63
64     private static final String PACKAGE = EvalDomainModelFactory.class.getPackage().getName();
65
66     private String justOneLang = null;
67
68     private final AxContextSchema typeTimestamp;
69     private final AxContextSchema typeDouble;
70     private final AxContextSchema typeCounter;
71     private final AxContextSchemas schemas;
72     private final AxEvent event0000;
73     private final AxEvent event0001;
74     private final AxEvent event0002;
75     private final AxEvent event0003;
76     private final AxEvent event0004;
77     private final AxEvents events;
78
79     /**
80      * The Constructor for the factory.
81      */
82     public EvalDomainModelFactory() {
83         this(null);
84     }
85
86     /**
87      * The Constructor for the factory that creates models for a single executor language flavour.
88      *
89      * @param justOneLang the just one lang
90      */
91     public EvalDomainModelFactory(final String justOneLang) {
92         this.justOneLang = justOneLang;
93
94         typeTimestamp = new AxContextSchema(new AxArtifactKey("TestTimestamp", "0.0.1"), "Java", "java.lang.Long");
95         typeDouble = new AxContextSchema(new AxArtifactKey("TestTemperature", "0.0.1"), "Java", "java.lang.Double");
96         typeCounter = new AxContextSchema(new AxArtifactKey("TestTimestamp", "0.0.1"), "Java", "java.lang.Long");
97
98         schemas = new AxContextSchemas(new AxArtifactKey("TestDatatypes", "0.0.1"));
99         schemas.getSchemasMap().put(typeTimestamp.getKey(), typeTimestamp);
100         schemas.getSchemasMap().put(typeDouble.getKey(), typeDouble);
101         schemas.getSchemasMap().put(typeCounter.getKey(), typeCounter);
102
103         event0000 = new AxEvent(new AxArtifactKey("Event0000", "0.0.1"), PACKAGE + ".events");
104         event0000.getParameterMap().put("SentTimestamp", new AxField(new AxReferenceKey(event0000.getKey(), "SentTimestamp"), typeTimestamp.getKey()));
105         event0000.getParameterMap().put("TestTemperature", new AxField(new AxReferenceKey(event0000.getKey(), "TestTemperature"), typeDouble.getKey()));
106         event0000.getParameterMap().put("FirstEventTimestamp",
107                 new AxField(new AxReferenceKey(event0000.getKey(), "FirstEventTimestamp"), typeTimestamp.getKey()));
108         event0000.getParameterMap().put("EventNumber", new AxField(new AxReferenceKey(event0000.getKey(), "EventNumber"), typeCounter.getKey()));
109
110         event0001 = new AxEvent(new AxArtifactKey("Event0001", "0.0.1"), PACKAGE + ".events");
111         event0001.getParameterMap().put("SentTimestamp", new AxField(new AxReferenceKey(event0001.getKey(), "SentTimestamp"), typeTimestamp.getKey()));
112         event0001.getParameterMap().put("State1Timestamp", new AxField(new AxReferenceKey(event0001.getKey(), "State1Timestamp"), typeTimestamp.getKey()));
113         event0001.getParameterMap().put("TestTemperature", new AxField(new AxReferenceKey(event0001.getKey(), "TestTemperature"), typeDouble.getKey()));
114         event0001.getParameterMap().put("FirstEventTimestamp",
115                 new AxField(new AxReferenceKey(event0001.getKey(), "FirstEventTimestamp"), typeTimestamp.getKey()));
116         event0001.getParameterMap().put("EventNumber", new AxField(new AxReferenceKey(event0001.getKey(), "EventNumber"), typeCounter.getKey()));
117
118         event0002 = new AxEvent(new AxArtifactKey("Event0002", "0.0.1"), PACKAGE + ".events");
119         event0002.getParameterMap().put("SentTimestamp", new AxField(new AxReferenceKey(event0002.getKey(), "SentTimestamp"), typeTimestamp.getKey()));
120         event0002.getParameterMap().put("State1Timestamp", new AxField(new AxReferenceKey(event0002.getKey(), "State1Timestamp"), typeTimestamp.getKey()));
121         event0002.getParameterMap().put("State2Timestamp", new AxField(new AxReferenceKey(event0002.getKey(), "State2Timestamp"), typeTimestamp.getKey()));
122         event0002.getParameterMap().put("TestTemperature", new AxField(new AxReferenceKey(event0002.getKey(), "TestTemperature"), typeDouble.getKey()));
123         event0002.getParameterMap().put("FirstEventTimestamp",
124                 new AxField(new AxReferenceKey(event0002.getKey(), "FirstEventTimestamp"), typeTimestamp.getKey()));
125         event0002.getParameterMap().put("EventNumber", new AxField(new AxReferenceKey(event0002.getKey(), "EventNumber"), typeCounter.getKey()));
126
127         event0003 = new AxEvent(new AxArtifactKey("Event0003", "0.0.1"), PACKAGE + ".events");
128         event0003.getParameterMap().put("SentTimestamp", new AxField(new AxReferenceKey(event0003.getKey(), "SentTimestamp"), typeTimestamp.getKey()));
129         event0003.getParameterMap().put("State1Timestamp", new AxField(new AxReferenceKey(event0003.getKey(), "State1Timestamp"), typeTimestamp.getKey()));
130         event0003.getParameterMap().put("State2Timestamp", new AxField(new AxReferenceKey(event0003.getKey(), "State2Timestamp"), typeTimestamp.getKey()));
131         event0003.getParameterMap().put("State3Timestamp", new AxField(new AxReferenceKey(event0003.getKey(), "State3Timestamp"), typeTimestamp.getKey()));
132         event0003.getParameterMap().put("TestTemperature", new AxField(new AxReferenceKey(event0003.getKey(), "TestTemperature"), typeDouble.getKey()));
133         event0003.getParameterMap().put("FirstEventTimestamp",
134                 new AxField(new AxReferenceKey(event0003.getKey(), "FirstEventTimestamp"), typeTimestamp.getKey()));
135         event0003.getParameterMap().put("EventNumber", new AxField(new AxReferenceKey(event0003.getKey(), "EventNumber"), typeCounter.getKey()));
136
137         event0004 = new AxEvent(new AxArtifactKey("Event0004", "0.0.1"), PACKAGE + ".events");
138         event0004.getParameterMap().put("SentTimestamp", new AxField(new AxReferenceKey(event0004.getKey(), "SentTimestamp"), typeTimestamp.getKey()));
139         event0004.getParameterMap().put("State1Timestamp", new AxField(new AxReferenceKey(event0004.getKey(), "State1Timestamp"), typeTimestamp.getKey()));
140         event0004.getParameterMap().put("State2Timestamp", new AxField(new AxReferenceKey(event0004.getKey(), "State2Timestamp"), typeTimestamp.getKey()));
141         event0004.getParameterMap().put("State3Timestamp", new AxField(new AxReferenceKey(event0004.getKey(), "State3Timestamp"), typeTimestamp.getKey()));
142         event0004.getParameterMap().put("State4Timestamp", new AxField(new AxReferenceKey(event0004.getKey(), "State4Timestamp"), typeTimestamp.getKey()));
143         event0004.getParameterMap().put("TestTemperature", new AxField(new AxReferenceKey(event0004.getKey(), "TestTemperature"), typeDouble.getKey()));
144         event0004.getParameterMap().put("FirstEventTimestamp",
145                 new AxField(new AxReferenceKey(event0004.getKey(), "FirstEventTimestamp"), typeTimestamp.getKey()));
146         event0004.getParameterMap().put("EventNumber", new AxField(new AxReferenceKey(event0004.getKey(), "EventNumber"), typeCounter.getKey()));
147
148         events = new AxEvents(new AxArtifactKey("Events", "0.0.1"));
149         events.getEventMap().put(event0000.getKey(), event0000);
150         events.getEventMap().put(event0001.getKey(), event0001);
151         events.getEventMap().put(event0002.getKey(), event0002);
152         events.getEventMap().put(event0003.getKey(), event0003);
153         events.getEventMap().put(event0004.getKey(), event0004);
154     }
155
156     /**
157      * Get a sample OODA policy model.
158      *
159      * @return the sample policy model
160      */
161     public AxPolicyModel getOODAPolicyModel() {
162         final AxTasks tasks = new AxTasks(new AxArtifactKey("Tasks", "0.0.1"));
163
164         final AxLogicReader logicReader = new PolicyLogicReader().setLogicPackage(PACKAGE).setDefaultLogic("EvalTask_Logic");
165
166         final AxTask obTask = new AxTask(new AxArtifactKey("Task_Observe_0", "0.0.1"));
167         obTask.duplicateInputFields(event0000.getParameterMap());
168         obTask.duplicateOutputFields(event0001.getParameterMap());
169         final AxTaskLogic obAxLogic = new AxTaskLogic(obTask.getKey(), "TaskLogic", (justOneLang == null ? "JRUBY" : justOneLang), logicReader);
170         obAxLogic.setLogic(obAxLogic.getLogic().replaceAll("<STATE_NAME>", "Observe").replaceAll("<TASK_NAME>", obTask.getKey().getName())
171                 .replaceAll("<STATE_NUMBER>", "1"));
172         obTask.setTaskLogic(obAxLogic);
173
174         final AxTask orTask = new AxTask(new AxArtifactKey("Task_Orient_0", "0.0.1"));
175         orTask.duplicateInputFields(event0001.getParameterMap());
176         orTask.duplicateOutputFields(event0002.getParameterMap());
177         final AxTaskLogic orAxLogic = new AxTaskLogic(orTask.getKey(), "TaskLogic", (justOneLang == null ? "JAVASCRIPT" : justOneLang), logicReader);
178         orAxLogic.setLogic(orAxLogic.getLogic().replaceAll("<STATE_NAME>", "Orient").replaceAll("<TASK_NAME>", orTask.getKey().getName())
179                 .replaceAll("<STATE_NUMBER>", "2"));
180         orTask.setTaskLogic(orAxLogic);
181
182         final AxTask dTask = new AxTask(new AxArtifactKey("Task_Decide_0", "0.0.1"));
183         dTask.duplicateInputFields(event0002.getParameterMap());
184         dTask.duplicateOutputFields(event0003.getParameterMap());
185         final AxTaskLogic dAxLogic = new AxTaskLogic(dTask.getKey(), "TaskLogic", (justOneLang == null ? "MVEL" : justOneLang), logicReader);
186         dAxLogic.setLogic(
187                 dAxLogic.getLogic().replaceAll("<STATE_NAME>", "Orient").replaceAll("<TASK_NAME>", dTask.getKey().getName()).replaceAll("<STATE_NUMBER>", "3"));
188         dTask.setTaskLogic(dAxLogic);
189
190         final AxTask aTask = new AxTask(new AxArtifactKey("Task_Act_0", "0.0.1"));
191         aTask.duplicateInputFields(event0003.getParameterMap());
192         aTask.duplicateOutputFields(event0004.getParameterMap());
193         final AxTaskLogic aAxLogic = new AxTaskLogic(aTask.getKey(), "TaskLogic", (justOneLang == null ? "JAVA" : justOneLang), logicReader);
194         aAxLogic.setLogic(
195                 aAxLogic.getLogic().replaceAll("<STATE_NAME>", "Act").replaceAll("<TASK_NAME>", aTask.getKey().getName()).replaceAll("<STATE_NUMBER>", "4"));
196         aTask.setTaskLogic(aAxLogic);
197
198         tasks.getTaskMap().put(obTask.getKey(), obTask);
199         tasks.getTaskMap().put(orTask.getKey(), orTask);
200         tasks.getTaskMap().put(dTask.getKey(), dTask);
201         tasks.getTaskMap().put(aTask.getKey(), aTask);
202
203         final Set<AxArtifactKey> obTasks = new TreeSet<>();
204         final Set<AxArtifactKey> orTasks = new TreeSet<>();
205         final Set<AxArtifactKey> decTasks = new TreeSet<>();
206         final Set<AxArtifactKey> actTasks = new TreeSet<>();
207
208         for (final AxTask task : tasks.getTaskMap().values()) {
209             if (task.getKey().getName().contains("Observe")) {
210                 obTasks.add(task.getKey());
211             }
212             if (task.getKey().getName().contains("Orient")) {
213                 orTasks.add(task.getKey());
214             }
215             if (task.getKey().getName().contains("Decide")) {
216                 decTasks.add(task.getKey());
217             }
218             if (task.getKey().getName().contains("Act")) {
219                 actTasks.add(task.getKey());
220             }
221         }
222         final List<Set<AxArtifactKey>> taskReferenceList = new ArrayList<>();
223         taskReferenceList.add(obTasks);
224         taskReferenceList.add(orTasks);
225         taskReferenceList.add(decTasks);
226         taskReferenceList.add(actTasks);
227
228         final List<AxArtifactKey> p0InEventList = new ArrayList<>();
229         p0InEventList.add(event0000.getKey());
230         p0InEventList.add(event0001.getKey());
231         p0InEventList.add(event0002.getKey());
232         p0InEventList.add(event0003.getKey());
233
234         final List<AxArtifactKey> p0OutEventList = new ArrayList<>();
235         p0OutEventList.add(event0001.getKey());
236         p0OutEventList.add(event0002.getKey());
237         p0OutEventList.add(event0003.getKey());
238         p0OutEventList.add(event0004.getKey());
239
240         final List<AxArtifactKey> p0defaultTaskList = new ArrayList<>();
241         p0defaultTaskList.add(tasks.get("Task_Observe_0").getKey());
242         p0defaultTaskList.add(tasks.get("Task_Orient_0").getKey());
243         p0defaultTaskList.add(tasks.get("Task_Decide_0").getKey());
244         p0defaultTaskList.add(tasks.get("Task_Act_0").getKey());
245
246         final AxPolicy policy0 = new AxPolicy(new AxArtifactKey("OODAPolicy_0", "0.0.1"));
247         final List<String> axLogicExecutorTypeList = Arrays.asList((justOneLang == null ? "JAVASCRIPT" : justOneLang),
248                 (justOneLang == null ? "MVEL" : justOneLang), (justOneLang == null ? "JYTHON" : justOneLang), (justOneLang == null ? "JRUBY" : justOneLang));
249         policy0.setStateMap(getOODAStateMap(policy0.getKey(), p0InEventList, p0OutEventList, axLogicExecutorTypeList, p0defaultTaskList, taskReferenceList));
250         policy0.setFirstState(policy0.getStateMap().get("Observe").getKey().getLocalName());
251
252         final AxPolicies policies = new AxPolicies(new AxArtifactKey("OODAPolicies", "0.0.1"));
253         policies.getPolicyMap().put(policy0.getKey(), policy0);
254
255         final AxKeyInformation keyInformation = new AxKeyInformation(new AxArtifactKey("KeyInformation", "0.0.1"));
256         final AxPolicyModel policyModel = new AxPolicyModel(new AxArtifactKey("EvaluationPolicyModel_OODA", "0.0.1"));
257         policyModel.setPolicies(policies);
258         policyModel.setEvents(events);
259         policyModel.setTasks(tasks);
260         policyModel.setAlbums(new AxContextAlbums(new AxArtifactKey("Albums", "0.0.1")));
261         policyModel.setSchemas(schemas);
262         policyModel.setKeyInformation(keyInformation);
263         policyModel.getKeyInformation().generateKeyInfo(policyModel);
264
265         final AxValidationResult result = policyModel.validate(new AxValidationResult());
266         if (!result.isOk()) {
267             throw new ApexRuntimeException("model " + policyModel.getId() + " is not valid" + result);
268         }
269         return policyModel;
270     }
271
272     /**
273      * Gets the OODA state map.
274      *
275      * @param policyKey the policy key
276      * @param inEventKeyList the in event key list
277      * @param outEventKeyList the out event key list
278      * @param axLogicExecutorTypeList the ax logic executor type list
279      * @param defaultTaskList the default task list
280      * @param taskKeySetList the task key set list
281      * @return the OODA state map
282      */
283     private Map<String, AxState> getOODAStateMap(final AxArtifactKey policyKey, final List<AxArtifactKey> inEventKeyList,
284             final List<AxArtifactKey> outEventKeyList, final List<String> axLogicExecutorTypeList, final List<AxArtifactKey> defaultTaskList,
285             final List<Set<AxArtifactKey>> taskKeySetList) {
286         final AxLogicReader logicReader = new PolicyLogicReader().setLogicPackage(PACKAGE).setDefaultLogic("EvalState_Logic");
287
288         final AxState actState = new AxState(new AxReferenceKey(policyKey, "Act"));
289         actState.setTrigger(inEventKeyList.get(THIRD_MEMBER));
290         final AxStateOutput act2Out = new AxStateOutput(new AxReferenceKey(actState.getKey(), "Act2Out"), outEventKeyList.get(THIRD_MEMBER),
291                 AxReferenceKey.getNullKey());
292         actState.getStateOutputs().put(act2Out.getKey().getLocalName(), act2Out);
293         actState.setTaskSelectionLogic(
294                 new AxTaskSelectionLogic(actState.getKey(), "TaskSelectionLogic", axLogicExecutorTypeList.get(THIRD_MEMBER), logicReader));
295         actState.setDefaultTask(defaultTaskList.get(THIRD_MEMBER));
296         for (final AxArtifactKey taskKey : taskKeySetList.get(THIRD_MEMBER)) {
297             actState.getTaskReferences().put(taskKey,
298                     new AxStateTaskReference(new AxReferenceKey(actState.getKey(), taskKey.getName()), AxStateTaskOutputType.DIRECT, act2Out.getKey()));
299         }
300
301         final AxState decState = new AxState(new AxReferenceKey(policyKey, "Decide"));
302         decState.setTrigger(inEventKeyList.get(2));
303         final AxStateOutput dec2Act = new AxStateOutput(new AxReferenceKey(decState.getKey(), "Dec2Act"), outEventKeyList.get(2), actState.getKey());
304         decState.getStateOutputs().put(dec2Act.getKey().getLocalName(), dec2Act);
305         decState.setTaskSelectionLogic(new AxTaskSelectionLogic(decState.getKey(), "TaskSelectionLogic", axLogicExecutorTypeList.get(2), logicReader));
306         decState.setDefaultTask(defaultTaskList.get(2));
307         for (final AxArtifactKey taskKey : taskKeySetList.get(2)) {
308             decState.getTaskReferences().put(taskKey,
309                     new AxStateTaskReference(new AxReferenceKey(decState.getKey(), taskKey.getName()), AxStateTaskOutputType.DIRECT, dec2Act.getKey()));
310         }
311
312         final AxState orState = new AxState(new AxReferenceKey(policyKey, "Orient"));
313         orState.setTrigger(inEventKeyList.get(1));
314         final AxStateOutput or2Dec = new AxStateOutput(new AxReferenceKey(orState.getKey(), "Or2Dec"), outEventKeyList.get(1), decState.getKey());
315         orState.getStateOutputs().put(or2Dec.getKey().getLocalName(), or2Dec);
316         orState.setTaskSelectionLogic(new AxTaskSelectionLogic(orState.getKey(), "TaskSelectionLogic", axLogicExecutorTypeList.get(1), logicReader));
317         orState.setDefaultTask(defaultTaskList.get(1));
318         for (final AxArtifactKey taskKey : taskKeySetList.get(1)) {
319             orState.getTaskReferences().put(taskKey,
320                     new AxStateTaskReference(new AxReferenceKey(orState.getKey(), taskKey.getName()), AxStateTaskOutputType.DIRECT, or2Dec.getKey()));
321         }
322
323         final AxState obState = new AxState(new AxReferenceKey(policyKey, "Observe"));
324         obState.setTrigger(inEventKeyList.get(0));
325         final AxStateOutput ob2Or = new AxStateOutput(new AxReferenceKey(obState.getKey(), "Ob2Or"), outEventKeyList.get(0), orState.getKey());
326         obState.getStateOutputs().put(ob2Or.getKey().getLocalName(), ob2Or);
327         obState.setTaskSelectionLogic(new AxTaskSelectionLogic(obState.getKey(), "TaskSelectionLogic", axLogicExecutorTypeList.get(0), logicReader));
328         obState.setDefaultTask(defaultTaskList.get(0));
329         for (final AxArtifactKey taskKey : taskKeySetList.get(0)) {
330             obState.getTaskReferences().put(taskKey,
331                     new AxStateTaskReference(new AxReferenceKey(obState.getKey(), taskKey.getName()), AxStateTaskOutputType.DIRECT, ob2Or.getKey()));
332         }
333
334         final Map<String, AxState> stateMap = new TreeMap<>();
335         stateMap.put(obState.getKey().getLocalName(), obState);
336         stateMap.put(orState.getKey().getLocalName(), orState);
337         stateMap.put(decState.getKey().getLocalName(), decState);
338         stateMap.put(actState.getKey().getLocalName(), actState);
339
340         return stateMap;
341     }
342
343     /**
344      * Get a sample ECA policy model.
345      *
346      * @return the sample policy model
347      */
348     public AxPolicyModel getECAPolicyModel() {
349
350         final AxTasks tasks = new AxTasks(new AxArtifactKey("Tasks", "0.0.1"));
351
352         final AxLogicReader logicReader = new PolicyLogicReader().setLogicPackage(PACKAGE).setDefaultLogic("EvalTask_Logic");
353
354         final AxTask eTask = new AxTask(new AxArtifactKey("Task_Event_0", "0.0.1"));
355         eTask.duplicateInputFields(event0000.getParameterMap());
356         eTask.duplicateOutputFields(event0001.getParameterMap());
357         final AxTaskLogic eAxLogic = new AxTaskLogic(eTask.getKey(), "TaskLogic", (justOneLang == null ? "JYTHON" : justOneLang), logicReader);
358         eAxLogic.setLogic(
359                 eAxLogic.getLogic().replaceAll("<STATE_NAME>", "Event").replaceAll("<TASK_NAME>", eTask.getKey().getName()).replaceAll("<STATE_NUMBER>", "1"));
360         eTask.setTaskLogic(eAxLogic);
361
362         final AxTask cTask = new AxTask(new AxArtifactKey("Task_Condition_0", "0.0.1"));
363         cTask.duplicateInputFields(event0001.getParameterMap());
364         cTask.duplicateOutputFields(event0002.getParameterMap());
365         final AxTaskLogic cAxLogic = new AxTaskLogic(cTask.getKey(), "TaskLogic", (justOneLang == null ? "JAVASCRIPT" : justOneLang), logicReader);
366         cAxLogic.setLogic(cAxLogic.getLogic().replaceAll("<STATE_NAME>", "Condition").replaceAll("<TASK_NAME>", cTask.getKey().getName())
367                 .replaceAll("<STATE_NUMBER>", "2"));
368         cTask.setTaskLogic(cAxLogic);
369
370         final AxTask aTask = new AxTask(new AxArtifactKey("Task_Action_0", "0.0.1"));
371         aTask.duplicateInputFields(event0002.getParameterMap());
372         aTask.duplicateOutputFields(event0003.getParameterMap());
373         final AxTaskLogic aAxLogic = new AxTaskLogic(aTask.getKey(), "TaskLogic", (justOneLang == null ? "JAVA" : justOneLang), logicReader);
374         aAxLogic.setLogic(
375                 aAxLogic.getLogic().replaceAll("<STATE_NAME>", "Action").replaceAll("<TASK_NAME>", aTask.getKey().getName()).replaceAll("<STATE_NUMBER>", "3"));
376         aTask.setTaskLogic(aAxLogic);
377
378         tasks.getTaskMap().put(eTask.getKey(), eTask);
379         tasks.getTaskMap().put(cTask.getKey(), cTask);
380         tasks.getTaskMap().put(aTask.getKey(), aTask);
381
382         final Set<AxArtifactKey> eventTasks = new TreeSet<>();
383         final Set<AxArtifactKey> conditionTasks = new TreeSet<>();
384         final Set<AxArtifactKey> actionTasks = new TreeSet<>();
385
386         for (final AxTask task : tasks.getTaskMap().values()) {
387             if (task.getKey().getName().contains("Event")) {
388                 eventTasks.add(task.getKey());
389             }
390             if (task.getKey().getName().contains("Condition")) {
391                 conditionTasks.add(task.getKey());
392             }
393             if (task.getKey().getName().contains("Action")) {
394                 actionTasks.add(task.getKey());
395             }
396         }
397         final List<Set<AxArtifactKey>> taskReferenceList = new ArrayList<>();
398         taskReferenceList.add(eventTasks);
399         taskReferenceList.add(conditionTasks);
400         taskReferenceList.add(actionTasks);
401
402         final List<AxArtifactKey> p0InEventList = new ArrayList<>();
403         p0InEventList.add(event0000.getKey());
404         p0InEventList.add(event0001.getKey());
405         p0InEventList.add(event0002.getKey());
406
407         final List<AxArtifactKey> p0OutEventList = new ArrayList<>();
408         p0OutEventList.add(event0001.getKey());
409         p0OutEventList.add(event0002.getKey());
410         p0OutEventList.add(event0003.getKey());
411
412         final List<AxArtifactKey> p0defaultTaskList = new ArrayList<>();
413         p0defaultTaskList.add(tasks.get("Task_Event_0").getKey());
414         p0defaultTaskList.add(tasks.get("Task_Condition_0").getKey());
415         p0defaultTaskList.add(tasks.get("Task_Action_0").getKey());
416
417         final AxPolicy policy0 = new AxPolicy(new AxArtifactKey("ECAPolicy_0", "0.0.1"));
418         final List<String> axLogicExecutorTypeList = Arrays.asList((justOneLang == null ? "JAVASCRIPT" : justOneLang),
419                 (justOneLang == null ? "MVEL" : justOneLang), (justOneLang == null ? "JYTHON" : justOneLang));
420         policy0.setStateMap(getECAStateMap(policy0.getKey(), p0InEventList, p0OutEventList, axLogicExecutorTypeList, p0defaultTaskList, taskReferenceList));
421         policy0.setFirstState(policy0.getStateMap().get("Event").getKey().getLocalName());
422
423         final AxPolicies policies = new AxPolicies(new AxArtifactKey("ECAPolicies", "0.0.1"));
424         policies.getPolicyMap().put(policy0.getKey(), policy0);
425
426         final AxKeyInformation keyInformation = new AxKeyInformation(new AxArtifactKey("KeyInformation", "0.0.1"));
427         final AxPolicyModel policyModel = new AxPolicyModel(new AxArtifactKey("EvaluationPolicyModel_ECA", "0.0.1"));
428         policyModel.setPolicies(policies);
429         policyModel.setEvents(events);
430         policyModel.setTasks(tasks);
431         policyModel.setAlbums(new AxContextAlbums(new AxArtifactKey("Albums", "0.0.1")));
432         policyModel.setSchemas(schemas);
433         policyModel.setKeyInformation(keyInformation);
434         policyModel.getKeyInformation().generateKeyInfo(policyModel);
435
436         final AxValidationResult result = policyModel.validate(new AxValidationResult());
437         if (!result.isOk()) {
438             throw new ApexRuntimeException("model " + policyModel.getId() + " is not valid" + result);
439         }
440         return policyModel;
441     }
442
443     /**
444      * Gets the ECA state map.
445      *
446      * @param policyKey the policy key
447      * @param inEventKeyList the in event key list
448      * @param outEventKeyList the out event key list
449      * @param axLogicExecutorTypeList the ax logic executor type list
450      * @param defaultTaskList the default task list
451      * @param taskKeySetList the task key set list
452      * @return the ECA state map
453      */
454     private Map<String, AxState> getECAStateMap(final AxArtifactKey policyKey, final List<AxArtifactKey> inEventKeyList,
455             final List<AxArtifactKey> outEventKeyList, final List<String> axLogicExecutorTypeList, final List<AxArtifactKey> defaultTaskList,
456             final List<Set<AxArtifactKey>> taskKeySetList) {
457         final AxLogicReader logicReader = new PolicyLogicReader().setLogicPackage(PACKAGE).setDefaultLogic("EvalState_Logic");
458
459         final AxState actionState = new AxState(new AxReferenceKey(policyKey, "Action"));
460         actionState.setTrigger(inEventKeyList.get(2));
461         final AxStateOutput action2Out = new AxStateOutput(actionState.getKey(), AxReferenceKey.getNullKey(), outEventKeyList.get(2));
462         actionState.getStateOutputs().put(action2Out.getKey().getLocalName(), action2Out);
463         actionState.setTaskSelectionLogic(new AxTaskSelectionLogic(actionState.getKey(), "TaskSelectionLogic", axLogicExecutorTypeList.get(2), logicReader));
464         actionState.setDefaultTask(defaultTaskList.get(2));
465         for (final AxArtifactKey taskKey : taskKeySetList.get(2)) {
466             actionState.getTaskReferences().put(taskKey,
467                     new AxStateTaskReference(new AxReferenceKey(actionState.getKey(), taskKey.getName()), AxStateTaskOutputType.DIRECT, action2Out.getKey()));
468         }
469
470         final AxState conditionState = new AxState(new AxReferenceKey(policyKey, "Condition"));
471         conditionState.setTrigger(inEventKeyList.get(1));
472         final AxStateOutput condition2Action = new AxStateOutput(conditionState.getKey(), actionState.getKey(), outEventKeyList.get(1));
473         conditionState.getStateOutputs().put(condition2Action.getKey().getLocalName(), condition2Action);
474         conditionState
475                 .setTaskSelectionLogic(new AxTaskSelectionLogic(conditionState.getKey(), "TaskSelectionLogic", axLogicExecutorTypeList.get(1), logicReader));
476         conditionState.setDefaultTask(defaultTaskList.get(1));
477         for (final AxArtifactKey taskKey : taskKeySetList.get(1)) {
478             conditionState.getTaskReferences().put(taskKey, new AxStateTaskReference(new AxReferenceKey(conditionState.getKey(), taskKey.getName()),
479                     AxStateTaskOutputType.DIRECT, condition2Action.getKey()));
480         }
481
482         final AxState eventState = new AxState(new AxReferenceKey(policyKey, "Event"));
483         eventState.setTrigger(inEventKeyList.get(0));
484         final AxStateOutput event2Condition = new AxStateOutput(eventState.getKey(), conditionState.getKey(), outEventKeyList.get(0));
485         eventState.getStateOutputs().put(event2Condition.getKey().getLocalName(), event2Condition);
486         eventState.setTaskSelectionLogic(new AxTaskSelectionLogic(eventState.getKey(), "TaskSelectionLogic", axLogicExecutorTypeList.get(0), logicReader));
487         eventState.setDefaultTask(defaultTaskList.get(0));
488         for (final AxArtifactKey taskKey : taskKeySetList.get(0)) {
489             eventState.getTaskReferences().put(taskKey, new AxStateTaskReference(new AxReferenceKey(eventState.getKey(), taskKey.getName()),
490                     AxStateTaskOutputType.DIRECT, event2Condition.getKey()));
491         }
492
493         final Map<String, AxState> stateMap = new TreeMap<>();
494         stateMap.put(eventState.getKey().getLocalName(), eventState);
495         stateMap.put(conditionState.getKey().getLocalName(), conditionState);
496         stateMap.put(actionState.getKey().getLocalName(), actionState);
497
498         return stateMap;
499     }
500
501 }