From a88c9a232d486865ce007886daff56392ebf2d7b Mon Sep 17 00:00:00 2001 From: FrancescoFioraEst Date: Tue, 2 Nov 2021 16:08:46 +0000 Subject: Add support transaction in Statistics Providers Add support transaction in ClElementStatisticsProvider and ParticipantStatisticsProvider Issue-ID: POLICY-3801 Change-Id: Iaf9d55a268627f9d548afdf108476441b19e1413 Signed-off-by: FrancescoFioraEst --- .../provider/ClElementStatisticsProvider.java | 69 +++++++++------------- .../provider/ParticipantStatisticsProvider.java | 61 ++++++++----------- .../repository/ClElementStatisticsRepository.java | 32 ++++++++++ .../persistence/repository/FilterRepository.java | 53 +++++++++++++++++ .../repository/FilterRepositoryImpl.java | 51 ++++++++++++++++ .../ParticipantStatisticsRepository.java | 32 ++++++++++ 6 files changed, 219 insertions(+), 79 deletions(-) create mode 100644 models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ClElementStatisticsRepository.java create mode 100644 models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepository.java create mode 100644 models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepositoryImpl.java create mode 100644 models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ParticipantStatisticsRepository.java (limited to 'models/src/main/java') diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java index e5b062bc1..bdb0d4d9b 100644 --- a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java @@ -21,19 +21,20 @@ package org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider; import java.time.Instant; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import javax.ws.rs.core.Response.Status; +import lombok.AllArgsConstructor; import lombok.NonNull; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ClElementStatisticsRepository; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.base.PfReferenceTimestampKey; import org.onap.policy.models.dao.PfFilterParameters; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; -import org.onap.policy.models.provider.impl.AbstractModelsProvider; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; /** * This class provides the provision of information on control loop element statistics in the database to callers. @@ -41,46 +42,34 @@ import org.springframework.stereotype.Component; * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech) */ @Component -public class ClElementStatisticsProvider extends AbstractModelsProvider { +@Transactional +@AllArgsConstructor +public class ClElementStatisticsProvider { - /** - * Create a provider for control loop element statistics. - * - * @param parameters the parameters for database access - * @throws PfModelException on initiation errors - */ - public ClElementStatisticsProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException { - super(parameters); - this.init(); - } + private ClElementStatisticsRepository clElementStatisticsRepository; /** * Creates control loop element statistics. * * @param clElementStatisticsList a specification of the CL element statistics to create * @return the clElement statistics created - * @throws PfModelException on errors creating clElement statistics + * @throws PfModelException on initiation errors */ public List createClElementStatistics( @NonNull final List clElementStatisticsList) throws PfModelException { - List jpaClElementStatisticsList = ProviderUtils.getJpaAndValidate( - clElementStatisticsList, JpaClElementStatistics::new, "control loop element statistics"); + try { + var jpaClElementStatisticsList = ProviderUtils.getJpaAndValidate(clElementStatisticsList, + JpaClElementStatistics::new, "control loop element statistics"); - jpaClElementStatisticsList.forEach(jpaClElementStatistics -> getPfDao().create(jpaClElementStatistics)); + var jpaClElementStatisticsSaved = clElementStatisticsRepository.saveAll(jpaClElementStatisticsList); - // Return the created control loop element statistics - List elementStatistics = new ArrayList<>(clElementStatisticsList.size()); - - for (ClElementStatistics clElementStat : clElementStatisticsList) { - var jpaClElementStatistics = getPfDao().get(JpaClElementStatistics.class, - new PfReferenceTimestampKey(clElementStat.getParticipantId().getName(), - clElementStat.getParticipantId().getVersion(), clElementStat.getId().toString(), - clElementStat.getTimeStamp())); - elementStatistics.add(jpaClElementStatistics.toAuthorative()); + // Return the saved control loop element statistics + return asClElementStatisticsList(jpaClElementStatisticsSaved); + } catch (IllegalArgumentException e) { + throw new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error in save control loop element statistics", + e); } - - return elementStatistics; } /** @@ -101,22 +90,17 @@ public class ClElementStatisticsProvider extends AbstractModelsProvider { * @param id of the control loop element * @param timestamp timestamp of the statistics * @return the clElement statistics found - * @throws PfModelException on errors getting clElement statistics */ + @Transactional(readOnly = true) public List getClElementStatistics(final String name, final String version, final String id, - final Instant timestamp) throws PfModelException { - List clElementStatistics = new ArrayList<>(1); + final Instant timestamp) { if (name != null && version != null && timestamp != null && id != null) { - clElementStatistics.add(getPfDao() - .get(JpaClElementStatistics.class, new PfReferenceTimestampKey(name, version, id, timestamp)) - .toAuthorative()); - return clElementStatistics; + return asClElementStatisticsList(clElementStatisticsRepository + .findAllById(List.of(new PfReferenceTimestampKey(name, version, id, timestamp)))); } else if (name != null) { - clElementStatistics.addAll(getFilteredClElementStatistics(name, version, null, null, null, "DESC", 0)); - } else { - clElementStatistics.addAll(asClElementStatisticsList(getPfDao().getAll(JpaClElementStatistics.class))); + return getFilteredClElementStatistics(name, version, null, null, null, "DESC", 0); } - return clElementStatistics; + return asClElementStatisticsList(clElementStatisticsRepository.findAll()); } /** @@ -130,8 +114,8 @@ public class ClElementStatisticsProvider extends AbstractModelsProvider { * @param getRecordNum Total query count from database * @param filterMap the filters to apply to the get operation * @return the clElement statistics found - * @throws PfModelException on errors getting policies */ + @Transactional(readOnly = true) public List getFilteredClElementStatistics(final String name, final String version, final Instant startTimeStamp, final Instant endTimeStamp, Map filterMap, final String sortOrder, final int getRecordNum) { @@ -148,6 +132,7 @@ public class ClElementStatisticsProvider extends AbstractModelsProvider { .recordNum(getRecordNum) .build(); // @formatter:on - return asClElementStatisticsList(getPfDao().getFiltered(JpaClElementStatistics.class, filterParams)); + return asClElementStatisticsList( + clElementStatisticsRepository.getFiltered(JpaClElementStatistics.class, filterParams)); } } diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java index fa27a41c2..06c7a11f8 100644 --- a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java @@ -21,36 +21,30 @@ package org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider; import java.time.Instant; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import javax.ws.rs.core.Response.Status; +import lombok.AllArgsConstructor; import lombok.NonNull; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ParticipantStatisticsRepository; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.base.PfTimestampKey; import org.onap.policy.models.dao.PfFilterParameters; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; -import org.onap.policy.models.provider.impl.AbstractModelsProvider; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; /** * This class provides the provision of information on participant statistics in the database to callers. */ @Component -public class ParticipantStatisticsProvider extends AbstractModelsProvider { +@Transactional +@AllArgsConstructor +public class ParticipantStatisticsProvider { - /** - * Create a provider for control loops statistics. - * - * @param parameters the parameters for database access - * @throws PfModelException on initiation errors - */ - public ParticipantStatisticsProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException { - super(parameters); - this.init(); - } + private ParticipantStatisticsRepository participantStatisticsRepository; /** * Get Participant statistics. @@ -59,20 +53,18 @@ public class ParticipantStatisticsProvider extends AbstractModelsProvider { * @param version the version of the participant statistics to get, null to get all stats for a name * @param timestamp the time stamp for the stats to get * @return the participant statistics found - * @throws PfModelException on errors getting participant statistics */ + @Transactional(readOnly = true) public List getParticipantStatistics(final String name, final String version, - final Instant timestamp) throws PfModelException { + final Instant timestamp) { if (name != null && version != null && timestamp != null) { - List participantStatistics = new ArrayList<>(1); - participantStatistics.add(getPfDao() - .get(JpaParticipantStatistics.class, new PfTimestampKey(name, version, timestamp)).toAuthorative()); - return participantStatistics; + return asParticipantStatisticsList( + participantStatisticsRepository.findAllById(List.of(new PfTimestampKey(name, version, timestamp)))); } else if (name != null) { return getFilteredParticipantStatistics(name, version, timestamp, null, null, "DESC", 0); } else { - return asParticipantStatisticsList(getPfDao().getAll(JpaParticipantStatistics.class)); + return asParticipantStatisticsList(participantStatisticsRepository.findAll()); } } @@ -87,8 +79,8 @@ public class ParticipantStatisticsProvider extends AbstractModelsProvider { * @param getRecordNum Total query count from database * @param filterMap the filters to apply to the get operation * @return the participant statistics found - * @throws PfModelException on errors getting policies */ + @Transactional(readOnly = true) public List getFilteredParticipantStatistics(final String name, final String version, final Instant startTimeStamp, final Instant endTimeStamp, Map filterMap, final String sortOrder, final int getRecordNum) { @@ -106,7 +98,8 @@ public class ParticipantStatisticsProvider extends AbstractModelsProvider { .build(); // @formatter:on - return asParticipantStatisticsList(getPfDao().getFiltered(JpaParticipantStatistics.class, filterParams)); + return asParticipantStatisticsList( + participantStatisticsRepository.getFiltered(JpaParticipantStatistics.class, filterParams)); } /** @@ -119,23 +112,17 @@ public class ParticipantStatisticsProvider extends AbstractModelsProvider { public List createParticipantStatistics( @NonNull final List participantStatisticsList) throws PfModelException { - List jpaParticipantStatisticsList = ProviderUtils - .getJpaAndValidate(participantStatisticsList, JpaParticipantStatistics::new, "Participant Statistics"); - - jpaParticipantStatisticsList.forEach(jpaParticipantStatistics -> getPfDao().update(jpaParticipantStatistics)); + try { + var jpaParticipantStatisticsList = ProviderUtils.getJpaAndValidate(participantStatisticsList, + JpaParticipantStatistics::new, "Participant Statistics"); - // Return the created participant statistics - List participantStatistics = new ArrayList<>(participantStatisticsList.size()); + var jpaParticipantStatisticsSaved = participantStatisticsRepository.saveAll(jpaParticipantStatisticsList); - for (ParticipantStatistics participantStatisticsItem : participantStatisticsList) { - var jpaParticipantStatistics = getPfDao().get(JpaParticipantStatistics.class, - new PfTimestampKey(participantStatisticsItem.getParticipantId().getName(), - participantStatisticsItem.getParticipantId().getVersion(), - participantStatisticsItem.getTimeStamp())); - participantStatistics.add(jpaParticipantStatistics.toAuthorative()); + // Return the saved participant statistics + return asParticipantStatisticsList(jpaParticipantStatisticsSaved); + } catch (IllegalArgumentException e) { + throw new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error in save participant statistics", e); } - - return participantStatistics; } /** diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ClElementStatisticsRepository.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ClElementStatisticsRepository.java new file mode 100644 index 000000000..1e07a4fe6 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ClElementStatisticsRepository.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository; + +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics; +import org.onap.policy.models.base.PfReferenceTimestampKey; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ClElementStatisticsRepository + extends JpaRepository, FilterRepository { + +} diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepository.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepository.java new file mode 100644 index 000000000..ce1f3d8c3 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepository.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository; + +import java.util.List; +import org.onap.policy.models.base.PfConcept; +import org.onap.policy.models.dao.PfFilterParametersIntfc; + +public interface FilterRepository { + + /** + * Get an object from the database, referred to by concept key. + * + * @param the type of the object to get, a subclass of {@link PfConcept} + * @param someClass the class of the object to get, a subclass of {@link PfConcept}, if name is null, all concepts + * of type T are returned, if name is not null and version is null, all versions of that concept matching the + * name are returned. + * @param filterParams filter parameters + * @return the objects that was retrieved from the database + */ + List getFiltered(Class someClass, PfFilterParametersIntfc filterParams); + + /** + * Get an object from the database, referred to by concept key. + * + * @param the type of the object to get, a subclass of {@link PfConcept} + * @param someClass the class of the object to get, a subclass of {@link PfConcept}, if name is null, all concepts + * of type T are returned, if name is not null and version is null, all versions of that concept matching the + * name are returned. + * @param name the name of the object to get, null returns all objects + * @param version the version the object to get, null returns all objects for a specified name + * @return the objects that was retrieved from the database + */ + List getFiltered(Class someClass, String name, String version); +} diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepositoryImpl.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepositoryImpl.java new file mode 100644 index 000000000..0dc8fc373 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepositoryImpl.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository; + +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import org.onap.policy.models.base.PfConcept; +import org.onap.policy.models.dao.PfDao; +import org.onap.policy.models.dao.PfFilterParametersIntfc; +import org.onap.policy.models.dao.impl.ProxyDao; +import org.springframework.stereotype.Repository; + +@Repository +public class FilterRepositoryImpl implements FilterRepository { + + @PersistenceContext + private EntityManager entityManager; + + protected PfDao getPfDao() { + return new ProxyDao(entityManager); + } + + @Override + public List getFiltered(Class someClass, PfFilterParametersIntfc filterParams) { + return getPfDao().getFiltered(someClass, filterParams); + } + + @Override + public List getFiltered(Class someClass, String name, String version) { + return getPfDao().getFiltered(someClass, name, version); + } +} diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ParticipantStatisticsRepository.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ParticipantStatisticsRepository.java new file mode 100644 index 000000000..6fecd6143 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ParticipantStatisticsRepository.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository; + +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics; +import org.onap.policy.models.base.PfTimestampKey; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ParticipantStatisticsRepository + extends JpaRepository, FilterRepository { + +} -- cgit 1.2.3-korg