2 * Copyright © 2017-2018 AT&T Intellectual Property.
\r
3 * Modifications Copyright © 2018 IBM.
\r
5 * Licensed under the Apache License, Version 2.0 (the "License");
\r
6 * you may not use this file except in compliance with the License.
\r
7 * You may obtain a copy of the License at
\r
9 * http://www.apache.org/licenses/LICENSE-2.0
\r
11 * Unless required by applicable law or agreed to in writing, software
\r
12 * distributed under the License is distributed on an "AS IS" BASIS,
\r
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
14 * See the License for the specific language governing permissions and
\r
15 * limitations under the License.
\r
18 package org.onap.ccsdk.features.model.utils;
\r
20 import java.util.Date;
\r
21 import java.util.HashSet;
\r
22 import java.util.List;
\r
23 import java.util.Map;
\r
24 import java.util.Set;
\r
25 import org.apache.commons.lang3.BooleanUtils;
\r
26 import org.apache.commons.lang3.StringUtils;
\r
27 import org.onap.ccsdk.features.model.ConfigModelConstant;
\r
28 import org.onap.ccsdk.features.model.ConfigModelException;
\r
29 import org.onap.ccsdk.features.model.ValidTypes;
\r
30 import org.onap.ccsdk.features.model.data.ResourceAssignment;
\r
31 import org.onap.ccsdk.features.model.data.dict.ResourceDefinition;
\r
33 import com.att.eelf.configuration.EELFLogger;
\r
34 import com.att.eelf.configuration.EELFManager;
\r
35 import com.fasterxml.jackson.databind.JsonNode;
\r
36 import com.fasterxml.jackson.databind.ObjectMapper;
\r
37 import com.fasterxml.jackson.databind.node.ArrayNode;
\r
38 import com.fasterxml.jackson.databind.node.NullNode;
\r
39 import com.fasterxml.jackson.databind.node.ObjectNode;
\r
40 import com.google.common.base.Preconditions;
\r
42 public class ResourceAssignmentUtils {
\r
44 private ResourceAssignmentUtils() {
\r
48 private static EELFLogger logger = EELFManager.getInstance().getLogger(ResourceAssignmentUtils.class);
\r
50 public static String getArtifactNodeContent(String nodeTemplateName, Map<String, Object> context) {
\r
51 Preconditions.checkArgument(StringUtils.isNotBlank(nodeTemplateName),
\r
52 "getArtifactNodeContent missing template name");
\r
53 return (String) context.get(ConfigModelConstant.PROPERTY_NODE_TEMPLATES_DOT + nodeTemplateName + ".content");
\r
56 public static List<ResourceAssignment> getArtifactNodeMapping(String nodeTemplateName,
\r
57 Map<String, Object> context) {
\r
58 Preconditions.checkArgument(StringUtils.isNotBlank(nodeTemplateName),
\r
59 "getArtifactNodeMapping missing template name");
\r
60 List<ResourceAssignment> resourceAssignments = null;
\r
61 String resourceMappingContent =
\r
62 (String) context.get(ConfigModelConstant.PROPERTY_NODE_TEMPLATES_DOT + nodeTemplateName + ".mapping");
\r
63 if (StringUtils.isNotBlank(resourceMappingContent)) {
\r
64 resourceAssignments = TransformationUtils.getListfromJson(resourceMappingContent, ResourceAssignment.class);
\r
67 logger.warn("missing mapping content for node template ({})", nodeTemplateName);
\r
69 return resourceAssignments;
\r
72 // Not used Any whre
\r
73 public static synchronized void cleanContextTemplateNDictionaryKeys(Map<String, Object> componentContext) {
\r
74 String recipeName = (String) componentContext.get(ConfigModelConstant.PROPERTY_ACTION_NAME);
\r
75 Set<String> removeSet = new HashSet<>();
\r
76 componentContext.forEach((key, value) -> {
\r
77 if (StringUtils.isNotBlank(key)
\r
78 && (key.startsWith(ConfigModelConstant.PROPERTY_DICTIONARY_KEY_DOT + recipeName + ".")
\r
79 || key.startsWith(ConfigModelConstant.PROPERTY_RECIPE_KEY_DOT + recipeName + "."))) {
\r
83 componentContext.keySet().removeAll(removeSet);
\r
86 public static synchronized Object getDictionaryKeyValue(Map<String, Object> componentContext,
\r
87 ResourceAssignment resourceMapping) {
\r
88 Object value = null;
\r
89 if (resourceMapping != null && componentContext != null) {
\r
90 String recipeName = (String) componentContext.get(ConfigModelConstant.PROPERTY_ACTION_NAME);
\r
91 String dictionaryKeyName = resourceMapping.getDictionaryName();
\r
92 value = componentContext
\r
93 .get(ConfigModelConstant.PROPERTY_DICTIONARY_KEY_DOT + recipeName + "." + dictionaryKeyName);
\r
98 public static synchronized Object getDictionaryKeyValue(Map<String, Object> componentContext,
\r
99 ResourceDefinition resourceDictionary) {
\r
100 Object value = null;
\r
101 if (resourceDictionary != null && componentContext != null) {
\r
102 String recipeName = (String) componentContext.get(ConfigModelConstant.PROPERTY_ACTION_NAME);
\r
103 String dictionaryKeyName = resourceDictionary.getName();
\r
104 value = componentContext
\r
105 .get(ConfigModelConstant.PROPERTY_DICTIONARY_KEY_DOT + recipeName + "." + dictionaryKeyName);
\r
110 public static synchronized Object getTemplateKeyValue(Map<String, Object> componentContext,
\r
111 ResourceAssignment resourceMapping) {
\r
112 Object value = null;
\r
113 if (resourceMapping != null && componentContext != null) {
\r
114 String recipeName = (String) componentContext.get(ConfigModelConstant.PROPERTY_ACTION_NAME);
\r
115 String templateKeyName = resourceMapping.getName();
\r
116 value = componentContext
\r
117 .get(ConfigModelConstant.PROPERTY_RECIPE_KEY_DOT + recipeName + "." + templateKeyName);
\r
122 public static synchronized void setResourceDataValue(Map<String, Object> componentContext,
\r
123 ResourceAssignment resourceAssignment, Object value) throws ConfigModelException {
\r
125 if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())
\r
126 && resourceAssignment.getProperty() != null) {
\r
128 String recipeName = (String) componentContext.get(ConfigModelConstant.PROPERTY_ACTION_NAME);
\r
129 String templateKeyName = resourceAssignment.getName();
\r
130 String dictionaryKeyName = resourceAssignment.getDictionaryName();
\r
132 if (StringUtils.isBlank(dictionaryKeyName)) {
\r
133 resourceAssignment.setDictionaryName(templateKeyName);
\r
134 dictionaryKeyName = templateKeyName;
\r
135 logger.warn("Missing dictionary key, setting with template key ({}) as dictionary key ({})",
\r
136 templateKeyName, dictionaryKeyName);
\r
138 String type = resourceAssignment.getProperty().getType();
\r
140 if (StringUtils.isNotBlank(type)) {
\r
141 Object convertedValue = convertResourceValue(type, value);
\r
143 componentContext.put(
\r
144 ConfigModelConstant.PROPERTY_DICTIONARY_KEY_DOT + recipeName + "." + dictionaryKeyName,
\r
146 componentContext.put(
\r
147 ConfigModelConstant.PROPERTY_RECIPE_KEY_DOT + recipeName + "." + templateKeyName,
\r
150 logger.trace("Setting Resource Value ({}) for Resource Name ({}) of type ({}) ", convertedValue,
\r
151 dictionaryKeyName, type);
\r
153 resourceAssignment.getProperty().setValue(convertedValue);
\r
154 resourceAssignment.setUpdatedDate(new Date());
\r
155 resourceAssignment.setUpdatedBy(ConfigModelConstant.USER_SYSTEM);
\r
156 resourceAssignment.setStatus(ConfigModelConstant.STATUS_SUCCESS);
\r
158 } catch (Exception e) {
\r
159 throw new ConfigModelException(String.format(
\r
160 "Failed in setting value for template key (%s) and dictionary key (%s) of type (%s) with error message (%s)",
\r
161 templateKeyName, dictionaryKeyName, type, e.getMessage()));
\r
164 throw new ConfigModelException(
\r
165 String.format("Failed in setting resource value for resource mapping (%s)", resourceAssignment));
\r
169 private static Object convertResourceValue(String type, Object value) {
\r
170 Object convertedValue = null;
\r
172 if (value == null || value instanceof NullNode) {
\r
173 logger.info("Returning {} value from convertResourceValue", value);
\r
177 if (ValidTypes.getPrimitivePropertType().contains(type)) {
\r
178 convertedValue = convertPrimitiveResourceValue(type, value);
\r
180 // Case where Resource is non-primitive type
\r
181 if (value instanceof JsonNode || value instanceof ObjectNode || value instanceof ArrayNode) {
\r
182 convertedValue = value;
\r
183 } else if (value instanceof String) {
\r
184 convertedValue = TransformationUtils.getJsonNodeForString((String) value);
\r
186 convertedValue = TransformationUtils.getJsonNodeForObject(value);
\r
189 return convertedValue;
\r
192 @SuppressWarnings("squid:S3776")
\r
193 private static Object convertPrimitiveResourceValue(String type, Object value) {
\r
194 Object convertedValue = value;
\r
196 if (value instanceof ArrayNode) {
\r
197 if (ValidTypes.DATA_TYPE_BOOLEAN.equalsIgnoreCase(type)) {
\r
198 convertedValue = ((ArrayNode) value).asBoolean();
\r
199 } else if (ValidTypes.DATA_TYPE_INTEGER.equalsIgnoreCase(type)) {
\r
200 convertedValue = ((ArrayNode) value).asInt();
\r
201 } else if (ValidTypes.DATA_TYPE_FLOAT.equalsIgnoreCase(type)) {
\r
202 convertedValue = Float.valueOf(((ArrayNode) value).toString());
\r
204 convertedValue = ((ArrayNode) value).toString();
\r
206 } else if (value instanceof JsonNode) {
\r
207 if (ValidTypes.DATA_TYPE_BOOLEAN.equalsIgnoreCase(type)) {
\r
208 convertedValue = ((JsonNode) value).asBoolean();
\r
209 } else if (ValidTypes.DATA_TYPE_INTEGER.equalsIgnoreCase(type)) {
\r
210 convertedValue = ((JsonNode) value).asInt();
\r
211 } else if (ValidTypes.DATA_TYPE_FLOAT.equalsIgnoreCase(type)) {
\r
212 convertedValue = Float.valueOf(((JsonNode) value).asText());
\r
214 convertedValue = ((JsonNode) value).asText();
\r
216 } else if (value instanceof String) {
\r
217 if (ValidTypes.DATA_TYPE_BOOLEAN.equalsIgnoreCase(type)) {
\r
218 convertedValue = Boolean.valueOf((String) value);
\r
219 } else if (ValidTypes.DATA_TYPE_INTEGER.equalsIgnoreCase(type)) {
\r
220 convertedValue = Integer.valueOf((String) value);
\r
221 } else if (ValidTypes.DATA_TYPE_FLOAT.equalsIgnoreCase(type)) {
\r
222 convertedValue = Float.valueOf((String) value);
\r
225 logger.info("Returning value ({}) from convertPrimitiveResourceValue", convertedValue);
\r
226 return convertedValue;
\r
229 @SuppressWarnings("squid:S1172")
\r
230 public static synchronized void setFailedResourceDataValue(Map<String, Object> componentContext,
\r
231 ResourceAssignment resourceAssignment, String message) {
\r
232 setFailedResourceDataValue(resourceAssignment, message);
\r
235 public static synchronized void setFailedResourceDataValue(ResourceAssignment resourceAssignment, String message) {
\r
236 if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())
\r
237 && resourceAssignment.getProperty() != null) {
\r
238 resourceAssignment.setUpdatedDate(new Date());
\r
239 resourceAssignment.setStatus(ConfigModelConstant.STATUS_FAILURE);
\r
240 resourceAssignment.setUpdatedBy(ConfigModelConstant.USER_SYSTEM);
\r
241 resourceAssignment.setMessage(message);
\r
245 public static synchronized void assertTemplateKeyValueNotNull(Map<String, Object> componentContext,
\r
246 ResourceAssignment resourceAssignment) throws ConfigModelException {
\r
247 if (resourceAssignment != null && resourceAssignment.getProperty() != null
\r
248 && BooleanUtils.isTrue(resourceAssignment.getProperty().getRequired())
\r
249 && getTemplateKeyValue(componentContext, resourceAssignment) == null) {
\r
250 logger.error("failed to populate mandatory resource mapping ({})", resourceAssignment);
\r
251 throw new ConfigModelException(
\r
252 String.format("failed to populate mandatory resource mapping (%s)", resourceAssignment));
\r
256 @SuppressWarnings({"squid:S3776", "squid:S1141"})
\r
257 public static synchronized String generateResourceDataForAssignments(List<ResourceAssignment> assignments)
\r
258 throws ConfigModelException {
\r
259 String result = "{}";
\r
261 ObjectMapper mapper = new ObjectMapper();
\r
262 JsonNode root = mapper.readTree(result);
\r
263 for (ResourceAssignment resourceMapping : assignments) {
\r
264 if (resourceMapping != null && resourceMapping.getName() != null
\r
265 && resourceMapping.getProperty() != null) {
\r
267 String type = resourceMapping.getProperty().getType();
\r
268 Object value = resourceMapping.getProperty().getValue();
\r
269 logger.info("Generating Resource name ({}), type ({}), value ({})", resourceMapping.getName(), type,
\r
271 if (value == null) {
\r
272 ((ObjectNode) root).set(resourceMapping.getName(), null);
\r
273 } else if (value instanceof JsonNode) {
\r
274 ((ObjectNode) root).put(resourceMapping.getName(), (JsonNode) value);
\r
275 } else if (ValidTypes.DATA_TYPE_STRING.equalsIgnoreCase(type)) {
\r
276 ((ObjectNode) root).put(resourceMapping.getName(), (String) value);
\r
277 } else if (ValidTypes.DATA_TYPE_BOOLEAN.equalsIgnoreCase(type)) {
\r
278 ((ObjectNode) root).put(resourceMapping.getName(), (Boolean) value);
\r
279 } else if (ValidTypes.DATA_TYPE_INTEGER.equalsIgnoreCase(type)) {
\r
280 ((ObjectNode) root).put(resourceMapping.getName(), (Integer) value);
\r
281 } else if (ValidTypes.DATA_TYPE_FLOAT.equalsIgnoreCase(type)) {
\r
282 ((ObjectNode) root).put(resourceMapping.getName(), (Float) value);
\r
283 } else if (ValidTypes.DATA_TYPE_TIMESTAMP.equalsIgnoreCase(type)) {
\r
284 ((ObjectNode) root).put(resourceMapping.getName(), (String) value);
\r
286 JsonNode jsonNode = TransformationUtils.getJsonNodeForObject(value);
\r
287 if (jsonNode != null) {
\r
288 ((ObjectNode) root).put(resourceMapping.getName(), jsonNode);
\r
290 ((ObjectNode) root).set(resourceMapping.getName(), null);
\r
295 result = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root);
\r
296 logger.info("Generated Resource Param Data ({})", result);
\r
297 } catch (Exception e) {
\r
298 throw new ConfigModelException(e.getMessage(), e);
\r