e1f84e45e4a331d2d00602e9ad5d7c37076b463e
[policy/apex-pdp.git] / auth / cli-codegen / src / test / java / org / onap / policy / apex / auth / clicodegen / CodeGeneratorCliEditorTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2019 Samsung Electronics Co., Ltd.
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.auth.clicodegen;
23
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.fail;
26
27 import java.io.File;
28 import java.io.FileInputStream;
29 import java.io.FileNotFoundException;
30 import java.io.FileWriter;
31 import java.io.IOException;
32 import java.util.ArrayList;
33 import java.util.Collection;
34 import java.util.Collections;
35 import java.util.List;
36 import java.util.Map;
37 import java.util.Map.Entry;
38
39 import org.junit.Test;
40 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
41 import org.onap.policy.apex.model.basicmodel.concepts.AxReferenceKey;
42 import org.onap.policy.apex.model.basicmodel.handling.ApexModelException;
43 import org.onap.policy.apex.model.basicmodel.handling.ApexModelReader;
44 import org.onap.policy.apex.model.contextmodel.concepts.AxContextAlbum;
45 import org.onap.policy.apex.model.contextmodel.concepts.AxContextSchema;
46 import org.onap.policy.apex.model.eventmodel.concepts.AxEvent;
47 import org.onap.policy.apex.model.eventmodel.concepts.AxField;
48 import org.onap.policy.apex.model.policymodel.concepts.AxPolicy;
49 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
50 import org.onap.policy.apex.model.policymodel.concepts.AxState;
51 import org.onap.policy.apex.model.policymodel.concepts.AxStateFinalizerLogic;
52 import org.onap.policy.apex.model.policymodel.concepts.AxStateOutput;
53 import org.onap.policy.apex.model.policymodel.concepts.AxStateTaskReference;
54 import org.onap.policy.apex.model.policymodel.concepts.AxTask;
55 import org.onap.policy.apex.model.policymodel.concepts.AxTaskLogic;
56 import org.onap.policy.apex.model.policymodel.concepts.AxTaskParameter;
57 import org.onap.policy.apex.model.policymodel.concepts.AxTaskSelectionLogic;
58 import org.stringtemplate.v4.ST;
59
60 /**
61  * Test CLI code generation.
62  */
63 public class CodeGeneratorCliEditorTest {
64
65     private SupportKeyInfoGetter kig;
66     private File outFile = null;
67
68     @Test
69     public void test() throws IOException {
70         final CodeGeneratorCliEditor codeGen = new CodeGeneratorCliEditor();
71
72         outFile = File.createTempFile("ApexTestGenerated", ".apex");
73
74         ApexModelReader<AxPolicyModel> modelReader = null;
75         try {
76             modelReader = new ApexModelReader<>(AxPolicyModel.class);
77         } catch (ApexModelException e1) {
78             fail("test should not throw an exception");
79         }
80         modelReader.setValidateFlag(false);
81         AxPolicyModel apexPolicyModel = null;
82         try {
83             apexPolicyModel = modelReader
84                             .read(new FileInputStream(new File("src/test/resources/models/TestPolicyModel.json")));
85         } catch (ApexModelException | FileNotFoundException e) {
86             fail("test should not throw an exception");
87         }
88
89         assertEquals(0, generateCli(codeGen, apexPolicyModel));
90     }
91
92     /**
93      * Generate the CLI from the model.
94      * 
95      * @param codeGen the code generator
96      * @param policyModel the policy model
97      * @throws IOException  on generation exceptions
98      */
99     private int generateCli(final CodeGeneratorCliEditor codeGen, final AxPolicyModel policyModel) throws IOException {
100         kig = new SupportKeyInfoGetter(policyModel);
101
102         // Order is important. 0: model, 1: context schemas, 2: tasks, 3: events, 4: ContextAlbums, 5: Policies
103         // 0: model
104         final AxArtifactKey pmkey = policyModel.getKey();
105         codeGen.addModelParams(kig.getName(pmkey), kig.getVersion(pmkey), kig.getUuid(pmkey), kig.getDesc(pmkey));
106
107         // 1: Context Schemas
108         for (final AxContextSchema s : policyModel.getSchemas().getSchemasMap().values()) {
109             final AxArtifactKey key = s.getKey();
110
111             codeGen.addSchemaDeclaration(kig.getName(key), kig.getVersion(key), kig.getUuid(key), kig.getDesc(key),
112                             s.getSchemaFlavour(), s.getSchema());
113         }
114
115         // 2: tasks
116         for (final AxTask t : policyModel.getTasks().getTaskMap().values()) {
117             final AxArtifactKey key = t.getKey();
118             final List<ST> infields = getInfieldsForTask(codeGen, t);
119             final List<ST> outfields = getOutfieldsForTask(codeGen, t);
120             final ST logic = getLogicForTask(codeGen, t);
121             final List<ST> parameters = getParametersForTask(codeGen, t);
122             final List<ST> contextRefs = getCtxtRefsForTask(codeGen, t);
123
124             codeGen.addTaskDeclaration(
125                     new TaskDeclarationBuilder().setName(kig.getName(key)).setVersion(kig.getVersion(key))
126                             .setUuid(kig.getUuid(key)).setDescription(kig.getDesc(key)).setInfields(infields)
127                             .setOutfields(outfields).setLogic(logic).setParameters(parameters)
128                             .setContextRefs(contextRefs));
129         }
130
131         // 3: events
132         for (final AxEvent e : policyModel.getEvents().getEventMap().values()) {
133             final AxArtifactKey key = e.getKey();
134             final List<ST> fields = getParametersForEvent(codeGen, e);
135
136             codeGen.addEventDeclaration(
137                     new EventDeclarationBuilder()
138                             .setName(kig.getName(key))
139                             .setVersion(kig.getVersion(key))
140                             .setUuid(kig.getUuid(key))
141                             .setDescription(kig.getDesc(key))
142                             .setNameSpace(e.getNameSpace())
143                             .setSource(e.getSource())
144                             .setTarget(e.getTarget())
145                             .setFields(fields));
146         }
147
148         // 4: context albums
149         for (final AxContextAlbum a : policyModel.getAlbums().getAlbumsMap().values()) {
150             final AxArtifactKey key = a.getKey();
151
152             codeGen.addContextAlbumDeclaration(
153                     new CodeGenCliEditorBuilder()
154                             .setName(kig.getName(key))
155                             .setVersion(kig.getVersion(key))
156                             .setUuid(kig.getUuid(key))
157                             .setDescription(kig.getDesc(key))
158                             .setScope(a.getScope())
159                             .setWritable(a.isWritable())
160                             .setSchemaName(kig.getName(a.getItemSchema()))
161                             .setSchemaVersion(kig.getVersion(a.getItemSchema())));
162         }
163
164         // 5: policies
165         for (final AxPolicy p : policyModel.getPolicies().getPolicyMap().values()) {
166             final AxArtifactKey key = p.getKey();
167             final List<ST> states = getStatesForPolicy(codeGen, p);
168             codeGen.addPolicyDefinition(kig.getName(key), kig.getVersion(key), kig.getUuid(key), kig.getDesc(key),
169                             p.getTemplate(), p.getFirstState(), states);
170         }
171
172         final String out = codeGen.getModel().render();
173
174         FileWriter outFileWriter = new FileWriter(outFile);
175         outFileWriter.write(out);
176         outFileWriter.close();
177
178         return 0;
179     }
180
181     /**
182      * Gets the parameters for event.
183      *
184      * @param cg the code generator
185      * @param event the event
186      * @return the parameters for event
187      */
188     private List<ST> getParametersForEvent(final CodeGeneratorCliEditor cg, final AxEvent event) {
189         final Collection<AxField> fields = event.getFields();
190         final List<ST> ret = new ArrayList<>(fields.size());
191         for (final AxField f : fields) {
192             final AxReferenceKey fkey = f.getKey();
193
194             final ST val = cg.createEventFieldDefinition(kig.getPName(fkey), kig.getPVersion(fkey), kig.getLName(fkey),
195                             kig.getName(f.getSchema()), kig.getVersion(f.getSchema()), f.getOptional());
196
197             ret.add(val);
198         }
199         return ret;
200     }
201
202     /**
203      * Gets the context references for task.
204      *
205      * @param cg the code generator
206      * @param task the task
207      * @return the context references for task
208      */
209     private List<ST> getCtxtRefsForTask(final CodeGeneratorCliEditor cg, final AxTask task) {
210         final Collection<AxArtifactKey> ctxs = task.getContextAlbumReferences();
211         final List<ST> ret = new ArrayList<>(ctxs.size());
212         final AxArtifactKey tkey = task.getKey();
213         for (final AxArtifactKey ckey : ctxs) {
214
215             final ST val = cg.createTaskDefinitionContextRef(kig.getName(tkey), kig.getVersion(tkey), kig.getName(ckey),
216                             kig.getVersion(ckey));
217
218             ret.add(val);
219         }
220         return ret;
221     }
222
223     /**
224      * Gets the parameters for task.
225      *
226      * @param cg the code generator
227      * @param task the task
228      * @return the parameters for task
229      */
230     private List<ST> getParametersForTask(final CodeGeneratorCliEditor cg, final AxTask task) {
231         final Collection<AxTaskParameter> pars = task.getTaskParameters().values();
232         final List<ST> ret = new ArrayList<>(pars.size());
233         for (final AxTaskParameter p : pars) {
234             final AxReferenceKey pkey = p.getKey();
235
236             final ST val = cg.createTaskDefinitionParameters(kig.getPName(pkey), kig.getPVersion(pkey),
237                             kig.getLName(pkey), p.getTaskParameterValue());
238
239             ret.add(val);
240         }
241         return ret;
242     }
243
244     /**
245      * Gets the logic for task.
246      *
247      * @param cg the code generator
248      * @param task the task
249      * @return the logic for task
250      */
251     private ST getLogicForTask(final CodeGeneratorCliEditor cg, final AxTask task) {
252         final AxArtifactKey tkey = task.getKey();
253         final AxTaskLogic tl = task.getTaskLogic();
254
255         return cg.createTaskDefLogic(kig.getName(tkey), kig.getVersion(tkey), tl.getLogicFlavour(), tl.getLogic());
256     }
257
258     /**
259      * Gets the output fields for task.
260      *
261      * @param cg the code generator
262      * @param task the task
263      * @return the output fields for task
264      */
265     private List<ST> getOutfieldsForTask(final CodeGeneratorCliEditor cg, final AxTask task) {
266         final Collection<? extends AxField> fields = task.getOutputFields().values();
267         final List<ST> ret = new ArrayList<>(fields.size());
268         for (final AxField f : fields) {
269             final AxReferenceKey fkey = f.getKey();
270
271             final ST val = cg.createTaskDefinitionOutfields(kig.getPName(fkey), kig.getPVersion(fkey),
272                             kig.getLName(fkey), kig.getName(f.getSchema()), kig.getVersion(f.getSchema()));
273
274             ret.add(val);
275         }
276         return ret;
277     }
278
279     /**
280      * Gets the input fields for task.
281      *
282      * @param cg the code generator
283      * @param task the task
284      * @return the input fields for task
285      */
286     private List<ST> getInfieldsForTask(final CodeGeneratorCliEditor cg, final AxTask task) {
287         final Collection<? extends AxField> fields = task.getInputFields().values();
288         final List<ST> ret = new ArrayList<>(fields.size());
289         for (final AxField f : fields) {
290             final AxReferenceKey fkey = f.getKey();
291
292             final ST val = cg.createTaskDefinitionInfields(kig.getPName(fkey), kig.getPVersion(fkey),
293                             kig.getLName(fkey), kig.getName(f.getSchema()), kig.getVersion(f.getSchema()));
294
295             ret.add(val);
296         }
297         return ret;
298     }
299
300     /**
301      * Gets the states for policy.
302      *
303      * @param cg the code generator
304      * @param pol the policy
305      * @return the states for policy
306      */
307     private List<ST> getStatesForPolicy(final CodeGeneratorCliEditor cg, final AxPolicy pol) {
308         final Collection<AxState> states = pol.getStateMap().values();
309         final List<ST> ret = new ArrayList<>(states.size());
310         for (final AxState st : states) {
311             final AxReferenceKey skey = st.getKey();
312             final List<ST> outputs = getStateOutputsForState(cg, st);
313             final List<ST> finalizerLogics = getFinalizersForState(cg, st);
314             final List<ST> tasks = getTaskRefsForState(cg, st);
315             final List<ST> tsLogic = getTslForState(cg, st);
316             final List<ST> ctxRefs = getCtxtRefsForState(cg, st);
317
318             final ST val = cg.createPolicyStateDef(new PolicyStateDefBuilder()
319                     .setPolicyName(kig.getPName(skey)).setVersion(kig.getPVersion(skey))
320                     .setStateName(kig.getLName(skey)).setTriggerName(kig.getName(st.getTrigger()))
321                     .setTriggerVersion(kig.getVersion(st.getTrigger()))
322                     .setDefaultTask(kig.getName(st.getDefaultTask()))
323                     .setDefaultTaskVersion(kig.getVersion(st.getDefaultTask())).setOutputs(outputs)
324                     .setTasks(tasks).setTsLogic(tsLogic).setFinalizerLogics(finalizerLogics)
325                     .setCtxRefs(ctxRefs));
326
327             ret.add(val);
328         }
329         return ret;
330     }
331
332     /**
333      * Gets the finalizers for state.
334      *
335      * @param cg the code generator
336      * @param st the state
337      * @return the finalizers for state
338      */
339     private List<ST> getFinalizersForState(final CodeGeneratorCliEditor cg, final AxState st) {
340         final Collection<AxStateFinalizerLogic> fins = st.getStateFinalizerLogicMap().values();
341         final List<ST> ret = new ArrayList<>(fins.size());
342         final AxReferenceKey skey = st.getKey();
343         for (final AxStateFinalizerLogic fin : fins) {
344             final AxReferenceKey finkey = fin.getKey();
345
346             final ST val = cg.createPolicyStateDefFinalizerLogic(kig.getPName(skey), kig.getPVersion(skey),
347                             kig.getLName(skey), kig.getLName(finkey), fin.getLogicFlavour(), fin.getLogic());
348
349             ret.add(val);
350         }
351         return ret;
352     }
353
354     /**
355      * Gets the context references for state.
356      *
357      * @param cg the code generator
358      * @param st the state
359      * @return the context references for state
360      */
361     private List<ST> getCtxtRefsForState(final CodeGeneratorCliEditor cg, final AxState st) {
362         final Collection<AxArtifactKey> ctxs = st.getContextAlbumReferences();
363         final List<ST> ret = new ArrayList<>(ctxs.size());
364         final AxReferenceKey skey = st.getKey();
365         for (final AxArtifactKey ctx : ctxs) {
366
367             final ST val = cg.createPolicyStateDefContextRef(kig.getPName(skey), kig.getPVersion(skey),
368                             kig.getLName(skey), kig.getName(ctx), kig.getVersion(ctx));
369
370             ret.add(val);
371         }
372         return ret;
373     }
374
375     /**
376      * Gets the Task Selection Logic for state.
377      *
378      * @param cg the code generator
379      * @param st the state
380      * @return the TSL for state (if any) in a list
381      */
382     private List<ST> getTslForState(final CodeGeneratorCliEditor cg, final AxState st) {
383         final AxReferenceKey skey = st.getKey();
384         if (st.checkSetTaskSelectionLogic()) {
385             final AxTaskSelectionLogic tsl = st.getTaskSelectionLogic();
386             final ST val = cg.createPolicyStateDefTaskSelLogic(kig.getPName(skey), kig.getPVersion(skey),
387                             kig.getLName(skey), tsl.getLogicFlavour(), tsl.getLogic());
388             return Collections.singletonList(val);
389         } else {
390             return Collections.emptyList();
391         }
392     }
393
394     /**
395      * Gets the task references for state.
396      *
397      * @param cg the code generator
398      * @param st the state
399      * @return the task references for state
400      */
401     private List<ST> getTaskRefsForState(final CodeGeneratorCliEditor cg, final AxState st) {
402         final Map<AxArtifactKey, AxStateTaskReference> taskrefs = st.getTaskReferences();
403         final List<ST> ret = new ArrayList<>(taskrefs.size());
404         final AxReferenceKey skey = st.getKey();
405         for (final Entry<AxArtifactKey, AxStateTaskReference> e : taskrefs.entrySet()) {
406             final AxArtifactKey tkey = e.getKey();
407             final AxStateTaskReference tr = e.getValue();
408             final AxReferenceKey trkey = tr.getKey();
409
410             final ST val = cg.createPolicyStateTask(new PolicyStateTaskBuilder()
411                     .setPolicyName(kig.getPName(skey)).setVersion(kig.getPVersion(skey))
412                     .setStateName(kig.getLName(skey)).setTaskLocalName(kig.getLName(trkey))
413                     .setTaskName(kig.getName(tkey)).setTaskVersion(kig.getVersion(tkey))
414                     .setOutputType(tr.getStateTaskOutputType().name())
415                     .setOutputName(kig.getLName(tr.getOutput())));
416
417             ret.add(val);
418         }
419         return ret;
420     }
421
422     /**
423      * Gets the state outputs for state.
424      *
425      * @param cg the code generator
426      * @param st the state
427      * @return the state outputs for state
428      */
429     private List<ST> getStateOutputsForState(final CodeGeneratorCliEditor cg, final AxState st) {
430         final Collection<AxStateOutput> outs = st.getStateOutputs().values();
431         final List<ST> ret = new ArrayList<>(outs.size());
432         final AxReferenceKey skey = st.getKey();
433         for (final AxStateOutput out : outs) {
434             final AxReferenceKey outkey = out.getKey();
435
436             final ST val = cg.createPolicyStateOutput(kig.getPName(skey), kig.getPVersion(skey), kig.getLName(skey),
437                             kig.getLName(outkey), kig.getName(out.getOutgingEvent()),
438                             kig.getVersion(out.getOutgingEvent()), kig.getLName(out.getNextState()));
439
440             ret.add(val);
441         }
442         return ret;
443     }
444
445 }