Implement validation and hierarchical get
[policy/models.git] / models-tosca / src / main / java / org / onap / policy / models / tosca / utils / ToscaUtils.java
index 7e106fa..cc04319 100644 (file)
@@ -32,15 +32,15 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.onap.policy.models.base.PfConcept;
 import org.onap.policy.models.base.PfConceptContainer;
 import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
 import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.base.PfNameVersion;
 import org.onap.policy.models.base.PfValidationMessage;
 import org.onap.policy.models.base.PfValidationResult;
 import org.onap.policy.models.base.PfValidationResult.ValidationResult;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaEntityType;
 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Utility class for TOSCA concepts.
@@ -48,10 +48,25 @@ import org.slf4j.LoggerFactory;
  * @author Liam Fallon (liam.fallon@est.tech)
  */
 public final class ToscaUtils {
-    private static final Logger LOGGER = LoggerFactory.getLogger(ToscaUtils.class);
-
     private static final String ROOT_KEY_NAME_SUFFIX = ".Root";
 
+    // @formatter:off
+    private static final Set<PfConceptKey> PREDEFINED_TOSCA_DATA_TYPES = Set.of(
+            new PfConceptKey("string",                       PfKey.NULL_KEY_VERSION),
+            new PfConceptKey("integer",                      PfKey.NULL_KEY_VERSION),
+            new PfConceptKey("float",                        PfKey.NULL_KEY_VERSION),
+            new PfConceptKey("boolean",                      PfKey.NULL_KEY_VERSION),
+            new PfConceptKey("timestamp",                    PfKey.NULL_KEY_VERSION),
+            new PfConceptKey("null",                         PfKey.NULL_KEY_VERSION),
+            new PfConceptKey("list",                         PfKey.NULL_KEY_VERSION),
+            new PfConceptKey("map",                          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),
+            new PfConceptKey("tosca.datatypes.TimeInterval", PfKey.NULL_KEY_VERSION)
+        );
+    // @formatter:on
+
     /**
      * Private constructor to prevent subclassing.
      */
@@ -59,6 +74,15 @@ public final class ToscaUtils {
         // Private constructor to prevent subclassing
     }
 
+    /**
+     * Get the predefined policy types.
+     *
+     * @return the predefined policy types
+     */
+    public static Collection<PfConceptKey> getPredefinedDataTypes() {
+        return PREDEFINED_TOSCA_DATA_TYPES;
+    }
+
     /**
      * Assert that data types have been specified correctly.
      *
@@ -123,7 +147,6 @@ public final class ToscaUtils {
             final Function<JpaToscaServiceTemplate, String> checkerFunction) {
         String message = checkerFunction.apply(serviceTemplate);
         if (message != null) {
-            LOGGER.warn(message);
             throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, message);
         }
     }
@@ -193,9 +216,9 @@ public final class ToscaUtils {
      * @param entityTypes the set of entity types that exist
      * @param entityType the entity type for which to get the parents
      * @param result the result of the ancestor search with any warnings or errors
-     * @return
+     * @return the entity set containing the ancestors of the incoming entity
      */
-    public static Collection<? extends JpaToscaEntityType<?>> getEntityTypeAncestors(
+    public static Collection<JpaToscaEntityType<ToscaEntity>> getEntityTypeAncestors(
             @NonNull PfConceptContainer<? extends PfConcept, ? extends PfNameVersion> entityTypes,
             @NonNull JpaToscaEntityType<?> entityType, @NonNull final PfValidationResult result) {
 
@@ -205,7 +228,7 @@ public final class ToscaUtils {
         }
 
         @SuppressWarnings("unchecked")
-        Set<JpaToscaEntityType<?>> ancestorEntitySet = (Set<JpaToscaEntityType<?>>) entityTypes
+        Set<JpaToscaEntityType<ToscaEntity>> ancestorEntitySet = (Set<JpaToscaEntityType<ToscaEntity>>) entityTypes
                 .getAll(parentEntityTypeKey.getName(), parentEntityTypeKey.getVersion());
 
         if (ancestorEntitySet.isEmpty()) {
@@ -218,4 +241,32 @@ public final class ToscaUtils {
         }
         return ancestorEntitySet;
     }
+
+    /**
+     * Get the entity tree from a concept container for a given entity key.
+     *
+     * @param entityTypes the concept container containing entity types
+     * @param entityName the name of the entity
+     * @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) {
+
+        PfValidationResult result = new PfValidationResult();
+
+        @SuppressWarnings("unchecked")
+        Set<JpaToscaEntityType<?>> filteredEntitySet =
+                (Set<JpaToscaEntityType<?>>) entityTypes.getAll(entityName, entityVersion);
+        for (JpaToscaEntityType<?> filteredEntityType : filteredEntitySet) {
+            filteredEntitySet.addAll(ToscaUtils.getEntityTypeAncestors(entityTypes, filteredEntityType, result));
+        }
+
+        if (!result.isValid()) {
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, result.toString());
+        }
+
+        entityTypes.getConceptMap().entrySet()
+                .removeIf(entityEntry -> !filteredEntitySet.contains(entityEntry.getValue()));
+    }
 }