/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2020 Nordix Foundation.
- * Modifications Copyright (C) 2020 AT&T
+ * 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;
/**
* 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
*/
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 && fragmentTemplate.getTopologyTemplate() != null) {
if (originalTemplate.getTopologyTemplate()
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();
+ String message = result.getResult();
throw new PfModelRuntimeException(Response.Status.NOT_ACCEPTABLE, message);
}
/**
* 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;
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
}