aboutsummaryrefslogtreecommitdiffstats
path: root/models/src/main
diff options
context:
space:
mode:
authorFrancescoFioraEst <francesco.fiora@est.tech>2021-11-11 14:57:23 +0000
committerFrancescoFioraEst <francesco.fiora@est.tech>2021-11-25 13:25:48 +0000
commita41acc89a8c7177014d1377c4457cd402ed7ee93 (patch)
tree47eb78295c696d7281bc772e346ec260cd114ce1 /models/src/main
parent7443b9a5ddca988ad4338e2b6597d6fdce552909 (diff)
Add support transaction in CL and ServiceTemplate Providers
Add support transaction in ControlLoopProvider and ServiceTemplateProvider Issue-ID: POLICY-3798 Change-Id: I0ab79f28231e329e06c16e01427775077b3ac994 Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
Diffstat (limited to 'models/src/main')
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java238
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ServiceTemplateProvider.java51
2 files changed, 166 insertions, 123 deletions
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java
index a61b97fa8..7b6787c5d 100644
--- a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java
@@ -22,146 +22,173 @@
package org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider;
-import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.stream.Collectors;
+import java.util.Optional;
+import javax.persistence.EntityNotFoundException;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import lombok.AllArgsConstructor;
import lombok.NonNull;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop;
-import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ControlLoopRepository;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ToscaNodeTemplateRepository;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ToscaNodeTemplatesRepository;
import org.onap.policy.models.base.PfConceptKey;
-import org.onap.policy.models.base.PfKey;
import org.onap.policy.models.base.PfModelException;
-import org.onap.policy.models.base.PfModelRuntimeException;
-import org.onap.policy.models.provider.PolicyModelsProviderParameters;
-import org.onap.policy.models.provider.impl.AbstractModelsProvider;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate;
import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates;
import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
/**
* This class provides information on control loop concepts in the database to callers.
*/
@Component
-public class ControlLoopProvider extends AbstractModelsProvider {
+@Transactional
+@AllArgsConstructor
+public class ControlLoopProvider {
+
+ private final ControlLoopRepository controlLoopRepository;
+ private final ToscaNodeTemplateRepository toscaNodeTemplateRepository;
+ private final ToscaNodeTemplatesRepository toscaNodeTemplatesRepository;
/**
- * Create a provider for control loops.
+ * Get Control Loop.
*
- * @param parameters the parameters for database access
- * @throws PfModelException on initiation errors
+ * @param controlLoopId the ID of the control loop to get
+ * @return the control loop found
+ * @throws PfModelException on errors getting the control loop
*/
- public ControlLoopProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException {
- super(parameters);
- this.init();
+ @Transactional(readOnly = true)
+ public ControlLoop getControlLoop(final ToscaConceptIdentifier controlLoopId) throws PfModelException {
+ try {
+ return controlLoopRepository.getById(controlLoopId.asConceptKey()).toAuthorative();
+ } catch (EntityNotFoundException e) {
+ throw new PfModelException(Status.NOT_FOUND, "ControlLoop not found", e);
+ }
}
/**
- * Get Control Loop.
+ * Find Control Loop by controlLoopId.
+ *
+ * @param name the name of the control loop to get, null to get all control loops
+ * @param version the version of the control loop to get, null to get all control loops
+ * @return the control loop found
+ * @throws PfModelException on errors getting the control loop
+ */
+ @Transactional(readOnly = true)
+ public Optional<ControlLoop> findControlLoop(@NonNull final String name, @NonNull final String version)
+ throws PfModelException {
+ return findControlLoop(new PfConceptKey(name, version));
+ }
+
+ /**
+ * Find Control Loop by controlLoopId.
*
* @param controlLoopId the ID of the control loop to get
* @return the control loop found
* @throws PfModelException on errors getting the control loop
*/
- public ControlLoop getControlLoop(final ToscaConceptIdentifier controlLoopId) throws PfModelException {
- var jpaControlLoop = getPfDao().get(JpaControlLoop.class, controlLoopId.asConceptKey());
+ @Transactional(readOnly = true)
+ public Optional<ControlLoop> findControlLoop(final ToscaConceptIdentifier controlLoopId) throws PfModelException {
+ return findControlLoop(controlLoopId.asConceptKey());
+ }
- return jpaControlLoop == null ? null : jpaControlLoop.toAuthorative();
+ private Optional<ControlLoop> findControlLoop(@NonNull final PfConceptKey key) throws PfModelException {
+ try {
+ return controlLoopRepository.findById(key).map(JpaControlLoop::toAuthorative);
+ } catch (IllegalArgumentException e) {
+ throw new PfModelException(Status.BAD_REQUEST, "Not valid parameter", e);
+ }
}
/**
- * Update Control Loop.
+ * Save Control Loop.
*
* @param controlLoop the control loop to update
* @return the updated control loop
* @throws PfModelException on errors updating the control loop
*/
- public ControlLoop updateControlLoop(final ControlLoop controlLoop) throws PfModelException {
- return updateControlLoops(Collections.singletonList(controlLoop)).get(0);
+ public ControlLoop saveControlLoop(final ControlLoop controlLoop) throws PfModelException {
+ try {
+ var result = controlLoopRepository
+ .save(ProviderUtils.getJpaAndValidate(controlLoop, JpaControlLoop::new, "control loop"));
+
+ // Return the saved participant
+ return result.toAuthorative();
+ } catch (IllegalArgumentException e) {
+ throw new PfModelException(Status.BAD_REQUEST, "Error in save controlLoop", e);
+ }
}
/**
- * Get Control Loops.
+ * Get All Control Loops.
*
- * @param name the name of the control loop to get, null to get all control loops
- * @param version the version of the control loop to get, null to get all control loops
- * @return the control loops found
+ * @return all control loops found
* @throws PfModelException on errors getting control loops
*/
- public List<ControlLoop> getControlLoops(final String name, final String version) throws PfModelException {
+ @Transactional(readOnly = true)
+ public List<ControlLoop> getControlLoops() throws PfModelException {
- return asEntityList(getPfDao().getFiltered(JpaControlLoop.class, name, version));
+ return ProviderUtils.asEntityList(controlLoopRepository.findAll());
}
/**
- * Get filtered control loops.
+ * Get Control Loops.
*
- * @param filter the filter for the control loops to get
+ * @param name the name of the control loop to get, null to get all control loops
+ * @param version the version of the control loop to get, null to get all control loops
* @return the control loops found
* @throws PfModelException on errors getting control loops
*/
- public List<ControlLoop> getFilteredControlLoops(@NonNull final ToscaTypedEntityFilter<ControlLoop> filter) {
+ @Transactional(readOnly = true)
+ public List<ControlLoop> getControlLoops(final String name, final String version) throws PfModelException {
- return filter.filter(
- asEntityList(getPfDao().getFiltered(JpaControlLoop.class, filter.getName(), PfKey.NULL_KEY_VERSION)));
+ return ProviderUtils.asEntityList(controlLoopRepository.getFiltered(JpaControlLoop.class, name, version));
}
/**
- * Creates control loops.
+ * Saves control loops.
*
* @param controlLoops a specification of the control loops to create
* @return the control loops created
* @throws PfModelException on errors creating control loops
*/
- public List<ControlLoop> createControlLoops(@NonNull final List<ControlLoop> controlLoops) throws PfModelException {
-
- List<JpaControlLoop> jpaControlLoopList =
- ProviderUtils.getJpaAndValidateList(controlLoops, JpaControlLoop::new, "control loop");
-
- jpaControlLoopList.forEach(jpaControlLoop -> getPfDao().create(jpaControlLoop));
-
- // Return the created control loops
- List<ControlLoop> returnControlLoops = new ArrayList<>(controlLoops.size());
-
- for (ControlLoop controlLoop : controlLoops) {
- var jpaControlLoop = getPfDao().get(JpaControlLoop.class,
- new PfConceptKey(controlLoop.getName(), controlLoop.getVersion()));
- returnControlLoops.add(jpaControlLoop.toAuthorative());
+ public List<ControlLoop> saveControlLoops(@NonNull final List<ControlLoop> controlLoops) throws PfModelException {
+ try {
+ var result = controlLoopRepository
+ .saveAll(ProviderUtils.getJpaAndValidateList(controlLoops, JpaControlLoop::new, "control loops"));
+
+ // Return the saved participant
+ return ProviderUtils.asEntityList(result);
+ } catch (IllegalArgumentException e) {
+ throw new PfModelException(Status.BAD_REQUEST, "Error in save ControlLoops", e);
}
-
- return returnControlLoops;
}
/**
- * Updates control loops.
+ * Saves Instance Properties to the database.
*
- * @param controlLoops a specification of the control loops to update
- * @return the control loops updated
- * @throws PfModelException on errors updating control loops
+ * @param serviceTemplate the service template
+ * @return a Map of tosca node templates
*/
- public List<ControlLoop> updateControlLoops(@NonNull final List<ControlLoop> controlLoops) throws PfModelException {
-
- List<JpaControlLoop> jpaControlLoopList =
- ProviderUtils.getJpaAndValidateList(controlLoops, JpaControlLoop::new, "control loop");
+ public Map<String, ToscaNodeTemplate> saveInstanceProperties(ToscaServiceTemplate serviceTemplate) {
+ Map<String, ToscaNodeTemplate> savedNodeTemplates = new HashMap<>();
- // Return the created control loops
- List<ControlLoop> returnControlLoops = new ArrayList<>(controlLoops.size());
+ var jpaToscaNodeTemplates = new JpaToscaNodeTemplates();
+ jpaToscaNodeTemplates.fromAuthorative(List.of(serviceTemplate.getToscaTopologyTemplate().getNodeTemplates()));
- jpaControlLoopList.forEach(jpaControlLoop -> {
- var returnJpaControlLoop = getPfDao().update(jpaControlLoop);
- returnControlLoops.add(returnJpaControlLoop.toAuthorative());
- });
+ toscaNodeTemplatesRepository.save(jpaToscaNodeTemplates);
+ serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().forEach(savedNodeTemplates::put);
- return returnControlLoops;
+ return savedNodeTemplates;
}
/**
@@ -170,42 +197,23 @@ public class ControlLoopProvider extends AbstractModelsProvider {
* @param name the name of the control loop to delete
* @param version the version of the control loop to delete
* @return the control loop deleted
- * @throws PfModelRuntimeException on errors deleting the control loop
+ * @throws PfModelException on errors deleting the control loop
*/
- public ControlLoop deleteControlLoop(@NonNull final String name, @NonNull final String version) {
+ public ControlLoop deleteControlLoop(@NonNull final String name, @NonNull final String version)
+ throws PfModelException {
var controlLoopKey = new PfConceptKey(name, version);
+ var jpaDeleteControlLoop = controlLoopRepository.findById(controlLoopKey);
- var jpaDeleteControlLoop = getPfDao().get(JpaControlLoop.class, controlLoopKey);
-
- if (jpaDeleteControlLoop == null) {
+ if (jpaDeleteControlLoop.isEmpty()) {
String errorMessage =
"delete of control loop \"" + controlLoopKey.getId() + "\" failed, control loop does not exist";
- throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+ throw new PfModelException(Response.Status.BAD_REQUEST, errorMessage);
}
- getPfDao().delete(jpaDeleteControlLoop);
+ controlLoopRepository.deleteById(controlLoopKey);
- return jpaDeleteControlLoop.toAuthorative();
- }
-
- /**
- * Saves Instance Properties to the database.
- * @param serviceTemplate the service template
- * @return a Map of tosca node templates
- */
- public Map<String, ToscaNodeTemplate> saveInstanceProperties(ToscaServiceTemplate serviceTemplate) {
-
- Map<String, ToscaNodeTemplate> savedNodeTemplates = new HashMap<>();
-
- var jpaToscaNodeTemplates = new JpaToscaNodeTemplates();
- jpaToscaNodeTemplates.fromAuthorative(Collections.singletonList(serviceTemplate.getToscaTopologyTemplate()
- .getNodeTemplates()));
-
- getPfDao().create(jpaToscaNodeTemplates);
- serviceTemplate.getToscaTopologyTemplate().getNodeTemplates().forEach(savedNodeTemplates::put);
-
- return savedNodeTemplates;
+ return jpaDeleteControlLoop.get().toAuthorative();
}
/**
@@ -214,23 +222,33 @@ public class ControlLoopProvider extends AbstractModelsProvider {
* @param filteredToscaNodeTemplateMap filtered node templates map to delete
* @param filteredToscaNodeTemplateList filtered node template list to delete
*/
- public void deleteInstanceProperties(
- Map<String, ToscaNodeTemplate> filteredToscaNodeTemplateMap,
- List<ToscaNodeTemplate> filteredToscaNodeTemplateList) {
+ public void deleteInstanceProperties(Map<String, ToscaNodeTemplate> filteredToscaNodeTemplateMap,
+ List<ToscaNodeTemplate> filteredToscaNodeTemplateList) {
var jpaToscaNodeTemplates = new JpaToscaNodeTemplates();
- jpaToscaNodeTemplates.fromAuthorative(Collections.singletonList(filteredToscaNodeTemplateMap));
+ jpaToscaNodeTemplates.fromAuthorative(List.of(filteredToscaNodeTemplateMap));
- getPfDao().create(jpaToscaNodeTemplates);
+ toscaNodeTemplatesRepository.save(jpaToscaNodeTemplates);
filteredToscaNodeTemplateList.forEach(template -> {
var jpaToscaNodeTemplate = new JpaToscaNodeTemplate(template);
- getPfDao().delete(jpaToscaNodeTemplate);
+ toscaNodeTemplateRepository.delete(jpaToscaNodeTemplate);
});
}
/**
+ * Get All Node Templates.
+ *
+ * @return the list of node templates found
+ * @throws PfModelException on errors getting node templates
+ */
+ @Transactional(readOnly = true)
+ public List<ToscaNodeTemplate> getAllNodeTemplates() {
+ return ProviderUtils.asEntityList(toscaNodeTemplateRepository.findAll());
+ }
+
+ /**
* Get Node Templates.
*
* @param name the name of the node template to get, null to get all node templates
@@ -238,8 +256,10 @@ public class ControlLoopProvider extends AbstractModelsProvider {
* @return the node templates found
* @throws PfModelException on errors getting node templates
*/
+ @Transactional(readOnly = true)
public List<ToscaNodeTemplate> getNodeTemplates(final String name, final String version) {
- return asEntityList(getPfDao().getFiltered(JpaToscaNodeTemplate.class, name, version));
+ return ProviderUtils
+ .asEntityList(toscaNodeTemplateRepository.getFiltered(JpaToscaNodeTemplate.class, name, version));
}
/**
@@ -249,23 +269,11 @@ public class ControlLoopProvider extends AbstractModelsProvider {
* @return the node templates found
* @throws PfModelException on errors getting node templates
*/
+ @Transactional(readOnly = true)
public List<ToscaNodeTemplate> getFilteredNodeTemplates(
@NonNull final ToscaTypedEntityFilter<ToscaNodeTemplate> filter) {
- return filter.filter(asEntityList(
- getPfDao().getFiltered(JpaToscaNodeTemplate.class, filter.getName(), filter.getVersion())));
+ return filter.filter(ProviderUtils.asEntityList(toscaNodeTemplateRepository
+ .getFiltered(JpaToscaNodeTemplate.class, filter.getName(), filter.getVersion())));
}
-
- /**
- * Convert JPA control loop list to an authorative control loop list.
- *
- * @param <T> the type of TOSCA entity
- * @param <J> the type of JPA TOSCA entity
- * @param jpaEntityList the list to convert
- * @return the authorative list
- */
- private <T extends ToscaEntity, J extends PfAuthorative<T>> List<T> asEntityList(List<J> jpaEntityList) {
- return jpaEntityList.stream().map(J::toAuthorative).collect(Collectors.toList());
- }
-
}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ServiceTemplateProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ServiceTemplateProvider.java
index 6a6d20fe7..6b3749fc5 100644
--- a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ServiceTemplateProvider.java
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ServiceTemplateProvider.java
@@ -23,21 +23,26 @@ package org.onap.policy.clamp.controlloop.models.controlloop.persistence.provide
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import lombok.RequiredArgsConstructor;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ToscaServiceTemplateRepository;
+import org.onap.policy.models.base.PfConceptKey;
import org.onap.policy.models.base.PfModelException;
-import org.onap.policy.models.provider.PolicyModelsProvider;
import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
@Component
@RequiredArgsConstructor
+@Transactional
public class ServiceTemplateProvider {
- private final PolicyModelsProvider modelsProvider;
+ private final ToscaServiceTemplateRepository serviceTemplateRepository;
/**
* Create service template.
@@ -48,7 +53,13 @@ public class ServiceTemplateProvider {
*/
public ToscaServiceTemplate createServiceTemplate(final ToscaServiceTemplate serviceTemplate)
throws PfModelException {
- return modelsProvider.createServiceTemplate(serviceTemplate);
+ try {
+ var result = serviceTemplateRepository.save(ProviderUtils.getJpaAndValidate(serviceTemplate,
+ JpaToscaServiceTemplate::new, "toscaServiceTemplate"));
+ return result.toAuthorative();
+ } catch (IllegalArgumentException e) {
+ throw new PfModelException(Status.BAD_REQUEST, "Error in save serviceTemplate", e);
+ }
}
/**
@@ -60,7 +71,15 @@ public class ServiceTemplateProvider {
* @throws PfModelException on errors deleting policy types
*/
public ToscaServiceTemplate deleteServiceTemplate(final String name, final String version) throws PfModelException {
- return modelsProvider.deleteServiceTemplate(name, version);
+ var serviceTemplateKey = new PfConceptKey(name, version);
+ var jpaDelete = serviceTemplateRepository.findById(serviceTemplateKey);
+ if (jpaDelete.isEmpty()) {
+ String errorMessage = "delete of serviceTemplate \"" + serviceTemplateKey.getId()
+ + "\" failed, serviceTemplate does not exist";
+ throw new PfModelException(Response.Status.BAD_REQUEST, errorMessage);
+ }
+ serviceTemplateRepository.deleteById(serviceTemplateKey);
+ return jpaDelete.get().toAuthorative();
}
/**
@@ -71,12 +90,26 @@ public class ServiceTemplateProvider {
* @return the control loop definitions
* @throws PfModelException on errors getting control loop definitions
*/
+ @Transactional(readOnly = true)
public ToscaServiceTemplate getToscaServiceTemplate(String name, String version) throws PfModelException {
- var serviceTemplates = modelsProvider.getServiceTemplateList(name, version);
- if (serviceTemplates.isEmpty()) {
+ var serviceTemplateKey = new PfConceptKey(name, version);
+ var jpaServiceTemplates = serviceTemplateRepository.findById(serviceTemplateKey);
+ if (jpaServiceTemplates.isEmpty()) {
throw new PfModelException(Status.NOT_FOUND, "Control Loop definitions not found");
}
- return serviceTemplates.get(0);
+ return jpaServiceTemplates.get().toAuthorative();
+ }
+
+ /**
+ * Get service templates.
+ *
+ * @return the topology templates found
+ * @throws PfModelException on errors getting service templates
+ */
+ @Transactional(readOnly = true)
+ public List<ToscaServiceTemplate> getAllServiceTemplates() throws PfModelException {
+ var jpaList = serviceTemplateRepository.findAll();
+ return ProviderUtils.asEntityList(jpaList);
}
/**
@@ -87,9 +120,11 @@ public class ServiceTemplateProvider {
* @return the topology templates found
* @throws PfModelException on errors getting service templates
*/
+ @Transactional(readOnly = true)
public List<ToscaServiceTemplate> getServiceTemplateList(final String name, final String version)
throws PfModelException {
- return modelsProvider.getServiceTemplateList(name, version);
+ var jpaList = serviceTemplateRepository.getFiltered(JpaToscaServiceTemplate.class, name, version);
+ return ProviderUtils.asEntityList(jpaList);
}
/**