From 36501e2784dcc34b046f0e54d42eb0f0b22caa24 Mon Sep 17 00:00:00 2001
From: Michael Breu <Michael.Breu@arctis.at>
Date: Thu, 20 Jun 2024 09:40:22 +0200
Subject: [PATCH] Finally correct version

---
 .../jpa/PersistenceAuditEventRepository.java  |   6 +
 .../gitsearch/service/AuditEventService.java  |   6 +-
 .../service/AuditEventServiceIT.java          | 111 +++++++-----------
 3 files changed, 52 insertions(+), 71 deletions(-)

diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/jpa/PersistenceAuditEventRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/jpa/PersistenceAuditEventRepository.java
index 316fb96ba..31526909b 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/jpa/PersistenceAuditEventRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/jpa/PersistenceAuditEventRepository.java
@@ -19,5 +19,11 @@ public interface PersistenceAuditEventRepository extends JpaRepository<Persisten
 
   List<PersistentAuditEvent> findTop1000ByAuditEventDateBefore(Instant before);
 
+  /**
+   *
+   * Unsafe due to https://hibernate.atlassian.net/browse/HHH-5529.
+   * May be solved when migrating to hibernate > 6.0.0.Beta2
+   */
+
   int deleteByAuditEventDateBefore(Instant before);
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/AuditEventService.java b/src/main/java/at/ac/uibk/gitsearch/service/AuditEventService.java
index 9047b5306..51f140789 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/AuditEventService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/AuditEventService.java
@@ -17,7 +17,6 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.TransactionDefinition;
-import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionTemplate;
@@ -32,7 +31,6 @@ import tech.jhipster.config.JHipsterProperties;
 @Transactional
 public class AuditEventService {
 
-  @SuppressWarnings("unused")
   private static final Logger LOGGER = LoggerFactory.getLogger(AuditEventService.class);
 
   private final JHipsterProperties jHipsterProperties;
@@ -61,6 +59,7 @@ public class AuditEventService {
    * This is scheduled to get fired at 11:00 (pm) UTC.
    */
   @Scheduled(cron = "0 0 23 * * ?")
+  @Transactional(propagation = Propagation.REQUIRES_NEW)
   public int removeOldAuditEvents() {
     final TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager);
     isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
@@ -81,10 +80,11 @@ public class AuditEventService {
           return !auditEventDeleteCandidates.isEmpty();
         });
     }
+    LOGGER.info("Cleaned Up {} outdated audit events", count.intValue());
     return count.intValue();
   }
 
-  @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_UNCOMMITTED)
+  @Transactional(propagation = Propagation.REQUIRES_NEW)
   public int removeOldAuditEvents2() {
     Instant deleteBefore = Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS);
     return this.persistenceAuditEventRepository.deleteByAuditEventDateBefore(deleteBefore);
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java
index c309423af..21ed73eeb 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java
@@ -12,8 +12,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
-import org.junit.Assert;
-import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,9 +22,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.TransactionDefinition;
-import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.support.TransactionCallback;
 import org.springframework.transaction.support.TransactionTemplate;
 
 import tech.jhipster.config.JHipsterProperties;
@@ -61,15 +60,7 @@ public class AuditEventServiceIT {
 
   @BeforeEach
   @Timeout(value = 5, unit = TimeUnit.MINUTES)
-  public void init() {
-      persistenceAuditEventRepository.deleteAll();
-    currentAuditLogs = persistenceAuditEventRepository.findAll().size();
-    log.info("There where already {}  AuditEvents", currentAuditLogs);
-    final List<PersistentAuditEvent> auditEventDeleteCandidates = persistenceAuditEventRepository.findTop1000ByAuditEventDateBefore(
-      Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS)
-    );
-    Assert.assertTrue("There are already outdated Elements?", auditEventDeleteCandidates.size() == 0);
-
+  public void writevariousLogs() {
     log.info("Preparing {} outdated AuditEvents", MAX_OUTDATEDVALUES);
     auditEventsOld = new ArrayList<>();
     for (int i = 1; i <= MAX_OUTDATEDVALUES; i++) {
@@ -80,7 +71,8 @@ public class AuditEventServiceIT {
       auditEventOld.setPrincipal("test-user-old");
       auditEventOld.setAuditEventType("test-type");
 
-      auditEventOld.getData().put("someDate", "someValue" + i);
+      auditEventOld.getData().put("someData", "someValue" + i);
+      auditEventOld.getData().put("someExtraData", "secondValue" + 2 * i);
       auditEventsOld.add(auditEventOld);
     }
     log.info("Prepared {} outdated AuditEvents", MAX_OUTDATEDVALUES);
@@ -95,80 +87,63 @@ public class AuditEventServiceIT {
     auditEventNew.setAuditEventDate(Instant.now());
     auditEventNew.setPrincipal("test-user-new");
     auditEventNew.setAuditEventType("test-type");
+
+    TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager);
+    isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+
+    isolatedTransactionTemplate.executeWithoutResult(status -> {
+      persistenceAuditEventRepository.deleteAll();
+      currentAuditLogs = persistenceAuditEventRepository.findAll().size();
+      persistenceAuditEventRepository.saveAll(auditEventsOld);
+      persistenceAuditEventRepository.save(auditEventWithinRetention);
+      persistenceAuditEventRepository.save(auditEventNew);
+      persistenceAuditEventRepository.flush();
+      assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + auditEventsOld.size() + 2);
+      log.info("Saved {} outdated AuditEvents into database", auditEventsOld.size());
+    });
   }
 
   @Test
-  @Disabled // currently not working
   @Timeout(value = 5, unit = TimeUnit.MINUTES)
   @DirtiesContext
   public void verifyOldAuditEventsAreDeleted() {
-    TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager);
-    isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
-
-    auditEventsOld.forEach(auditEventOld -> persistenceAuditEventRepository.save(auditEventOld));
-    persistenceAuditEventRepository.save(auditEventWithinRetention);
-    persistenceAuditEventRepository.save(auditEventNew);
-
-    persistenceAuditEventRepository.flush();
-
     assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + auditEventsOld.size() + 2);
 
-    isolatedTransactionTemplate.execute(
-      new TransactionCallback<Boolean>() {
-        @Override
-        public Boolean doInTransaction(TransactionStatus status) {
-          log.info("Saved {} outdated AuditEvents", MAX_OUTDATEDVALUES);
-          assertThat(persistenceAuditEventRepository.findAll().size()).isGreaterThan(MAX_OUTDATEDVALUES);
-
-          log.info("Removing outdated AuditEvents");
-          int count = auditEventService.removeOldAuditEvents();
-          // persistenceAuditEventRepository.flush();
-
-          log.info("Removed {} outdated AuditEvents", count);
-          return true;
-        }
-      }
-    );
+    log.info("Removing outdated AuditEvents");
+    int deleted = auditEventService.removeOldAuditEvents();
+    assertThat(deleted).isEqualTo(MAX_OUTDATEDVALUES);
+    log.info("Removed {} outdated AuditEvents", deleted);
 
-    assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + 2);
-    assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty();
-    assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty();
-    assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty();
+    TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager);
+    isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+    isolatedTransactionTemplate.executeWithoutResult(status -> {
+      assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + 2);
+      assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty();
+      assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty();
+      assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty();
+    });
   }
 
   @Test
-  //  @Disabled // currently not working
+  // @Disabled // currently not working
   @Timeout(value = 5, unit = TimeUnit.MINUTES)
   @DirtiesContext
   public void verifyOldAuditEventsAreDeleted2() {
-    persistenceAuditEventRepository.deleteAll();
-    persistenceAuditEventRepository.saveAll(auditEventsOld);
-
-    Assertions.assertTrue(
-      auditEventsOld
-        .stream()
-        .map(PersistentAuditEvent::getAuditEventDate)
-        .allMatch(d -> d.isBefore(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS)))
-    );
-
-    Assertions.assertTrue(
-      persistenceAuditEventRepository
-        .findAll()
-        .stream()
-        .map(PersistentAuditEvent::getAuditEventDate)
-        .allMatch(d -> d.isBefore(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS)))
-    );
-
     persistenceAuditEventRepository.save(auditEventWithinRetention);
     persistenceAuditEventRepository.save(auditEventNew);
 
     assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + auditEventsOld.size() + 2);
 
-    this.auditEventService.removeOldAuditEvents2();
+    int deleted = this.auditEventService.removeOldAuditEvents2();
+    assertThat(deleted).isEqualTo(MAX_OUTDATEDVALUES);
 
-    assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + 2);
-    assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty();
-    assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty();
-    assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty();
+    TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager);
+    isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+    isolatedTransactionTemplate.executeWithoutResult(status -> {
+      assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + 2);
+      assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty();
+      assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty();
+      assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty();
+    });
   }
 }
-- 
GitLab