diff options
author | FrancescoFioraEst <francesco.fiora@est.tech> | 2021-11-11 14:57:23 +0000 |
---|---|---|
committer | FrancescoFioraEst <francesco.fiora@est.tech> | 2021-11-25 13:25:48 +0000 |
commit | a41acc89a8c7177014d1377c4457cd402ed7ee93 (patch) | |
tree | 47eb78295c696d7281bc772e346ec260cd114ce1 /models/src/main | |
parent | 7443b9a5ddca988ad4338e2b6597d6fdce552909 (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')
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); } /** |