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