Add generic methods to TOSCA providers and utils
[policy/models.git] / models-tosca / src / main / java / org / onap / policy / models / tosca / utils / ToscaUtils.java
index cc04319..70c5027 100644 (file)
 package org.onap.policy.models.tosca.utils;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Set;
 import java.util.function.Function;
-
 import javax.ws.rs.core.Response;
-
 import lombok.NonNull;
-
 import org.apache.commons.collections4.CollectionUtils;
 import org.onap.policy.models.base.PfConcept;
 import org.onap.policy.models.base.PfConceptContainer;
@@ -60,6 +58,7 @@ public final class ToscaUtils {
             new PfConceptKey("null",                         PfKey.NULL_KEY_VERSION),
             new PfConceptKey("list",                         PfKey.NULL_KEY_VERSION),
             new PfConceptKey("map",                          PfKey.NULL_KEY_VERSION),
+            new PfConceptKey("object",                       PfKey.NULL_KEY_VERSION),
             new PfConceptKey("scalar-unit.size",             PfKey.NULL_KEY_VERSION),
             new PfConceptKey("scalar-unit.time",             PfKey.NULL_KEY_VERSION),
             new PfConceptKey("scalar-unit.frequency",        PfKey.NULL_KEY_VERSION),
@@ -144,10 +143,10 @@ public final class ToscaUtils {
      * @param serviceTemplate the service template containing policy types to be checked
      */
     public static void assertExist(final JpaToscaServiceTemplate serviceTemplate,
-            final Function<JpaToscaServiceTemplate, String> checkerFunction) {
+        final Function<JpaToscaServiceTemplate, String> checkerFunction) {
         String message = checkerFunction.apply(serviceTemplate);
         if (message != null) {
-            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, message);
+            throw new PfModelRuntimeException(Response.Status.NOT_FOUND, message);
         }
     }
 
@@ -157,7 +156,7 @@ public final class ToscaUtils {
      * @param serviceTemplate the service template containing policy types to be checked
      */
     public static boolean doExist(final JpaToscaServiceTemplate serviceTemplate,
-            final Function<JpaToscaServiceTemplate, String> checkerFunction) {
+        final Function<JpaToscaServiceTemplate, String> checkerFunction) {
         return checkerFunction.apply(serviceTemplate) == null;
     }
 
@@ -211,7 +210,7 @@ public final class ToscaUtils {
     }
 
     /**
-     * Find all the ancestors of an entity type.
+     * getLatestPolicyTypeVersion Find all the ancestors of an entity type.
      *
      * @param entityTypes the set of entity types that exist
      * @param entityType the entity type for which to get the parents
@@ -219,27 +218,33 @@ public final class ToscaUtils {
      * @return the entity set containing the ancestors of the incoming entity
      */
     public static Collection<JpaToscaEntityType<ToscaEntity>> getEntityTypeAncestors(
-            @NonNull PfConceptContainer<? extends PfConcept, ? extends PfNameVersion> entityTypes,
-            @NonNull JpaToscaEntityType<?> entityType, @NonNull final PfValidationResult result) {
+        @NonNull PfConceptContainer<? extends PfConcept, ? extends PfNameVersion> entityTypes,
+        @NonNull JpaToscaEntityType<?> entityType, @NonNull final PfValidationResult result) {
 
         PfConceptKey parentEntityTypeKey = entityType.getDerivedFrom();
         if (parentEntityTypeKey == null || parentEntityTypeKey.getName().endsWith(ROOT_KEY_NAME_SUFFIX)) {
             return CollectionUtils.emptyCollection();
         }
 
+        if (entityType.getKey().equals(parentEntityTypeKey)) {
+            result.addValidationMessage(new PfValidationMessage(entityType.getKey(), ToscaUtils.class,
+                ValidationResult.INVALID, "entity cannot be an ancestor of itself"));
+            throw new PfModelRuntimeException(Response.Status.CONFLICT, result.toString());
+        }
+
         @SuppressWarnings("unchecked")
         Set<JpaToscaEntityType<ToscaEntity>> ancestorEntitySet = (Set<JpaToscaEntityType<ToscaEntity>>) entityTypes
-                .getAll(parentEntityTypeKey.getName(), parentEntityTypeKey.getVersion());
-
+            .getAll(parentEntityTypeKey.getName(), parentEntityTypeKey.getVersion());
+        Set<JpaToscaEntityType<ToscaEntity>> ancestorEntitySetToReturn = new HashSet<>(ancestorEntitySet);
         if (ancestorEntitySet.isEmpty()) {
             result.addValidationMessage(new PfValidationMessage(entityType.getKey(), ToscaUtils.class,
-                    ValidationResult.INVALID, "parent " + parentEntityTypeKey.getId() + " of entity not found"));
+                ValidationResult.INVALID, "parent " + parentEntityTypeKey.getId() + " of entity not found"));
         } else {
             for (JpaToscaEntityType<?> filteredEntityType : ancestorEntitySet) {
-                ancestorEntitySet.addAll(getEntityTypeAncestors(entityTypes, filteredEntityType, result));
+                ancestorEntitySetToReturn.addAll(getEntityTypeAncestors(entityTypes, filteredEntityType, result));
             }
         }
-        return ancestorEntitySet;
+        return ancestorEntitySetToReturn;
     }
 
     /**
@@ -250,23 +255,25 @@ public final class ToscaUtils {
      * @param entityVersion the version of the entity
      */
     public static void getEntityTree(
-            @NonNull final PfConceptContainer<? extends PfConcept, ? extends PfNameVersion> entityTypes,
-            final String entityName, final String entityVersion) {
+        @NonNull final PfConceptContainer<? extends PfConcept, ? extends PfNameVersion> entityTypes,
+        final String entityName, final String entityVersion) {
 
         PfValidationResult result = new PfValidationResult();
 
         @SuppressWarnings("unchecked")
         Set<JpaToscaEntityType<?>> filteredEntitySet =
-                (Set<JpaToscaEntityType<?>>) entityTypes.getAll(entityName, entityVersion);
+            (Set<JpaToscaEntityType<?>>) entityTypes.getAllNamesAndVersions(entityName, entityVersion);
+        Set<JpaToscaEntityType<?>> filteredEntitySetToReturn = new HashSet<>(filteredEntitySet);
         for (JpaToscaEntityType<?> filteredEntityType : filteredEntitySet) {
-            filteredEntitySet.addAll(ToscaUtils.getEntityTypeAncestors(entityTypes, filteredEntityType, result));
+            filteredEntitySetToReturn
+                .addAll(ToscaUtils.getEntityTypeAncestors(entityTypes, filteredEntityType, result));
         }
 
         if (!result.isValid()) {
-            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, result.toString());
+            throw new PfModelRuntimeException(Response.Status.NOT_ACCEPTABLE, result.toString());
         }
 
         entityTypes.getConceptMap().entrySet()
-                .removeIf(entityEntry -> !filteredEntitySet.contains(entityEntry.getValue()));
+            .removeIf(entityEntry -> !filteredEntitySetToReturn.contains(entityEntry.getValue()));
     }
 }