Commit aec7a75a authored by Kostis Trantzas's avatar Kostis Trantzas
Browse files

Merge branch 'tmf628' into 'develop'

Fixes for DB connection leaks for metrico transactions

See merge request !56
parents 8dfaaecd 72fc080d
Loading
Loading
Loading
Loading
Loading
+3 −5
Original line number Original line Diff line number Diff line
package org.etsi.osl.tmf.pm628.repo;
package org.etsi.osl.tmf.pm628.repo;


import java.util.Optional;
import org.etsi.osl.tmf.pm628.model.ExecutionStateType;
import org.etsi.osl.tmf.pm628.model.ExecutionStateType;
import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob;
import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Repository;


import java.util.Optional;

@Repository
@Repository
public interface MeasurementCollectionJobRepository extends CrudRepository<MeasurementCollectionJob, Long>, PagingAndSortingRepository<MeasurementCollectionJob, Long> {
public interface MeasurementCollectionJobRepository extends JpaRepository <MeasurementCollectionJob, Long> {
    Optional<MeasurementCollectionJob> findByUuid(String uuid);
    Optional<MeasurementCollectionJob> findByUuid(String uuid);


    Iterable<MeasurementCollectionJob> findByExecutionState(ExecutionStateType executionState);
    Iterable<MeasurementCollectionJob> findByExecutionState(ExecutionStateType executionState);
+35 −22
Original line number Original line Diff line number Diff line
@@ -6,6 +6,7 @@ import jakarta.validation.Valid;
import org.etsi.osl.tmf.pm628.api.MeasurementCollectionJobApiRouteBuilderEvents;
import org.etsi.osl.tmf.pm628.api.MeasurementCollectionJobApiRouteBuilderEvents;
import org.etsi.osl.tmf.pm628.model.*;
import org.etsi.osl.tmf.pm628.model.*;
import org.etsi.osl.tmf.pm628.repo.MeasurementCollectionJobRepository;
import org.etsi.osl.tmf.pm628.repo.MeasurementCollectionJobRepository;
import org.etsi.osl.tmf.so641.model.ServiceOrder;
import org.hibernate.Hibernate;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.SessionFactory;
@@ -15,11 +16,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Transactional;


import java.io.UnsupportedEncodingException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.nio.charset.StandardCharsets;
import java.time.OffsetDateTime;
import java.util.*;
import java.util.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -288,22 +291,23 @@ public class MeasurementCollectionJobService {
      ObjectMapper mapper = new ObjectMapper();
      ObjectMapper mapper = new ObjectMapper();
      mapper.registerModule(new Hibernate5JakartaModule());
      mapper.registerModule(new Hibernate5JakartaModule());
      String res = mapper.writeValueAsString(mcj);
      String res = mapper.writeValueAsString(mcj);
      
      log.debug("=====> MCJObjectMapper {}", res);
      return res;
      return res;


    }
    }
    
    


    @Transactional
    private MeasurementCollectionJob findMeasurementCollectionJobByUuidEager(String id) {
    private MeasurementCollectionJob findMeasurementCollectionJobByUuidEager(String id) {
      if (id == null || id.equals("")) {
      if (id == null || id.equals("")) {
        return null;
        return null;
      }
      }
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
      MeasurementCollectionJob s = null;
      MeasurementCollectionJob s = null;
    try {
      try (Session session = sessionFactory.openSession()) {
        Transaction tx = session.beginTransaction();
        s = (MeasurementCollectionJob) session.get(MeasurementCollectionJob.class, id);
        s = (MeasurementCollectionJob) session.get(MeasurementCollectionJob.class, id);
        if (s == null) {
        if (s == null) {
          log.debug("=====> findMeasurementCollectionJobByUuidEager last resort");
          return this.findMeasurementCollectionJobByUuid(id);// last resort
          return this.findMeasurementCollectionJobByUuid(id);// last resort
        }
        }


@@ -315,31 +319,35 @@ public class MeasurementCollectionJobService {
        Hibernate.initialize(s.getTrackingRecord());
        Hibernate.initialize(s.getTrackingRecord());


        tx.commit();
        tx.commit();
    } finally {
      } catch (Exception e) {
        session.close();
        e.printStackTrace();
      }
      }


      return s;
      return s;
    }
    }


    @Transactional
    public MeasurementCollectionJob findMeasurementCollectionJobByUuid(String uuid){
    public MeasurementCollectionJob findMeasurementCollectionJobByUuid(String uuid){
        log.debug("MeasurementCollectionJob FIND BY UUID");
        log.debug("MeasurementCollectionJob FIND BY UUID");
        Optional<MeasurementCollectionJob> measurementCollectionJob = measurementCollectionJobRepository.findByUuid(uuid);
        Optional<MeasurementCollectionJob> measurementCollectionJob = measurementCollectionJobRepository.findByUuid(uuid);
        return measurementCollectionJob.orElse(null);
        return measurementCollectionJob.orElse(null);
    }
    }


    @Transactional
    public MeasurementCollectionJob createMeasurementCollectionJob(MeasurementCollectionJobFVO measurementCollectionJobFVO){
    public MeasurementCollectionJob createMeasurementCollectionJob(MeasurementCollectionJobFVO measurementCollectionJobFVO){
        log.debug("MeasurementCollectionJob CREATE: {}", measurementCollectionJobFVO);
        log.debug("MeasurementCollectionJob CREATE: {}", measurementCollectionJobFVO);


        MeasurementCollectionJobMapper mapper = Mappers.getMapper(MeasurementCollectionJobMapper.class);
        MeasurementCollectionJobMapper mapper = Mappers.getMapper(MeasurementCollectionJobMapper.class);
        MeasurementCollectionJob mcj = mapper.createMeasurementCollectionJob(measurementCollectionJobFVO);
        MeasurementCollectionJob mcj = mapper.createMeasurementCollectionJob(measurementCollectionJobFVO);

        mcj.setCreationTime( OffsetDateTime.now() );
        mcj = this.measurementCollectionJobRepository.save(mcj);
        mcj.setLastModifiedTime( OffsetDateTime.now());
        mcj = this.measurementCollectionJobRepository.saveAndFlush(mcj);
        raiseMCJCreateNotification(mcj);
        raiseMCJCreateNotification(mcj);


        return mcj;
        return mcj;
    }
    }


    @Transactional
    public MeasurementCollectionJob updateMeasurementCollectionJob(String uuid, @Valid MeasurementCollectionJobMVO measurementCollectionJobUpdate){
    public MeasurementCollectionJob updateMeasurementCollectionJob(String uuid, @Valid MeasurementCollectionJobMVO measurementCollectionJobUpdate){
        log.debug("MeasurementCollectionJob UPDATE with UUID: {}", uuid);
        log.debug("MeasurementCollectionJob UPDATE with UUID: {}", uuid);


@@ -352,8 +360,10 @@ public class MeasurementCollectionJobService {
        MeasurementCollectionJobMapper mapper = Mappers.getMapper(MeasurementCollectionJobMapper.class);
        MeasurementCollectionJobMapper mapper = Mappers.getMapper(MeasurementCollectionJobMapper.class);
        measurementCollectionJob = mapper.updateMeasurementCollectionJob(measurementCollectionJobUpdate, measurementCollectionJob);
        measurementCollectionJob = mapper.updateMeasurementCollectionJob(measurementCollectionJobUpdate, measurementCollectionJob);


        measurementCollectionJob.setLastModifiedTime( OffsetDateTime.now());
        measurementCollectionJob = this.measurementCollectionJobRepository.save(measurementCollectionJob);
        measurementCollectionJob = this.measurementCollectionJobRepository.save(measurementCollectionJob);


        
        // This may be unnecessary since MeasurementCollectionJobMVO doesn't have the executionState attribute
        // This may be unnecessary since MeasurementCollectionJobMVO doesn't have the executionState attribute
        if ( originalExecutionState!=null) {
        if ( originalExecutionState!=null) {
          executionStateChanged = !originalExecutionState.equals(measurementCollectionJob.getExecutionState());          
          executionStateChanged = !originalExecutionState.equals(measurementCollectionJob.getExecutionState());          
@@ -373,12 +383,12 @@ public class MeasurementCollectionJobService {
        MeasurementCollectionJob measurementCollectionJob = measurementCollectionJobRepository.findByUuid(uuid)
        MeasurementCollectionJob measurementCollectionJob = measurementCollectionJobRepository.findByUuid(uuid)
                .orElseThrow(() -> new IllegalArgumentException("No MeasurementCollectionJob with UUID: " + uuid));
                .orElseThrow(() -> new IllegalArgumentException("No MeasurementCollectionJob with UUID: " + uuid));
        measurementCollectionJobRepository.delete(measurementCollectionJob);
        measurementCollectionJobRepository.delete(measurementCollectionJob);

        raiseMCJDeleteNotification(measurementCollectionJob);
        raiseMCJDeleteNotification(measurementCollectionJob);


        return null;
        return null;
    }
    }


    @Transactional(propagation = Propagation.REQUIRES_NEW)
    private void raiseMCJCreateNotification(MeasurementCollectionJob mcj){
    private void raiseMCJCreateNotification(MeasurementCollectionJob mcj){
        // Create the event payload
        // Create the event payload
        MeasurementCollectionJobRef ref = new MeasurementCollectionJobRef();
        MeasurementCollectionJobRef ref = new MeasurementCollectionJobRef();
@@ -399,6 +409,7 @@ public class MeasurementCollectionJobService {
        routeBuilderEvents.publishEvent(event, mcj.getUuid());
        routeBuilderEvents.publishEvent(event, mcj.getUuid());
    }
    }


    @Transactional
    private void raiseMCJAttributeValueChangeNotification(MeasurementCollectionJob mcj){
    private void raiseMCJAttributeValueChangeNotification(MeasurementCollectionJob mcj){


        // Create the event payload
        // Create the event payload
@@ -414,6 +425,7 @@ public class MeasurementCollectionJobService {
        routeBuilderEvents.publishEvent(event, mcj.getUuid());
        routeBuilderEvents.publishEvent(event, mcj.getUuid());
    }
    }


    @Transactional
    private void raiseMCJExecutionStateChangeNotification(MeasurementCollectionJob mcj){
    private void raiseMCJExecutionStateChangeNotification(MeasurementCollectionJob mcj){


        // Create the event payload
        // Create the event payload
@@ -429,6 +441,7 @@ public class MeasurementCollectionJobService {
        routeBuilderEvents.publishEvent(event, mcj.getUuid());
        routeBuilderEvents.publishEvent(event, mcj.getUuid());
    }
    }


    @Transactional
    private void raiseMCJDeleteNotification(MeasurementCollectionJob mcj){
    private void raiseMCJDeleteNotification(MeasurementCollectionJob mcj){


        // Create the event payload
        // Create the event payload
+7 −4
Original line number Original line Diff line number Diff line
@@ -49,10 +49,13 @@ spring:
    username: root
    username: root
    hikari:
    hikari:
       minimumIdle: 2
       minimumIdle: 2
       maximumPoolSize: 40
       maximumPoolSize: 20
       idleTimeout: 120000
       idleTimeout: 20000
       connectionTimeout: 400000
       idle-timeout: 20000
       leakDetectionThreshold: 100000
       connectionTimeout: 40000
       leakDetectionThreshold: 30000
       
       
  jpa:
  jpa:
    database-platform: org.etsi.osl.tmf.LocalMysqlDialect
    database-platform: org.etsi.osl.tmf.LocalMysqlDialect
    hibernate:
    hibernate:
+35 −0
Original line number Original line Diff line number Diff line
package org.etsi.osl.services.api.pm628;
package org.etsi.osl.services.api.pm628;


import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.IOUtils;
@@ -114,6 +115,7 @@ public class MeasurementCollectionJobApiControllerTest {
        assertThat(mcj2.getReportingPeriod()).isEqualTo(mcj.getReportingPeriod());
        assertThat(mcj2.getReportingPeriod()).isEqualTo(mcj.getReportingPeriod());
    }
    }


    
    @WithMockUser(username="osadmin", roles = {"USER","ADMIN"})
    @WithMockUser(username="osadmin", roles = {"USER","ADMIN"})
    @Test
    @Test
    public void testCreateMeasurementCollectionJob() throws Exception {
    public void testCreateMeasurementCollectionJob() throws Exception {
@@ -126,6 +128,39 @@ public class MeasurementCollectionJobApiControllerTest {
        assertThat(mcj.getExecutionState()).isEqualTo(ExecutionStateType.ACKNOWLEDGED);
        assertThat(mcj.getExecutionState()).isEqualTo(ExecutionStateType.ACKNOWLEDGED);
        assertThat(mcj.getGranularity()).isEqualTo(Granularity.fromValue("g_1mn"));
        assertThat(mcj.getGranularity()).isEqualTo(Granularity.fromValue("g_1mn"));
        assertThat(mcj.getReportingPeriod()).isEqualTo(ReportingPeriod.fromValue("r_1mn"));
        assertThat(mcj.getReportingPeriod()).isEqualTo(ReportingPeriod.fromValue("r_1mn"));
        
        
     // Create the event
        MeasurementCollectionJobRef ref = new MeasurementCollectionJobRef();
        ref.setId(mcj.getUuid());
        ref.setHref(mcj.getHref());
        ref.setName("MeasurementCollectionJob");
        
        MeasurementCollectionJobCreateEventPayload payload = new MeasurementCollectionJobCreateEventPayload();
        payload.setMeasurementCollectionJob(ref);

        MeasurementCollectionJobCreateEvent event = new MeasurementCollectionJobCreateEvent();
        event.setTitle("MeasurementCollectionJob created");
        event.setDescription("MeasurementCollectionJob with UUID: " + mcj.getUuid() + " has been created");
        event.setEvent(payload);

        String apayload = toJsonString(event);
        
        MeasurementCollectionJobCreateEvent eventresponse = toJsonObj (apayload, MeasurementCollectionJobCreateEvent.class);
        assertThat(eventresponse.getEvent().getMeasurementCollectionJob()).isNotNull();
    }
    

    static String toJsonString(Object object) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return mapper.writeValueAsString(object);
    }

    static <T> T toJsonObj(String content, Class<T> valueType)  throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return mapper.readValue( content, valueType);
    }
    }


    @WithMockUser(username="osadmin", roles = {"USER","ADMIN"})
    @WithMockUser(username="osadmin", roles = {"USER","ADMIN"})