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