Java 17 Upgrade
[policy/models.git] / models-tosca / src / main / java / org / onap / policy / models / tosca / utils / ToscaServiceTemplateUtils.java
index 87b499b..1f6056f 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2020 Nordix Foundation.
+ * Copyright (C) 2020, 2022-2023 Nordix Foundation.
+ * Modifications Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 package org.onap.policy.models.tosca.utils;
 
-import java.util.Map;
+import jakarta.ws.rs.core.Response;
 import java.util.Map.Entry;
-
-import javax.ws.rs.core.Response;
-
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 import lombok.NonNull;
-
+import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.models.base.PfConceptContainer;
 import org.onap.policy.models.base.PfConceptKey;
 import org.onap.policy.models.base.PfModelRuntimeException;
-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.base.Validated;
 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;
@@ -41,13 +39,8 @@ import org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate;
 /**
  * This utility class provides methods to manage service templates.
  */
-public class ToscaServiceTemplateUtils {
-    /**
-     * Private constructor to prevent subclassing.
-     */
-    private ToscaServiceTemplateUtils() {
-        // Private constructor to prevent subclassing
-    }
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ToscaServiceTemplateUtils {
 
     /**
      * Add a service template fragment to a service template. All entities in the service template fragment must either
@@ -55,47 +48,53 @@ public class ToscaServiceTemplateUtils {
      *
      * @param originalTemplate the original service template
      * @param fragmentTemplate the fragment being added to the original service template
-     * @return
+     * @return JpaToscaServiceTemplate
      */
     public static JpaToscaServiceTemplate addFragment(@NonNull final JpaToscaServiceTemplate originalTemplate,
             @NonNull final JpaToscaServiceTemplate fragmentTemplate) {
-        PfValidationResult result = new PfValidationResult();
+
+        var result = new BeanValidationResult("incoming fragment", fragmentTemplate);
 
         if (originalTemplate.compareToWithoutEntities(fragmentTemplate) != 0) {
-            result.addValidationMessage(new PfValidationMessage(originalTemplate.getKey(),
-                    ToscaServiceTemplateUtils.class, ValidationResult.INVALID,
-                    "service template in incoming fragment does not equal existing service template"));
+            Validated.addResult(result, "service template",
+                            originalTemplate.getKey(),
+                            "does not equal existing service template");
         }
 
-        JpaToscaServiceTemplate compositeTemplate = new JpaToscaServiceTemplate(originalTemplate);
+        var compositeTemplate = new JpaToscaServiceTemplate(originalTemplate);
 
         compositeTemplate.setDataTypes(
                 addFragmentEntitites(compositeTemplate.getDataTypes(), fragmentTemplate.getDataTypes(), result));
         compositeTemplate.setPolicyTypes(
                 addFragmentEntitites(compositeTemplate.getPolicyTypes(), fragmentTemplate.getPolicyTypes(), result));
+        compositeTemplate.setNodeTypes(
+                addFragmentEntitites(compositeTemplate.getNodeTypes(), fragmentTemplate.getNodeTypes(), result));
 
-        if (originalTemplate.getTopologyTemplate() != null) {
+        if (originalTemplate.getTopologyTemplate() != null && fragmentTemplate.getTopologyTemplate() != null) {
             if (originalTemplate.getTopologyTemplate()
                     .compareToWithoutEntities(fragmentTemplate.getTopologyTemplate()) == 0) {
                 compositeTemplate.getTopologyTemplate()
                         .setPolicies(addFragmentEntitites(compositeTemplate.getTopologyTemplate().getPolicies(),
                                 fragmentTemplate.getTopologyTemplate().getPolicies(), result));
+                compositeTemplate.getTopologyTemplate()
+                    .setNodeTemplates(addFragmentEntitites(compositeTemplate.getTopologyTemplate().getNodeTemplates(),
+                        fragmentTemplate.getTopologyTemplate().getNodeTemplates(), result));
             } else {
-                result.addValidationMessage(new PfValidationMessage(originalTemplate.getTopologyTemplate().getKey(),
-                        ToscaServiceTemplateUtils.class, ValidationResult.INVALID,
-                        "topology template in incoming fragment does not equal existing topology template"));
+                Validated.addResult(result, "topology template",
+                                originalTemplate.getTopologyTemplate().getKey(),
+                                "does not equal existing topology template");
             }
         } else if (fragmentTemplate.getTopologyTemplate() != null) {
             compositeTemplate.setTopologyTemplate(new JpaToscaTopologyTemplate(fragmentTemplate.getTopologyTemplate()));
         }
 
         if (result.isValid()) {
-            result = compositeTemplate.validate(result);
+            result.addResult(compositeTemplate.validate("composite template"));
         }
 
         if (!result.isValid()) {
-            String message = result.toString();
-            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, message);
+            String message = result.getResult();
+            throw new PfModelRuntimeException(Response.Status.NOT_ACCEPTABLE, message);
         }
 
         return compositeTemplate;
@@ -104,18 +103,17 @@ public class ToscaServiceTemplateUtils {
     /**
      * Check entities from a fragment container can be added to an original container.
      *
+     * @param <E> The type of TOSCA entity
+     * @param <J> The type of the JPA TOSCA entity
      * @param <S> The type of container
      *
      * @param compositeContainer the original container
      * @param fragmentContainer the fragment being added to the original container
      * @return the composite container with the result
      */
-    @SuppressWarnings("unchecked")
-    // @formatter:off
-    private static
-        <S extends PfConceptContainer<? extends JpaToscaEntityType<? extends ToscaEntity>, ? extends ToscaEntity>>
+    private static <E extends ToscaEntity, J extends JpaToscaEntityType<E>, S extends PfConceptContainer<J, E>>
             S addFragmentEntitites(final S compositeContainer, final S fragmentContainer,
-                    final PfValidationResult result) {
+                    final BeanValidationResult result) {
 
         if (compositeContainer == null) {
             return fragmentContainer;
@@ -125,24 +123,23 @@ public class ToscaServiceTemplateUtils {
             return compositeContainer;
         }
 
-        for (Entry<PfConceptKey, ? extends JpaToscaEntityType<? extends ToscaEntity>> fragmentEntry : fragmentContainer
-                .getConceptMap().entrySet()) {
-            JpaToscaEntityType<? extends ToscaEntity> containerEntry =
-                    compositeContainer.getConceptMap().get(fragmentEntry.getKey());
-            if (containerEntry != null && !containerEntry.equals(fragmentEntry.getValue())) {
-                result.addValidationMessage(new PfValidationMessage(fragmentEntry.getKey(),
-                        ToscaServiceTemplateUtils.class,
-                        ValidationResult.INVALID, "entity in incoming fragment does not equal existing entity"));
+        var result2 = new BeanValidationResult("incoming fragment", fragmentContainer);
+        var originalContainerMap = compositeContainer.getConceptMap();
+        var fragmentContainerMap = fragmentContainer.getConceptMap();
+
+        for (Entry<PfConceptKey, J> fragmentEntry : fragmentContainerMap.entrySet()) {
+            J containerEntity = originalContainerMap.get(fragmentEntry.getKey());
+            if (containerEntity != null && containerEntity.compareTo(fragmentEntry.getValue()) != 0) {
+                Validated.addResult(result, "entity", fragmentEntry.getKey(), "does not equal existing entity");
             }
         }
 
-        // This use of a generic map is required to get around typing errors in directly adding the fragment map to the
-        // original map
-        @SuppressWarnings("rawtypes")
-        Map originalContainerMap = compositeContainer.getConceptMap();
-        originalContainerMap.putAll(fragmentContainer.getConceptMap());
+        if (!result2.isClean()) {
+            result.addResult(result2);
+        }
+
+        originalContainerMap.putAll(fragmentContainerMap);
 
         return compositeContainer;
     }
-    // @formatter:on
 }