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