From 2b79f16651701fdfa04eb100bc83f2a42b8ed609 Mon Sep 17 00:00:00 2001 From: talio Date: Tue, 21 Nov 2017 10:00:27 +0200 Subject: fix NPE in extract fix NPE when extracting components without images / flavors Issue - Id : SDC-694 Change-Id: I3e4444132a40a2567833375ceea1951803dd16b0 Signed-off-by: talio --- .../composition/CompositionDataExtractorImpl.java | 46 +++++++----------- .../converter/ServiceTemplateReaderService.java | 2 +- .../openecomp/core/impl/ToscaConverterImpl.java | 18 ++----- .../openecomp/core/impl/ToscaConverterUtil.java | 55 +++++++++++++++++----- .../services/ServiceTemplateReaderServiceImpl.java | 5 +- 5 files changed, 68 insertions(+), 58 deletions(-) (limited to 'openecomp-be') diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java index 93b95240d1..19e48eceaa 100644 --- a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java +++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java @@ -324,43 +324,33 @@ public class CompositionDataExtractorImpl implements CompositionDataExtractor { private Map> getComponentImages(Map computeNodeTemplates, ToscaServiceModel toscaServiceModel) { - Map> computeImages = new HashMap<>(); - for (String component : computeNodeTemplates.keySet()) { - List images = new ArrayList<>(); - Map properties = computeNodeTemplates.get(component).getProperties(); - - List imagesList = properties.entrySet() - .stream() - .filter(map -> map.getKey().equals("image")) - .map(map -> map.getValue()) - .collect(Collectors.toList()); - for (Object obj : imagesList) { - if (obj instanceof String) { - images.add((String) obj); - } else { - Map objMap = new ObjectMapper().convertValue(obj,Map.class); - images.add(getInputs(toscaServiceModel,objMap.get("get_input"))); - } - } - computeImages.put(component,images); - } - return computeImages; + return getComponentProperty(ToscaConstants.COMPUTE_IMAGE, computeNodeTemplates, toscaServiceModel); } private Map> getComponentComputeFlavor(Map computeNodeTemplates, ToscaServiceModel toscaServiceModel) { - Map> componentComputeFlavor = new HashMap<>(); + return getComponentProperty(ToscaConstants.COMPUTE_FLAVOR, computeNodeTemplates, toscaServiceModel); + } + + private Map> getComponentProperty(String propertyName, + Map computeNodeTemplates, + ToscaServiceModel toscaServiceModel) { + Map> componentPropertyValues = new HashMap<>(); for (String component : computeNodeTemplates.keySet()) { List computes = new ArrayList<>(); Map properties = computeNodeTemplates.get(component).getProperties(); - List computessList = properties.entrySet() + if(MapUtils.isEmpty(properties)){ + continue; + } + + List computesList = properties.entrySet() .stream() - .filter(map -> map.getKey().equals("flavor")) - .map(map -> map.getValue()) + .filter(map -> map.getKey().equals(propertyName)) + .map(Map.Entry::getValue) .collect(Collectors.toList()); - for (Object obj : computessList) { + for (Object obj : computesList) { if (obj instanceof String) { computes.add((String) obj); } else { @@ -368,9 +358,9 @@ public class CompositionDataExtractorImpl implements CompositionDataExtractor { computes.add(getInputs(toscaServiceModel, objMap.get("get_input"))); } } - componentComputeFlavor.put(component,computes); + componentPropertyValues.put(component,computes); } - return componentComputeFlavor; + return componentPropertyValues; } private String getInputs(ToscaServiceModel toscaServiceModel, String inputValue) { diff --git a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-api/src/main/java/org/openecomp/core/converter/ServiceTemplateReaderService.java b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-api/src/main/java/org/openecomp/core/converter/ServiceTemplateReaderService.java index 09c823ce7e..1bc97b4d69 100644 --- a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-api/src/main/java/org/openecomp/core/converter/ServiceTemplateReaderService.java +++ b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-api/src/main/java/org/openecomp/core/converter/ServiceTemplateReaderService.java @@ -10,7 +10,7 @@ public interface ServiceTemplateReaderService { Object getToscaVersion(); - Object getNodeTypes(); + Map getNodeTypes(); Object getTopologyTemplate(); diff --git a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/ToscaConverterImpl.java b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/ToscaConverterImpl.java index f38b7e096a..e7ff3aa8ee 100644 --- a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/ToscaConverterImpl.java +++ b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/ToscaConverterImpl.java @@ -1,7 +1,6 @@ package org.openecomp.core.impl; import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; import org.openecomp.core.converter.ServiceTemplateReaderService; import org.openecomp.core.converter.ToscaConverter; import org.openecomp.core.converter.datatypes.Constants; @@ -284,26 +283,15 @@ public class ToscaConverterImpl implements ToscaConverter { entry.getKey(), entry.getValue(), ParameterDefinition.class); parameterDefinition.ifPresent(parameterDefinitionValue -> { - handleDefaultValue(entry.getValue(), parameterDefinition.get()); + Optional defaultValue = + ToscaConverterUtil.getDefaultValue(entry.getValue(), parameterDefinition.get()); + defaultValue.ifPresent(parameterDefinitionValue::set_default); addToServiceTemplateAccordingToSection( serviceTemplate, inputsOrOutputs, entry.getKey(), parameterDefinition.get()); } ); } } - private void handleDefaultValue(Object entryValue, - ParameterDefinition parameterDefinition) { - if(!(entryValue instanceof Map) - || Objects.isNull(parameterDefinition)){ - return; - } - - Object defaultValue = ((Map) entryValue).get("default"); - if(Objects.nonNull(defaultValue)) { - parameterDefinition.set_default(defaultValue); - } - } - private void addToServiceTemplateAccordingToSection(ServiceTemplate serviceTemplate, String inputsOrOutputs, String parameterId, diff --git a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/ToscaConverterUtil.java b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/ToscaConverterUtil.java index 4120c6994c..20ac6413e7 100644 --- a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/ToscaConverterUtil.java +++ b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/ToscaConverterUtil.java @@ -1,24 +1,33 @@ package org.openecomp.core.impl; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; -import org.codehaus.jackson.map.ObjectMapper; import org.openecomp.core.converter.errors.CreateToscaObjectErrorBuilder; -import org.openecomp.core.utilities.json.JsonUtil; import org.openecomp.sdc.common.errors.CoreException; -import org.openecomp.sdc.common.errors.ErrorCategory; -import org.openecomp.sdc.common.errors.ErrorCode; import java.lang.reflect.Field; +import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class ToscaConverterUtil { - private static final String set = "set"; + private static final String SET = "set"; + private static final String DEFAULT = "default"; + private static final String DEFAULT_CAPITAL = "Default"; + private static Set defaultValueKeys; + + static { + defaultValueKeys = + Stream.of(DEFAULT, DEFAULT_CAPITAL).collect(Collectors.toSet()); + } public static Optional createObjectFromClass(String objectId, - Object objectCandidate, - Class classToCreate) { + Object objectCandidate, + Class classToCreate) { try { return createObjectUsingSetters(objectCandidate, classToCreate); } catch (Exception e) { @@ -30,7 +39,8 @@ public class ToscaConverterUtil { private static Optional createObjectUsingSetters(Object objectCandidate, Class classToCreate) throws Exception { - if(!(objectCandidate instanceof Map)){ + if (Objects.isNull(objectCandidate) + || !(objectCandidate instanceof Map)) { return Optional.empty(); } @@ -38,18 +48,17 @@ public class ToscaConverterUtil { Field[] classFields = classToCreate.getDeclaredFields(); T result = classToCreate.newInstance(); - for(Field field : classFields){ + for (Field field : classFields) { Object fieldValueToAssign = objectAsMap.get(field.getName()); - String methodName = set + StringUtils.capitalize(field.getName()); + String methodName = SET + StringUtils.capitalize(field.getName()); - if(shouldSetterMethodNeedsToGetInvoked(classToCreate, field, fieldValueToAssign, methodName)){ + if(shouldSetterMethodNeedsToGetInvoked(classToCreate, field, fieldValueToAssign, methodName)) { classToCreate.getMethod(methodName, field.getType()).invoke(result, fieldValueToAssign); } } return Optional.of(result); } - private static boolean shouldSetterMethodNeedsToGetInvoked(Class classToCreate, Field field, Object fieldValueToAssign, @@ -62,4 +71,26 @@ public class ToscaConverterUtil { return false; } } + + public static Optional getDefaultValue(Object entryValue, + Object objectToAssignDefaultValue) { + if (!(entryValue instanceof Map) + || Objects.isNull(objectToAssignDefaultValue)) { + return Optional.empty(); + } + + return Optional.ofNullable(getDefaultParameterValue((Map) entryValue)); + } + + private static Object getDefaultParameterValue(Map entryValue) { + Object defaultValue = null; + Set keys = new HashSet<>(entryValue.keySet()); + keys.retainAll(defaultValueKeys); + + if (CollectionUtils.isNotEmpty(keys)) { + defaultValue = entryValue.get(keys.iterator().next()); + } + + return defaultValue; + } } diff --git a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/services/ServiceTemplateReaderServiceImpl.java b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/services/ServiceTemplateReaderServiceImpl.java index 8155fcc7f6..22780af343 100644 --- a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/services/ServiceTemplateReaderServiceImpl.java +++ b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/main/java/org/openecomp/core/impl/services/ServiceTemplateReaderServiceImpl.java @@ -37,8 +37,9 @@ public class ServiceTemplateReaderServiceImpl implements ServiceTemplateReaderSe } @Override - public Object getNodeTypes(){ - return this.readServiceTemplate.get(nodeTypes); + public Map getNodeTypes(){ + return Objects.isNull(this.readServiceTemplate.get(nodeTypes)) ? new HashMap<>() + :(Map) this.readServiceTemplate.get(nodeTypes); } @Override -- cgit 1.2.3-korg