db214636b471bd38674f8bb238f21bdb72225606
[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.testsuites.integration.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     // Recurring string constants
63     private static final String ACTION = "Action";
64     private static final String CONDITION = "Condition";
65     private static final String EVENT = "Event";
66     private static final String TASK_SELECTION_LOGIC = "TaskSelectionLogic";
67     private static final String JYTHON = "JYTHON";
68     private static final String JRUBY = "JRUBY";
69     private static final String MVEL = "MVEL";
70     private static final String ORIENT = "Orient";
71     private static final String STATE_NAME = "<STATE_NAME>";
72     private static final String OBSERVE = "Observe";
73     private static final String JAVASCRIPT = "JAVASCRIPT";
74     private static final String TASK_NAME = "<TASK_NAME>";
75     private static final String TASK_LOGIC = "TaskLogic";
76     private static final String STATE_NUMBER = "<STATE_NUMBER>";
77     private static final String STATE3_TIMESTAMP = "State3Timestamp";
78     private static final String EVENT_NUMBER = "EventNumber";
79     private static final String FIRST_EVENT_TIMESTAMP = "FirstEventTimestamp";
80     private static final String STATE2_TIMESTAMP = "State2Timestamp";
81     private static final String STATE1_TIMESTAMP = "State1Timestamp";
82     private static final String TEST_TEMPERATURE = "TestTemperature";
83     private static final String SENT_TIMESTAMP = "SentTimestamp";
84     private static final String EVENT_TAG = ".events";
85     private static final String DEFAULT_VERSION = "0.0.1";
86
87     private static final int THIRD_MEMBER = 3;
88
89     private static final String PACKAGE = EvalDomainModelFactory.class.getPackage().getName();
90
91     private String justOneLang = null;
92
93     private final AxContextSchema typeTimestamp;
94     private final AxContextSchema typeDouble;
95     private final AxContextSchema typeCounter;
96     private final AxContextSchemas schemas;
97     private final AxEvent event0000;
98     private final AxEvent event0001;
99     private final AxEvent event0002;
100     private final AxEvent event0003;
101     private final AxEvent event0004;
102     private final AxEvents events;
103
104     /**
105      * The Constructor for the factory.
106      */
107     public EvalDomainModelFactory() {
108         this(null);
109     }
110
111     /**
112      * The Constructor for the factory that creates models for a single executor language flavour.
113      *
114      * @param justOneLang the just one lang
115      */
116     public EvalDomainModelFactory(final String justOneLang) {
117         this.justOneLang = justOneLang;
118
119         typeTimestamp = new AxContextSchema(new AxArtifactKey("TestTimestamp", DEFAULT_VERSION), "Java",
120                         "java.lang.Long");
121         typeDouble = new AxContextSchema(new AxArtifactKey(TEST_TEMPERATURE, DEFAULT_VERSION), "Java",
122                         "java.lang.Double");
123         typeCounter = new AxContextSchema(new AxArtifactKey("TestTimestamp", DEFAULT_VERSION), "Java",
124                         "java.lang.Long");
125
126         schemas = new AxContextSchemas(new AxArtifactKey("TestDatatypes", DEFAULT_VERSION));
127         schemas.getSchemasMap().put(typeTimestamp.getKey(), typeTimestamp);
128         schemas.getSchemasMap().put(typeDouble.getKey(), typeDouble);
129         schemas.getSchemasMap().put(typeCounter.getKey(), typeCounter);
130
131         event0000 = new AxEvent(new AxArtifactKey("Event0000", DEFAULT_VERSION), PACKAGE + EVENT_TAG);
132         event0000.getParameterMap().put(SENT_TIMESTAMP,
133                         new AxField(new AxReferenceKey(event0000.getKey(), SENT_TIMESTAMP), typeTimestamp.getKey()));
134         event0000.getParameterMap().put(TEST_TEMPERATURE,
135                         new AxField(new AxReferenceKey(event0000.getKey(), TEST_TEMPERATURE), typeDouble.getKey()));
136         event0000.getParameterMap().put(FIRST_EVENT_TIMESTAMP, new AxField(
137                         new AxReferenceKey(event0000.getKey(), FIRST_EVENT_TIMESTAMP), typeTimestamp.getKey()));
138         event0000.getParameterMap().put(EVENT_NUMBER,
139                         new AxField(new AxReferenceKey(event0000.getKey(), EVENT_NUMBER), typeCounter.getKey()));
140
141         event0001 = new AxEvent(new AxArtifactKey("Event0001", DEFAULT_VERSION), PACKAGE + EVENT_TAG);
142         event0001.getParameterMap().put(SENT_TIMESTAMP,
143                         new AxField(new AxReferenceKey(event0001.getKey(), SENT_TIMESTAMP), typeTimestamp.getKey()));
144         event0001.getParameterMap().put(STATE1_TIMESTAMP,
145                         new AxField(new AxReferenceKey(event0001.getKey(), STATE1_TIMESTAMP), typeTimestamp.getKey()));
146         event0001.getParameterMap().put(TEST_TEMPERATURE,
147                         new AxField(new AxReferenceKey(event0001.getKey(), TEST_TEMPERATURE), typeDouble.getKey()));
148         event0001.getParameterMap().put(FIRST_EVENT_TIMESTAMP, new AxField(
149                         new AxReferenceKey(event0001.getKey(), FIRST_EVENT_TIMESTAMP), typeTimestamp.getKey()));
150         event0001.getParameterMap().put(EVENT_NUMBER,
151                         new AxField(new AxReferenceKey(event0001.getKey(), EVENT_NUMBER), typeCounter.getKey()));
152
153         event0002 = new AxEvent(new AxArtifactKey("Event0002", DEFAULT_VERSION), PACKAGE + EVENT_TAG);
154         event0002.getParameterMap().put(SENT_TIMESTAMP,
155                         new AxField(new AxReferenceKey(event0002.getKey(), SENT_TIMESTAMP), typeTimestamp.getKey()));
156         event0002.getParameterMap().put(STATE1_TIMESTAMP,
157                         new AxField(new AxReferenceKey(event0002.getKey(), STATE1_TIMESTAMP), typeTimestamp.getKey()));
158         event0002.getParameterMap().put(STATE2_TIMESTAMP,
159                         new AxField(new AxReferenceKey(event0002.getKey(), STATE2_TIMESTAMP), typeTimestamp.getKey()));
160         event0002.getParameterMap().put(TEST_TEMPERATURE,
161                         new AxField(new AxReferenceKey(event0002.getKey(), TEST_TEMPERATURE), typeDouble.getKey()));
162         event0002.getParameterMap().put(FIRST_EVENT_TIMESTAMP, new AxField(
163                         new AxReferenceKey(event0002.getKey(), FIRST_EVENT_TIMESTAMP), typeTimestamp.getKey()));
164         event0002.getParameterMap().put(EVENT_NUMBER,
165                         new AxField(new AxReferenceKey(event0002.getKey(), EVENT_NUMBER), typeCounter.getKey()));
166
167         event0003 = new AxEvent(new AxArtifactKey("Event0003", DEFAULT_VERSION), PACKAGE + EVENT_TAG);
168         event0003.getParameterMap().put(SENT_TIMESTAMP,
169                         new AxField(new AxReferenceKey(event0003.getKey(), SENT_TIMESTAMP), typeTimestamp.getKey()));
170         event0003.getParameterMap().put(STATE1_TIMESTAMP,
171                         new AxField(new AxReferenceKey(event0003.getKey(), STATE1_TIMESTAMP), typeTimestamp.getKey()));
172         event0003.getParameterMap().put(STATE2_TIMESTAMP,
173                         new AxField(new AxReferenceKey(event0003.getKey(), STATE2_TIMESTAMP), typeTimestamp.getKey()));
174         event0003.getParameterMap().put(STATE3_TIMESTAMP,
175                         new AxField(new AxReferenceKey(event0003.getKey(), STATE3_TIMESTAMP), typeTimestamp.getKey()));
176         event0003.getParameterMap().put(TEST_TEMPERATURE,
177                         new AxField(new AxReferenceKey(event0003.getKey(), TEST_TEMPERATURE), typeDouble.getKey()));
178         event0003.getParameterMap().put(FIRST_EVENT_TIMESTAMP, new AxField(
179                         new AxReferenceKey(event0003.getKey(), FIRST_EVENT_TIMESTAMP), typeTimestamp.getKey()));
180         event0003.getParameterMap().put(EVENT_NUMBER,
181                         new AxField(new AxReferenceKey(event0003.getKey(), EVENT_NUMBER), typeCounter.getKey()));
182
183         event0004 = new AxEvent(new AxArtifactKey("Event0004", DEFAULT_VERSION), PACKAGE + EVENT_TAG);
184         event0004.getParameterMap().put(SENT_TIMESTAMP,
185                         new AxField(new AxReferenceKey(event0004.getKey(), SENT_TIMESTAMP), typeTimestamp.getKey()));
186         event0004.getParameterMap().put(STATE1_TIMESTAMP,
187                         new AxField(new AxReferenceKey(event0004.getKey(), STATE1_TIMESTAMP), typeTimestamp.getKey()));
188         event0004.getParameterMap().put(STATE2_TIMESTAMP,
189                         new AxField(new AxReferenceKey(event0004.getKey(), STATE2_TIMESTAMP), typeTimestamp.getKey()));
190         event0004.getParameterMap().put(STATE3_TIMESTAMP,
191                         new AxField(new AxReferenceKey(event0004.getKey(), STATE3_TIMESTAMP), typeTimestamp.getKey()));
192         event0004.getParameterMap().put("State4Timestamp",
193                         new AxField(new AxReferenceKey(event0004.getKey(), "State4Timestamp"), typeTimestamp.getKey()));
194         event0004.getParameterMap().put(TEST_TEMPERATURE,
195                         new AxField(new AxReferenceKey(event0004.getKey(), TEST_TEMPERATURE), typeDouble.getKey()));
196         event0004.getParameterMap().put(FIRST_EVENT_TIMESTAMP, new AxField(
197                         new AxReferenceKey(event0004.getKey(), FIRST_EVENT_TIMESTAMP), typeTimestamp.getKey()));
198         event0004.getParameterMap().put(EVENT_NUMBER,
199                         new AxField(new AxReferenceKey(event0004.getKey(), EVENT_NUMBER), typeCounter.getKey()));
200
201         events = new AxEvents(new AxArtifactKey("Events", DEFAULT_VERSION));
202         events.getEventMap().put(event0000.getKey(), event0000);
203         events.getEventMap().put(event0001.getKey(), event0001);
204         events.getEventMap().put(event0002.getKey(), event0002);
205         events.getEventMap().put(event0003.getKey(), event0003);
206         events.getEventMap().put(event0004.getKey(), event0004);
207     }
208
209     /**
210      * Get a sample OODA policy model.
211      *
212      * @return the sample policy model
213      */
214     public AxPolicyModel getOodaPolicyModel() {
215         final AxTasks tasks = new AxTasks(new AxArtifactKey("Tasks", DEFAULT_VERSION));
216
217         final AxLogicReader logicReader = new PolicyLogicReader().setLogicPackage(PACKAGE)
218                         .setDefaultLogic("EvalTaskLogic");
219
220         final AxTask obTask = new AxTask(new AxArtifactKey("Task_Observe_0", DEFAULT_VERSION));
221         obTask.duplicateInputFields(event0000.getParameterMap());
222         obTask.duplicateOutputFields(event0001.getParameterMap());
223         final AxTaskLogic obAxLogic = new AxTaskLogic(obTask.getKey(), TASK_LOGIC,
224                         (justOneLang == null ? JRUBY : justOneLang), logicReader);
225         obAxLogic.setLogic(obAxLogic.getLogic().replaceAll(STATE_NAME, OBSERVE)
226                         .replaceAll(TASK_NAME, obTask.getKey().getName()).replaceAll(STATE_NUMBER, "1"));
227         obTask.setTaskLogic(obAxLogic);
228
229         final AxTask orTask = new AxTask(new AxArtifactKey("Task_Orient_0", DEFAULT_VERSION));
230         orTask.duplicateInputFields(event0001.getParameterMap());
231         orTask.duplicateOutputFields(event0002.getParameterMap());
232         final AxTaskLogic orAxLogic = new AxTaskLogic(orTask.getKey(), TASK_LOGIC,
233                         (justOneLang == null ? JAVASCRIPT : justOneLang), logicReader);
234         orAxLogic.setLogic(orAxLogic.getLogic().replaceAll(STATE_NAME, ORIENT)
235                         .replaceAll(TASK_NAME, orTask.getKey().getName()).replaceAll(STATE_NUMBER, "2"));
236         orTask.setTaskLogic(orAxLogic);
237
238         final AxTask dTask = new AxTask(new AxArtifactKey("Task_Decide_0", DEFAULT_VERSION));
239         dTask.duplicateInputFields(event0002.getParameterMap());
240         dTask.duplicateOutputFields(event0003.getParameterMap());
241         final AxTaskLogic dAxLogic = new AxTaskLogic(dTask.getKey(), TASK_LOGIC,
242                         (justOneLang == null ? MVEL : justOneLang), logicReader);
243         dAxLogic.setLogic(dAxLogic.getLogic().replaceAll(STATE_NAME, ORIENT)
244                         .replaceAll(TASK_NAME, dTask.getKey().getName()).replaceAll(STATE_NUMBER, "3"));
245         dTask.setTaskLogic(dAxLogic);
246
247         final AxTask aTask = new AxTask(new AxArtifactKey("Task_Act_0", DEFAULT_VERSION));
248         aTask.duplicateInputFields(event0003.getParameterMap());
249         aTask.duplicateOutputFields(event0004.getParameterMap());
250         final AxTaskLogic aAxLogic = new AxTaskLogic(aTask.getKey(), TASK_LOGIC,
251                         (justOneLang == null ? "JAVA" : justOneLang), logicReader);
252         aAxLogic.setLogic(aAxLogic.getLogic().replaceAll(STATE_NAME, "Act")
253                         .replaceAll(TASK_NAME, aTask.getKey().getName()).replaceAll(STATE_NUMBER, "4"));
254         aTask.setTaskLogic(aAxLogic);
255
256         tasks.getTaskMap().put(obTask.getKey(), obTask);
257         tasks.getTaskMap().put(orTask.getKey(), orTask);
258         tasks.getTaskMap().put(dTask.getKey(), dTask);
259         tasks.getTaskMap().put(aTask.getKey(), aTask);
260
261         final Set<AxArtifactKey> obTasks = new TreeSet<>();
262         final Set<AxArtifactKey> orTasks = new TreeSet<>();
263         final Set<AxArtifactKey> decTasks = new TreeSet<>();
264         final Set<AxArtifactKey> actTasks = new TreeSet<>();
265
266         addOodaTasks(tasks, obTasks, orTasks, decTasks, actTasks);
267         
268         final List<Set<AxArtifactKey>> taskReferenceList = new ArrayList<>();
269         taskReferenceList.add(obTasks);
270         taskReferenceList.add(orTasks);
271         taskReferenceList.add(decTasks);
272         taskReferenceList.add(actTasks);
273
274         final List<AxArtifactKey> p0InEventList = new ArrayList<>();
275         p0InEventList.add(event0000.getKey());
276         p0InEventList.add(event0001.getKey());
277         p0InEventList.add(event0002.getKey());
278         p0InEventList.add(event0003.getKey());
279
280         final List<AxArtifactKey> p0OutEventList = new ArrayList<>();
281         p0OutEventList.add(event0001.getKey());
282         p0OutEventList.add(event0002.getKey());
283         p0OutEventList.add(event0003.getKey());
284         p0OutEventList.add(event0004.getKey());
285
286         final List<AxArtifactKey> p0defaultTaskList = new ArrayList<>();
287         p0defaultTaskList.add(tasks.get("Task_Observe_0").getKey());
288         p0defaultTaskList.add(tasks.get("Task_Orient_0").getKey());
289         p0defaultTaskList.add(tasks.get("Task_Decide_0").getKey());
290         p0defaultTaskList.add(tasks.get("Task_Act_0").getKey());
291
292         final AxPolicy policy0 = new AxPolicy(new AxArtifactKey("OODAPolicy_0", DEFAULT_VERSION));
293         final List<String> axLogicExecutorTypeList = initAxLogicExecutorTypeList(justOneLang);
294
295         policy0.setStateMap(getOodaStateMap(policy0.getKey(), p0InEventList, p0OutEventList, axLogicExecutorTypeList,
296                         p0defaultTaskList, taskReferenceList));
297         policy0.setFirstState(policy0.getStateMap().get(OBSERVE).getKey().getLocalName());
298
299         final AxPolicies policies = new AxPolicies(new AxArtifactKey("OODAPolicies", DEFAULT_VERSION));
300         policies.getPolicyMap().put(policy0.getKey(), policy0);
301
302         final AxKeyInformation keyInformation = new AxKeyInformation(
303                         new AxArtifactKey("KeyInformation", DEFAULT_VERSION));
304         final AxPolicyModel policyModel = new AxPolicyModel(
305                         new AxArtifactKey("EvaluationPolicyModel_OODA", DEFAULT_VERSION));
306         policyModel.setPolicies(policies);
307         policyModel.setEvents(events);
308         policyModel.setTasks(tasks);
309         policyModel.setAlbums(new AxContextAlbums(new AxArtifactKey("Albums", DEFAULT_VERSION)));
310         policyModel.setSchemas(schemas);
311         policyModel.setKeyInformation(keyInformation);
312         policyModel.getKeyInformation().generateKeyInfo(policyModel);
313
314         final AxValidationResult result = policyModel.validate(new AxValidationResult());
315         if (!result.isOk()) {
316             throw new ApexRuntimeException("model " + policyModel.getId() + " is not valid" + result);
317         }
318         return policyModel;
319     }
320
321     /**
322      * Add OODA tasks to the policy.
323      * 
324      * @param tasks the policy tasks
325      * @param obTasks observe tasks
326      * @param orTasks orient tasks
327      * @param decTasks decide tasks
328      * @param actTasks act tasks
329      */
330     private void addOodaTasks(final AxTasks tasks, final Set<AxArtifactKey> obTasks, final Set<AxArtifactKey> orTasks,
331                     final Set<AxArtifactKey> decTasks, final Set<AxArtifactKey> actTasks) {
332         for (final AxTask task : tasks.getTaskMap().values()) {
333             if (task.getKey().getName().contains(OBSERVE)) {
334                 obTasks.add(task.getKey());
335             }
336             if (task.getKey().getName().contains(ORIENT)) {
337                 orTasks.add(task.getKey());
338             }
339             if (task.getKey().getName().contains("Decide")) {
340                 decTasks.add(task.getKey());
341             }
342             if (task.getKey().getName().contains("Act")) {
343                 actTasks.add(task.getKey());
344             }
345         }
346     }
347
348     /**
349      * Initialize the logic executor list.
350      * 
351      * @param justOneLang the language to use
352      * @return the list of languages
353      */
354     private List<String> initAxLogicExecutorTypeList(final String justOneLang) {
355         List<String> axLogicExecutorTypeList = new ArrayList<>();
356
357         if (justOneLang != null) {
358             axLogicExecutorTypeList.add(justOneLang);
359         } else {
360             axLogicExecutorTypeList.add(JAVASCRIPT);
361             axLogicExecutorTypeList.add(JYTHON);
362             axLogicExecutorTypeList.add(JYTHON);
363             axLogicExecutorTypeList.add(MVEL);
364             axLogicExecutorTypeList.add(JRUBY);
365         }
366         return axLogicExecutorTypeList;
367     }
368
369     /**
370      * Gets the OODA state map.
371      *
372      * @param policyKey the policy key
373      * @param inEventKeyList the in event key list
374      * @param outEventKeyList the out event key list
375      * @param axLogicExecutorTypeList the ax logic executor type list
376      * @param defaultTaskList the default task list
377      * @param taskKeySetList the task key set list
378      * @return the OODA state map
379      */
380     private Map<String, AxState> getOodaStateMap(final AxArtifactKey policyKey,
381                     final List<AxArtifactKey> inEventKeyList, final List<AxArtifactKey> outEventKeyList,
382                     final List<String> axLogicExecutorTypeList, final List<AxArtifactKey> defaultTaskList,
383                     final List<Set<AxArtifactKey>> taskKeySetList) {
384         final AxLogicReader logicReader = new PolicyLogicReader().setLogicPackage(PACKAGE)
385                         .setDefaultLogic("EvalStateLogic");
386
387         final AxState actState = new AxState(new AxReferenceKey(policyKey, "Act"));
388         actState.setTrigger(inEventKeyList.get(THIRD_MEMBER));
389         final AxStateOutput act2Out = new AxStateOutput(new AxReferenceKey(actState.getKey(), "Act2Out"),
390                         outEventKeyList.get(THIRD_MEMBER), AxReferenceKey.getNullKey());
391         actState.getStateOutputs().put(act2Out.getKey().getLocalName(), act2Out);
392         actState.setTaskSelectionLogic(new AxTaskSelectionLogic(actState.getKey(), TASK_SELECTION_LOGIC,
393                         axLogicExecutorTypeList.get(THIRD_MEMBER), logicReader));
394         actState.setDefaultTask(defaultTaskList.get(THIRD_MEMBER));
395         for (final AxArtifactKey taskKey : taskKeySetList.get(THIRD_MEMBER)) {
396             actState.getTaskReferences().put(taskKey,
397                             new AxStateTaskReference(new AxReferenceKey(actState.getKey(), taskKey.getName()),
398                                             AxStateTaskOutputType.DIRECT, act2Out.getKey()));
399         }
400
401         final AxState decState = new AxState(new AxReferenceKey(policyKey, "Decide"));
402         decState.setTrigger(inEventKeyList.get(2));
403         final AxStateOutput dec2Act = new AxStateOutput(new AxReferenceKey(decState.getKey(), "Dec2Act"),
404                         outEventKeyList.get(2), actState.getKey());
405         decState.getStateOutputs().put(dec2Act.getKey().getLocalName(), dec2Act);
406         decState.setTaskSelectionLogic(new AxTaskSelectionLogic(decState.getKey(), TASK_SELECTION_LOGIC,
407                         axLogicExecutorTypeList.get(2), logicReader));
408         decState.setDefaultTask(defaultTaskList.get(2));
409         for (final AxArtifactKey taskKey : taskKeySetList.get(2)) {
410             decState.getTaskReferences().put(taskKey,
411                             new AxStateTaskReference(new AxReferenceKey(decState.getKey(), taskKey.getName()),
412                                             AxStateTaskOutputType.DIRECT, dec2Act.getKey()));
413         }
414
415         final AxState orState = new AxState(new AxReferenceKey(policyKey, ORIENT));
416         orState.setTrigger(inEventKeyList.get(1));
417         final AxStateOutput or2Dec = new AxStateOutput(new AxReferenceKey(orState.getKey(), "Or2Dec"),
418                         outEventKeyList.get(1), decState.getKey());
419         orState.getStateOutputs().put(or2Dec.getKey().getLocalName(), or2Dec);
420         orState.setTaskSelectionLogic(new AxTaskSelectionLogic(orState.getKey(), TASK_SELECTION_LOGIC,
421                         axLogicExecutorTypeList.get(1), logicReader));
422         orState.setDefaultTask(defaultTaskList.get(1));
423         for (final AxArtifactKey taskKey : taskKeySetList.get(1)) {
424             orState.getTaskReferences().put(taskKey,
425                             new AxStateTaskReference(new AxReferenceKey(orState.getKey(), taskKey.getName()),
426                                             AxStateTaskOutputType.DIRECT, or2Dec.getKey()));
427         }
428
429         final AxState obState = new AxState(new AxReferenceKey(policyKey, OBSERVE));
430         obState.setTrigger(inEventKeyList.get(0));
431         final AxStateOutput ob2Or = new AxStateOutput(new AxReferenceKey(obState.getKey(), "Ob2Or"),
432                         outEventKeyList.get(0), orState.getKey());
433         obState.getStateOutputs().put(ob2Or.getKey().getLocalName(), ob2Or);
434         obState.setTaskSelectionLogic(new AxTaskSelectionLogic(obState.getKey(), TASK_SELECTION_LOGIC,
435                         axLogicExecutorTypeList.get(0), logicReader));
436         obState.setDefaultTask(defaultTaskList.get(0));
437         for (final AxArtifactKey taskKey : taskKeySetList.get(0)) {
438             obState.getTaskReferences().put(taskKey,
439                             new AxStateTaskReference(new AxReferenceKey(obState.getKey(), taskKey.getName()),
440                                             AxStateTaskOutputType.DIRECT, ob2Or.getKey()));
441         }
442
443         final Map<String, AxState> stateMap = new TreeMap<>();
444         stateMap.put(obState.getKey().getLocalName(), obState);
445         stateMap.put(orState.getKey().getLocalName(), orState);
446         stateMap.put(decState.getKey().getLocalName(), decState);
447         stateMap.put(actState.getKey().getLocalName(), actState);
448
449         return stateMap;
450     }
451
452     /**
453      * Get a sample ECA policy model.
454      *
455      * @return the sample policy model
456      */
457     public AxPolicyModel getEcaPolicyModel() {
458
459         final AxTasks tasks = new AxTasks(new AxArtifactKey("Tasks", DEFAULT_VERSION));
460
461         final AxLogicReader logicReader = new PolicyLogicReader().setLogicPackage(PACKAGE)
462                         .setDefaultLogic("EvalTaskLogic");
463
464         final AxTask eTask = new AxTask(new AxArtifactKey("Task_Event_0", DEFAULT_VERSION));
465         eTask.duplicateInputFields(event0000.getParameterMap());
466         eTask.duplicateOutputFields(event0001.getParameterMap());
467         final AxTaskLogic eAxLogic = new AxTaskLogic(eTask.getKey(), TASK_LOGIC,
468                         (justOneLang == null ? JYTHON : justOneLang), logicReader);
469         eAxLogic.setLogic(eAxLogic.getLogic().replaceAll(STATE_NAME, EVENT)
470                         .replaceAll(TASK_NAME, eTask.getKey().getName()).replaceAll(STATE_NUMBER, "1"));
471         eTask.setTaskLogic(eAxLogic);
472
473         final AxTask cTask = new AxTask(new AxArtifactKey("Task_Condition_0", DEFAULT_VERSION));
474         cTask.duplicateInputFields(event0001.getParameterMap());
475         cTask.duplicateOutputFields(event0002.getParameterMap());
476         final AxTaskLogic cAxLogic = new AxTaskLogic(cTask.getKey(), TASK_LOGIC,
477                         (justOneLang == null ? JAVASCRIPT : justOneLang), logicReader);
478         cAxLogic.setLogic(cAxLogic.getLogic().replaceAll(STATE_NAME, CONDITION)
479                         .replaceAll(TASK_NAME, cTask.getKey().getName()).replaceAll(STATE_NUMBER, "2"));
480         cTask.setTaskLogic(cAxLogic);
481
482         final AxTask aTask = new AxTask(new AxArtifactKey("Task_Action_0", DEFAULT_VERSION));
483         aTask.duplicateInputFields(event0002.getParameterMap());
484         aTask.duplicateOutputFields(event0003.getParameterMap());
485         final AxTaskLogic aAxLogic = new AxTaskLogic(aTask.getKey(), TASK_LOGIC,
486                         (justOneLang == null ? "JAVA" : justOneLang), logicReader);
487         aAxLogic.setLogic(aAxLogic.getLogic().replaceAll(STATE_NAME, ACTION)
488                         .replaceAll(TASK_NAME, aTask.getKey().getName()).replaceAll(STATE_NUMBER, "3"));
489         aTask.setTaskLogic(aAxLogic);
490
491         tasks.getTaskMap().put(eTask.getKey(), eTask);
492         tasks.getTaskMap().put(cTask.getKey(), cTask);
493         tasks.getTaskMap().put(aTask.getKey(), aTask);
494
495         final Set<AxArtifactKey> eventTasks = new TreeSet<>();
496         final Set<AxArtifactKey> conditionTasks = new TreeSet<>();
497         final Set<AxArtifactKey> actionTasks = new TreeSet<>();
498
499         addEcaTasks(tasks, eventTasks, conditionTasks, actionTasks);
500         final List<Set<AxArtifactKey>> taskReferenceList = new ArrayList<>();
501         taskReferenceList.add(eventTasks);
502         taskReferenceList.add(conditionTasks);
503         taskReferenceList.add(actionTasks);
504
505         final List<AxArtifactKey> p0InEventList = new ArrayList<>();
506         p0InEventList.add(event0000.getKey());
507         p0InEventList.add(event0001.getKey());
508         p0InEventList.add(event0002.getKey());
509
510         final List<AxArtifactKey> p0OutEventList = new ArrayList<>();
511         p0OutEventList.add(event0001.getKey());
512         p0OutEventList.add(event0002.getKey());
513         p0OutEventList.add(event0003.getKey());
514
515         final List<AxArtifactKey> p0defaultTaskList = new ArrayList<>();
516         p0defaultTaskList.add(tasks.get("Task_Event_0").getKey());
517         p0defaultTaskList.add(tasks.get("Task_Condition_0").getKey());
518         p0defaultTaskList.add(tasks.get("Task_Action_0").getKey());
519
520         final AxPolicy policy0 = new AxPolicy(new AxArtifactKey("ECAPolicy_0", DEFAULT_VERSION));
521         final List<String> axLogicExecutorTypeList = Arrays.asList((justOneLang == null ? JAVASCRIPT : justOneLang),
522                         (justOneLang == null ? MVEL : justOneLang), (justOneLang == null ? JYTHON : justOneLang));
523         policy0.setStateMap(getEcaStateMap(policy0.getKey(), p0InEventList, p0OutEventList, axLogicExecutorTypeList,
524                         p0defaultTaskList, taskReferenceList));
525         policy0.setFirstState(policy0.getStateMap().get(EVENT).getKey().getLocalName());
526
527         final AxPolicies policies = new AxPolicies(new AxArtifactKey("ECAPolicies", DEFAULT_VERSION));
528         policies.getPolicyMap().put(policy0.getKey(), policy0);
529
530         final AxKeyInformation keyInformation = new AxKeyInformation(
531                         new AxArtifactKey("KeyInformation", DEFAULT_VERSION));
532         final AxPolicyModel policyModel = new AxPolicyModel(
533                         new AxArtifactKey("EvaluationPolicyModel_ECA", DEFAULT_VERSION));
534         policyModel.setPolicies(policies);
535         policyModel.setEvents(events);
536         policyModel.setTasks(tasks);
537         policyModel.setAlbums(new AxContextAlbums(new AxArtifactKey("Albums", DEFAULT_VERSION)));
538         policyModel.setSchemas(schemas);
539         policyModel.setKeyInformation(keyInformation);
540         policyModel.getKeyInformation().generateKeyInfo(policyModel);
541
542         final AxValidationResult result = policyModel.validate(new AxValidationResult());
543         if (!result.isOk()) {
544             throw new ApexRuntimeException("model " + policyModel.getId() + " is not valid" + result);
545         }
546         return policyModel;
547     }
548
549     /**
550      * Add ECA tasks.
551      * 
552      * @param tasks the tasks
553      * @param eventTasks event tasks
554      * @param conditionTasks condition tasks
555      * @param actionTasks action tasks
556      */
557     private void addEcaTasks(final AxTasks tasks, final Set<AxArtifactKey> eventTasks,
558                     final Set<AxArtifactKey> conditionTasks, final Set<AxArtifactKey> actionTasks) {
559         for (final AxTask task : tasks.getTaskMap().values()) {
560             if (task.getKey().getName().contains(EVENT)) {
561                 eventTasks.add(task.getKey());
562             }
563             if (task.getKey().getName().contains(CONDITION)) {
564                 conditionTasks.add(task.getKey());
565             }
566             if (task.getKey().getName().contains(ACTION)) {
567                 actionTasks.add(task.getKey());
568             }
569         }
570     }
571
572     /**
573      * Gets the ECA state map.
574      *
575      * @param policyKey the policy key
576      * @param inEventKeyList the in event key list
577      * @param outEventKeyList the out event key list
578      * @param axLogicExecutorTypeList the ax logic executor type list
579      * @param defaultTaskList the default task list
580      * @param taskKeySetList the task key set list
581      * @return the ECA state map
582      */
583     private Map<String, AxState> getEcaStateMap(final AxArtifactKey policyKey, final List<AxArtifactKey> inEventKeyList,
584                     final List<AxArtifactKey> outEventKeyList, final List<String> axLogicExecutorTypeList,
585                     final List<AxArtifactKey> defaultTaskList, final List<Set<AxArtifactKey>> taskKeySetList) {
586         final AxLogicReader logicReader = new PolicyLogicReader().setLogicPackage(PACKAGE)
587                         .setDefaultLogic("EvalStateLogic");
588
589         final AxState actionState = new AxState(new AxReferenceKey(policyKey, ACTION));
590         actionState.setTrigger(inEventKeyList.get(2));
591         final AxStateOutput action2Out = new AxStateOutput(actionState.getKey(), AxReferenceKey.getNullKey(),
592                         outEventKeyList.get(2));
593         actionState.getStateOutputs().put(action2Out.getKey().getLocalName(), action2Out);
594         actionState.setTaskSelectionLogic(new AxTaskSelectionLogic(actionState.getKey(), TASK_SELECTION_LOGIC,
595                         axLogicExecutorTypeList.get(2), logicReader));
596         actionState.setDefaultTask(defaultTaskList.get(2));
597         for (final AxArtifactKey taskKey : taskKeySetList.get(2)) {
598             actionState.getTaskReferences().put(taskKey,
599                             new AxStateTaskReference(new AxReferenceKey(actionState.getKey(), taskKey.getName()),
600                                             AxStateTaskOutputType.DIRECT, action2Out.getKey()));
601         }
602
603         final AxState conditionState = new AxState(new AxReferenceKey(policyKey, CONDITION));
604         conditionState.setTrigger(inEventKeyList.get(1));
605         final AxStateOutput condition2Action = new AxStateOutput(conditionState.getKey(), actionState.getKey(),
606                         outEventKeyList.get(1));
607         conditionState.getStateOutputs().put(condition2Action.getKey().getLocalName(), condition2Action);
608         conditionState.setTaskSelectionLogic(new AxTaskSelectionLogic(conditionState.getKey(), TASK_SELECTION_LOGIC,
609                         axLogicExecutorTypeList.get(1), logicReader));
610         conditionState.setDefaultTask(defaultTaskList.get(1));
611         for (final AxArtifactKey taskKey : taskKeySetList.get(1)) {
612             conditionState.getTaskReferences().put(taskKey,
613                             new AxStateTaskReference(new AxReferenceKey(conditionState.getKey(), taskKey.getName()),
614                                             AxStateTaskOutputType.DIRECT, condition2Action.getKey()));
615         }
616
617         final AxState eventState = new AxState(new AxReferenceKey(policyKey, EVENT));
618         eventState.setTrigger(inEventKeyList.get(0));
619         final AxStateOutput event2Condition = new AxStateOutput(eventState.getKey(), conditionState.getKey(),
620                         outEventKeyList.get(0));
621         eventState.getStateOutputs().put(event2Condition.getKey().getLocalName(), event2Condition);
622         eventState.setTaskSelectionLogic(new AxTaskSelectionLogic(eventState.getKey(), TASK_SELECTION_LOGIC,
623                         axLogicExecutorTypeList.get(0), logicReader));
624         eventState.setDefaultTask(defaultTaskList.get(0));
625         for (final AxArtifactKey taskKey : taskKeySetList.get(0)) {
626             eventState.getTaskReferences().put(taskKey,
627                             new AxStateTaskReference(new AxReferenceKey(eventState.getKey(), taskKey.getName()),
628                                             AxStateTaskOutputType.DIRECT, event2Condition.getKey()));
629         }
630
631         final Map<String, AxState> stateMap = new TreeMap<>();
632         stateMap.put(eventState.getKey().getLocalName(), eventState);
633         stateMap.put(conditionState.getKey().getLocalName(), conditionState);
634         stateMap.put(actionState.getKey().getLocalName(), actionState);
635
636         return stateMap;
637     }
638
639 }