Fix potential NPE in importing property constraints 17/131817/5
authorvasraz <vasyl.razinkov@est.tech>
Wed, 26 Oct 2022 08:34:53 +0000 (09:34 +0100)
committerMichael Morris <michael.morris@est.tech>
Thu, 27 Oct 2022 12:00:51 +0000 (12:00 +0000)
Fix potential NPE introduced by https://gerrit.onap.org/r/c/sdc/+/131472

Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Change-Id: I10a6f40e5a36c7a1eb33ed6a24ad3a2356672a64
Issue-ID: SDC-4231

catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/PropertyOperation.java

index d797d8a..1068e31 100644 (file)
@@ -77,6 +77,7 @@ import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.PropertyRule;
 import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
+import org.openecomp.sdc.be.datatypes.enums.ConstraintType;
 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
@@ -88,7 +89,6 @@ import org.openecomp.sdc.be.model.operations.api.DerivedFromOperation;
 import org.openecomp.sdc.be.model.operations.api.IPropertyOperation;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
-import org.openecomp.sdc.be.datatypes.enums.ConstraintType;
 import org.openecomp.sdc.be.model.tosca.constraints.EqualConstraint;
 import org.openecomp.sdc.be.model.tosca.constraints.GreaterOrEqualConstraint;
 import org.openecomp.sdc.be.model.tosca.constraints.GreaterThanConstraint;
@@ -843,7 +843,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
         }
         return true;
     }
-    
+
     public boolean isPropertyTypeValid(final IComplexDefaultValue property, final Map<String, DataTypeDefinition> dataTypes) {
         if (property == null) {
             return false;
@@ -1154,25 +1154,27 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
         }
         DataTypeData resultCTD = createDataTypeResult.left().value();
         List<PropertyDefinition> properties = dataTypeDefinition.getProperties();
-        Either<Map<String, PropertyData>, JanusGraphOperationStatus> addPropertiesToDataType = addPropertiesToDataType(resultCTD.getUniqueId(), dataTypeDefinition.getModel(),
+        Either<Map<String, PropertyData>, JanusGraphOperationStatus> addPropertiesToDataType = addPropertiesToDataType(resultCTD.getUniqueId(),
+            dataTypeDefinition.getModel(),
             properties);
         if (addPropertiesToDataType.isRight()) {
             log.debug("Failed add properties {} to data type {}", properties, dataTypeDefinition.getName());
             return Either.right(addPropertiesToDataType.right().value());
         }
-        
+
         final Either<GraphRelation, JanusGraphOperationStatus> modelRelationship = addDataTypeToModel(dataTypeDefinition);
         if (modelRelationship.isRight()) {
             return Either.right(modelRelationship.right().value());
-        }        
-        
+        }
+
         String derivedFrom = dataTypeDefinition.getDerivedFromName();
         if (derivedFrom != null) {
-            final Either<DataTypeDefinition, JanusGraphOperationStatus> derivedFromDataType = getDataTypeByNameValidForModel(derivedFrom, dataTypeDefinition.getModel());
+            final Either<DataTypeDefinition, JanusGraphOperationStatus> derivedFromDataType = getDataTypeByNameValidForModel(derivedFrom,
+                dataTypeDefinition.getModel());
             if (derivedFromDataType.isRight()) {
                 return Either.right(derivedFromDataType.right().value());
             }
-            
+
             log.debug("Before creating relation between data type {} to its parent {}", dtUniqueId, derivedFrom);
             UniqueIdData from = new UniqueIdData(NodeTypeEnum.DataType, dtUniqueId);
             final String deriveFromUid = derivedFromDataType.left().value().getUniqueId();
@@ -1186,17 +1188,17 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
         }
         return Either.left(createDataTypeResult.left().value());
     }
-    
+
     private Either<GraphRelation, JanusGraphOperationStatus> addDataTypeToModel(final DataTypeDefinition dataTypeDefinition) {
-      final String model = dataTypeDefinition.getModel();
-      if (model == null) {
-          return Either.left(null);
-      }
-      final GraphNode from = new UniqueIdData(NodeTypeEnum.Model, UniqueIdBuilder.buildModelUid(model));
-      final GraphNode to = new UniqueIdData(NodeTypeEnum.DataType, dataTypeDefinition.getUniqueId());
-      log.info("Connecting model {} to type {}", from, to);
-      return janusGraphGenericDao.createRelation(from , to, GraphEdgeLabels.MODEL_ELEMENT, Collections.emptyMap());
-  }
+        final String model = dataTypeDefinition.getModel();
+        if (model == null) {
+            return Either.left(null);
+        }
+        final GraphNode from = new UniqueIdData(NodeTypeEnum.Model, UniqueIdBuilder.buildModelUid(model));
+        final GraphNode to = new UniqueIdData(NodeTypeEnum.DataType, dataTypeDefinition.getUniqueId());
+        log.info("Connecting model {} to type {}", from, to);
+        return janusGraphGenericDao.createRelation(from, to, GraphEdgeLabels.MODEL_ELEMENT, Collections.emptyMap());
+    }
 
     private DataTypeData buildDataTypeData(DataTypeDefinition dataTypeDefinition, String ctUniqueId) {
         DataTypeData dataTypeData = new DataTypeData(dataTypeDefinition);
@@ -1265,7 +1267,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
         }
         return Either.left(propertiesData);
     }
-    
+
     public Either<DataTypeDefinition, JanusGraphOperationStatus> getDataTypeByNameValidForModel(final String name, final String modelName) {
         final Either<DataTypeData, JanusGraphOperationStatus> dataTypesRes = janusGraphGenericDao
             .getNode(GraphPropertiesDictionary.NAME.getProperty(), name, DataTypeData.class, modelName);
@@ -1282,13 +1284,15 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
             return Either.right(propertiesStatus);
         }
         final Either<ImmutablePair<DataTypeData, GraphEdge>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
-            .getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.DataType), dataTypeDefinition.getUniqueId(), GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.DataType,
-              DataTypeData.class);
+            .getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.DataType), dataTypeDefinition.getUniqueId(), GraphEdgeLabels.DERIVED_FROM,
+                NodeTypeEnum.DataType,
+                DataTypeData.class);
         log.debug(AFTER_RETRIEVING_DERIVED_FROM_NODE_OF_STATUS_IS, dataTypeDefinition.getUniqueId(), parentNode);
         if (parentNode.isRight()) {
             final JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
             if (janusGraphOperationStatus != JanusGraphOperationStatus.NOT_FOUND) {
-                log.error(BUSINESS_PROCESS_ERROR, "Failed to find the parent data type of data type {}. status is {}", dataTypeDefinition.getUniqueId(), janusGraphOperationStatus);
+                log.error(BUSINESS_PROCESS_ERROR, "Failed to find the parent data type of data type {}. status is {}",
+                    dataTypeDefinition.getUniqueId(), janusGraphOperationStatus);
                 return Either.right(janusGraphOperationStatus);
             }
         } else {
@@ -1303,7 +1307,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
             dataTypeDefinition.setDerivedFrom(parentDataTypeDefinition);
         }
         return Either.left(dataTypeDefinition);
-  }
+    }
 
     /**
      * Build Data type object from graph by unique id
@@ -1417,7 +1421,8 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
     }
 
     @Override
-    public Either<DataTypeDefinition, StorageOperationStatus> getDataTypeByName(final String name, final String validForModel, final boolean inTransaction) {
+    public Either<DataTypeDefinition, StorageOperationStatus> getDataTypeByName(final String name, final String validForModel,
+                                                                                final boolean inTransaction) {
         Either<DataTypeDefinition, StorageOperationStatus> result = null;
         try {
             Either<DataTypeDefinition, JanusGraphOperationStatus> ctResult = this.getDataTypeByNameValidForModel(name, validForModel);
@@ -1448,7 +1453,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
     public Either<DataTypeDefinition, StorageOperationStatus> getDataTypeByName(final String name, final String validForModel) {
         return getDataTypeByName(name, validForModel, true);
     }
-    
+
     public Either<DataTypeDefinition, StorageOperationStatus> getDataTypeByUidWithoutDerived(String uid, boolean inTransaction) {
         Either<DataTypeDefinition, StorageOperationStatus> result = null;
         try {
@@ -1456,7 +1461,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
             if (ctResult.isRight()) {
                 JanusGraphOperationStatus status = ctResult.right().value();
                 if (status != JanusGraphOperationStatus.NOT_FOUND) {
-                  log.error(BUSINESS_PROCESS_ERROR, "Failed to retrieve information on data type {} status is {}", uid, status);
+                    log.error(BUSINESS_PROCESS_ERROR, "Failed to retrieve information on data type {} status is {}", uid, status);
                 }
                 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(ctResult.right().value()));
                 return result;
@@ -1533,7 +1538,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
         final Map<String, Map<String, DataTypeDefinition>> dataTypes = new HashMap<>();
         Either<Map<String, Map<String, DataTypeDefinition>>, JanusGraphOperationStatus> result = Either.left(dataTypes);
         final Map<String, DataTypeDefinition> allDataTypesFound = new HashMap<>();
-        
+
         final Map<String, List<String>> dataTypeUidstoModels = dataTypeOperation.getAllDataTypeUidsToModels();
 
         if (dataTypeUidstoModels != null) {
@@ -1549,7 +1554,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
                     }
                     return Either.right(status);
                 }
-                for (final String model: entry.getValue()) {
+                for (final String model : entry.getValue()) {
                     if (!dataTypes.containsKey(model)) {
                         dataTypes.put(model, new HashMap<String, DataTypeDefinition>());
                     }
@@ -1557,7 +1562,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
                     dataTypes.get(model).put(dataTypeDefinition.getName(), dataTypeDefinition);
                 }
             }
-            
+
         }
         if (log.isTraceEnabled()) {
             if (result.isRight()) {
@@ -1824,7 +1829,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
             String dataTypeName = newDataTypeDefinition.getName();
             List<PropertyDefinition> propertiesToAdd = new ArrayList<>();
             if (isPropertyTypeChanged(dataTypeName, newProperties, oldProperties, propertiesToAdd)
-                    || isDerivedFromNameChanged(dataTypeName, newDerivedFromName, oldDerivedFromName)) {
+                || isDerivedFromNameChanged(dataTypeName, newDerivedFromName, oldDerivedFromName)) {
                 log.debug("The new data type {} is invalid.", dataTypeName);
                 result = Either.right(StorageOperationStatus.CANNOT_UPDATE_EXISTING_ENTITY);
                 return result;
@@ -2111,21 +2116,20 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
 
         @Override
         public JsonElement serialize(PropertyConstraint src, Type typeOfSrc, JsonSerializationContext context) {
-            JsonParser parser = new JsonParser();
             JsonObject result = new JsonObject();
             JsonArray jsonArray = new JsonArray();
             if (src instanceof InRangeConstraint) {
                 InRangeConstraint rangeConstraint = (InRangeConstraint) src;
-                jsonArray.add(parser.parse(rangeConstraint.getRangeMinValue()));
-                jsonArray.add(parser.parse(rangeConstraint.getRangeMaxValue()));
+                jsonArray.add(JsonParser.parseString(rangeConstraint.getRangeMinValue()));
+                jsonArray.add(JsonParser.parseString(rangeConstraint.getRangeMaxValue()));
                 result.add("inRange", jsonArray);
             } else if (src instanceof GreaterThanConstraint) {
                 GreaterThanConstraint greaterThanConstraint = (GreaterThanConstraint) src;
-                jsonArray.add(parser.parse(greaterThanConstraint.getGreaterThan()));
+                jsonArray.add(JsonParser.parseString(greaterThanConstraint.getGreaterThan()));
                 result.add("greaterThan", jsonArray);
             } else if (src instanceof LessOrEqualConstraint) {
                 LessOrEqualConstraint lessOrEqualConstraint = (LessOrEqualConstraint) src;
-                jsonArray.add(parser.parse(lessOrEqualConstraint.getLessOrEqual()));
+                jsonArray.add(JsonParser.parseString(lessOrEqualConstraint.getLessOrEqual()));
                 result.add("lessOrEqual", jsonArray);
             } else {
                 log.warn("PropertyConstraint {} is not supported. Ignored.", src.getClass().getName());
@@ -2299,55 +2303,56 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
                     log.warn("ConstraintType was not found for constraint name:{}", field.getKey());
                 } else {
                     if (value == null) {
-                        log.warn("The value of " + constraintType + " constraint is null");
-                    }
-                    switch (constraintType) {
-                        case EQUAL:
-                            propertyConstraint = deserializeConstraintWithStringOperand(value, EqualConstraint.class);
-                            break;
-                        case IN_RANGE:
-                            propertyConstraint = deserializeInRangeConstraintConstraint(value);
-                            break;
-                        case GREATER_THAN:
-                            propertyConstraint = deserializeConstraintWithStringOperand(value, GreaterThanConstraint.class);
-                            break;
-                        case LESS_THAN:
-                            propertyConstraint = deserializeConstraintWithStringOperand(value, LessThanConstraint.class);
-                            break;
-                        case GREATER_OR_EQUAL:
-                            propertyConstraint = deserializeConstraintWithStringOperand(value, GreaterOrEqualConstraint.class);
-                            break;
-                        case LESS_OR_EQUAL:
-                            propertyConstraint = deserializeConstraintWithStringOperand(value, LessOrEqualConstraint.class);
-                            break;
-                        case VALID_VALUES:
-                            propertyConstraint = deserializeValidValuesConstraint(value);
-                            break;
-                        case LENGTH:
-                            propertyConstraint = deserializeConstraintWithIntegerOperand(value, LengthConstraint.class);
-                            break;
-                        case MIN_LENGTH:
-                            propertyConstraint = deserializeConstraintWithIntegerOperand(value, MinLengthConstraint.class);
-                            break;
-                        case MAX_LENGTH:
-                            propertyConstraint = deserializeConstraintWithIntegerOperand(value, MaxLengthConstraint.class);
-                            break;
-                        default:
-                            log.warn("Key {} is not supported. Ignored.", field.getKey());
+                        log.warn("The value of {} constraint is null", constraintType);
+                    } else {
+                        switch (constraintType) {
+                            case EQUAL:
+                                propertyConstraint = deserializeConstraintWithStringOperand(value, EqualConstraint.class);
+                                break;
+                            case IN_RANGE:
+                                propertyConstraint = deserializeInRangeConstraintConstraint(value);
+                                break;
+                            case GREATER_THAN:
+                                propertyConstraint = deserializeConstraintWithStringOperand(value, GreaterThanConstraint.class);
+                                break;
+                            case LESS_THAN:
+                                propertyConstraint = deserializeConstraintWithStringOperand(value, LessThanConstraint.class);
+                                break;
+                            case GREATER_OR_EQUAL:
+                                propertyConstraint = deserializeConstraintWithStringOperand(value, GreaterOrEqualConstraint.class);
+                                break;
+                            case LESS_OR_EQUAL:
+                                propertyConstraint = deserializeConstraintWithStringOperand(value, LessOrEqualConstraint.class);
+                                break;
+                            case VALID_VALUES:
+                                propertyConstraint = deserializeValidValuesConstraint(value);
+                                break;
+                            case LENGTH:
+                                propertyConstraint = deserializeConstraintWithIntegerOperand(value, LengthConstraint.class);
+                                break;
+                            case MIN_LENGTH:
+                                propertyConstraint = deserializeConstraintWithIntegerOperand(value, MinLengthConstraint.class);
+                                break;
+                            case MAX_LENGTH:
+                                propertyConstraint = deserializeConstraintWithIntegerOperand(value, MaxLengthConstraint.class);
+                                break;
+                            default:
+                                log.warn("Key {} is not supported. Ignored.", field.getKey());
+                        }
                     }
                 }
             }
 
             return propertyConstraint;
         }
-        
+
         private PropertyConstraint deserializeConstraintWithStringOperand(JsonNode value, Class<? extends PropertyConstraint> constraintClass) {
             String asString = value.asText();
             log.debug("Before adding value to {} object. value = {}", constraintClass, asString);
             try {
                 return constraintClass.getConstructor(String.class).newInstance(asString);
             } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
-                    | SecurityException exception) {
+                     | SecurityException exception) {
                 log.error("Error deserializing constraint", exception);
                 return null;
             }
@@ -2359,7 +2364,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
             try {
                 return constraintClass.getConstructor(Integer.class).newInstance(asInt);
             } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
-                    | SecurityException exception) {
+                     | SecurityException exception) {
                 log.error("Error deserializing constraint", exception);
                 return null;
             }
@@ -2387,7 +2392,7 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
             }
             return null;
         }
-        
+
         private PropertyConstraint deserializeValidValuesConstraint(JsonNode value) {
             ArrayNode rangeArray = (ArrayNode) value;
             if (rangeArray.size() == 0) {
@@ -2404,8 +2409,8 @@ public class PropertyOperation extends AbstractOperation implements IPropertyOpe
             }
             return null;
         }
-        
-        
+
+
     }
 
 }