460639b900af724c0bb5d24a436fc524e46473dc
[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.core.engine.executor.context;
22
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Set;
27 import java.util.TreeMap;
28
29 import org.onap.policy.apex.context.ContextAlbum;
30 import org.onap.policy.apex.context.ContextRuntimeException;
31 import org.onap.policy.apex.core.engine.context.ApexInternalContext;
32 import org.onap.policy.apex.core.engine.executor.Executor;
33 import org.onap.policy.apex.core.engine.executor.StateFinalizerExecutor;
34 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
35 import org.onap.policy.apex.model.basicmodel.concepts.AxConcept;
36 import org.onap.policy.apex.model.policymodel.concepts.AxState;
37 import org.slf4j.ext.XLogger;
38 import org.slf4j.ext.XLoggerFactory;
39
40 /**
41  * Container class for the execution context for state finalizer logic executions in a state being
42  * executed in an Apex engine. The state finalizer must have easy access to the state definition,
43  * the fields, as well as the policy, global, and external context.
44  *
45  * @author Sven van der Meer (sven.van.der.meer@ericsson.com)
46  */
47 public class StateFinalizerExecutionContext {
48     /**
49      * Logger for state finalizer execution, state finalizer logic can use this field to access and
50      * log to Apex logging.
51      */
52     private static final XLogger EXCEUTION_LOGGER =
53             XLoggerFactory.getXLogger("org.onap.policy.apex.executionlogging.StateFinalizerExecutionLogging");
54
55     // CHECKSTYLE:OFF: checkstyle:VisibilityModifier Logic has access to these field
56
57     /** A facade to the full state definition for the state finalizer logic being executed. */
58     public final AxStateFacade subject;
59
60     /** the execution ID for the current APEX policy execution instance. */
61     public final Long executionId;
62
63     /**
64      * The list of state outputs for this state finalizer. The purpose of a state finalizer is to
65      * select a state output for a state from this list of state output names.
66      */
67     public final Set<String> stateOutputNames;
68
69     /**
70      * The fields of this state finalizer. A state finalizer receives this list of fields from a
71      * task and may use these fields to determine what state output to select. Once a state
72      * finalizer has selected a state output, it must marshal these fields so that they match the
73      * fields required for the event defined in the state output.
74      */
75     public final Map<String, Object> fields;
76
77     // A message specified in the logic
78     private String message;
79
80     /**
81      * The state output that the state finalizer logic has selected for a state. The state finalizer
82      * logic sets this field in its logic after executing and the Apex engine uses this state output
83      * for this state.
84      */
85     private String selectedStateOutputName;
86
87     /**
88      * Logger for state finalizer execution, state finalizer logic can use this field to access and
89      * log to Apex logging.
90      */
91     public final XLogger logger = EXCEUTION_LOGGER;
92
93     // CHECKSTYLE:ON: checkstyle:visibilityModifier
94
95     // All available context albums
96     private final Map<String, ContextAlbum> context;
97
98     /**
99      * Instantiates a new state finalizer execution context.
100      *
101      * @param stateFinalizerExecutor the state finalizer executor that requires context
102      * @param executionId the execution ID for the current APEX policy execution instance
103      * @param axState the state definition that is the subject of execution
104      * @param fields the fields to be manipulated by the state finalizer
105      * @param stateOutputNames the state output names, one of which will be selected by the state
106      *        finalizer
107      * @param internalContext the execution context of the Apex engine in which the task is being
108      *        executed
109      */
110     public StateFinalizerExecutionContext(final StateFinalizerExecutor stateFinalizerExecutor, final long executionId,
111             final AxState axState, final Map<String, Object> fields, final Set<String> stateOutputNames,
112             final ApexInternalContext internalContext) {
113         subject = new AxStateFacade(axState);
114
115         // Execution ID is the current policy execution instance
116         this.executionId = executionId;
117
118         this.fields = fields;
119         this.stateOutputNames = stateOutputNames;
120
121         // Set up the context albums for this task
122         context = new TreeMap<>();
123         for (final AxArtifactKey mapKey : subject.state.getContextAlbumReferences()) {
124             context.put(mapKey.getName(), internalContext.getContextAlbums().get(mapKey));
125         }
126
127         // Get the artifact stack of the users of the policy
128         final List<AxConcept> usedArtifactStack = new ArrayList<>();
129         for (Executor<?, ?, ?, ?> parent = stateFinalizerExecutor.getParent(); parent != null; parent =
130                 parent.getParent()) {
131             // Add each parent to the top of the stack
132             usedArtifactStack.add(0, parent.getKey());
133         }
134
135         // Change the stack to an array
136         final AxConcept[] usedArtifactStackArray = usedArtifactStack.toArray(new AxConcept[usedArtifactStack.size()]);
137
138         // Set the user of the context
139         // Set the user of the context
140         for (final ContextAlbum contextAlbum : context.values()) {
141             contextAlbum.setUserArtifactStack(usedArtifactStackArray);
142         }
143     }
144
145     /**
146      * Return a context album if it exists in the context definition of this state.
147      *
148      * @param contextAlbumName The context album name
149      * @return The context album
150      * @throws ContextRuntimeException if the context album does not exist on the state for this
151      *         executor
152      */
153     public ContextAlbum getContextAlbum(final String contextAlbumName) {
154         // Find the context album
155         final ContextAlbum foundContextAlbum = context.get(contextAlbumName);
156
157         // Check if the context album exists
158         if (foundContextAlbum != null) {
159             return foundContextAlbum;
160         } else {
161             throw new ContextRuntimeException("cannot find definition of context album \"" + contextAlbumName
162                     + "\" on state \"" + subject.getId() + "\"");
163         }
164     }
165
166     /**
167      * Return the state output name selected by the state finalizer logic.
168      *
169      * @return the state output name
170      */
171     public String getSelectedStateOutputName() {
172         return selectedStateOutputName;
173     }
174
175     /**
176      * Set the state output name selected by the state finalizer logic.
177      *
178      * @param selectedStateOutputName the state output name
179      */
180     public void setSelectedStateOutputName(final String selectedStateOutputName) {
181         this.selectedStateOutputName = selectedStateOutputName;
182     }
183
184     /**
185      * Gets the user message.
186      *
187      * @return the user message
188      */
189     public String getMessage() {
190         return message;
191     }
192
193     /**
194      * Sets the user message.
195      *
196      * @param message the message
197      */
198     public void setMessage(final String message) {
199         this.message = message;
200     }
201 }