From 572a81747ffe72f5ef9e370c6c6f6fa2d988f1c0 Mon Sep 17 00:00:00 2001 From: Fabrice Bellingard Date: Tue, 17 May 2011 17:29:25 +0200 Subject: [PATCH] SONAR-2347 Close review when resource does not exist anymore --- .../core/sensors/CloseReviewsDecorator.java | 31 ++++++++++++++----- .../sensors/CloseReviewsDecoratorTest.java | 2 +- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/CloseReviewsDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/CloseReviewsDecorator.java index e24e5c1289e..2a729a8e88e 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/CloseReviewsDecorator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/sensors/CloseReviewsDecorator.java @@ -19,6 +19,8 @@ */ package org.sonar.plugins.core.sensors; +import javax.persistence.Query; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.batch.Decorator; @@ -29,10 +31,9 @@ import org.sonar.api.database.DatabaseSession; import org.sonar.api.database.model.Snapshot; import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; +import org.sonar.api.resources.ResourceUtils; import org.sonar.batch.index.ResourcePersister; -import javax.persistence.Query; - /** * Decorator that currently only closes a review when its corresponding violation has been fixed. */ @@ -50,7 +51,7 @@ public class CloseReviewsDecorator implements Decorator { } public boolean shouldExecuteOnProject(Project project) { - return true; + return project.isLatestAnalysis(); } public void decorate(Resource resource, DecoratorContext context) { @@ -58,16 +59,32 @@ public class CloseReviewsDecorator implements Decorator { if (currentSnapshot != null) { int resourceId = currentSnapshot.getResourceId(); int snapshotId = currentSnapshot.getId(); - Query query = databaseSession.createNativeQuery(generateSqlRequest(resourceId, snapshotId)); + Query query = databaseSession.createNativeQuery(generateUpdateOnResourceSqlRequest(resourceId, snapshotId)); int rowUpdated = query.executeUpdate(); LOG.debug("- {} reviews set to 'closed' on resource #{}", rowUpdated, resourceId); + + if (ResourceUtils.isProject(resource)) { + query = databaseSession.createNativeQuery(generateUpdateOnProjectSqlRequest(resourceId, currentSnapshot.getId())); + query.setParameter(1, Boolean.TRUE); + rowUpdated = query.executeUpdate(); + LOG.debug("- {} reviews set to 'closed' on project #{}", rowUpdated, resourceId); + } + databaseSession.commit(); } } - String generateSqlRequest(int resourceId, int snapshotId) { - return "UPDATE reviews SET status='CLOSED', updated_at=CURRENT_TIMESTAMP WHERE resource_id = " + resourceId + " AND rule_failure_permanent_id NOT IN " - + "(SELECT permanent_id FROM rule_failures WHERE snapshot_id = " + snapshotId + " AND permanent_id IS NOT NULL)"; + protected String generateUpdateOnResourceSqlRequest(int resourceId, int snapshotId) { + return "UPDATE reviews SET status='CLOSED', updated_at=CURRENT_TIMESTAMP WHERE resource_id = " + resourceId + + " AND rule_failure_permanent_id NOT IN " + "(SELECT permanent_id FROM rule_failures WHERE snapshot_id = " + snapshotId + + " AND permanent_id IS NOT NULL)"; + } + + protected String generateUpdateOnProjectSqlRequest(int projectId, int projectSnapshotId) { + return "UPDATE reviews rv SET status='CLOSED', updated_at=CURRENT_TIMESTAMP WHERE rv.status='OPEN' AND rv.project_id=" + projectId + + " AND rv.resource_id IN ( SELECT prev.project_id FROM snapshots prev WHERE prev.root_project_id=" + projectId + + " AND prev.islast=? AND NOT EXISTS ( SELECT cur.id FROM snapshots cur WHERE cur.root_snapshot_id=" + projectSnapshotId + + " AND cur.created_at > prev.created_at AND cur.root_project_id=" + projectId + " AND cur.project_id=prev.project_id ) )"; } } diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/sensors/CloseReviewsDecoratorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/sensors/CloseReviewsDecoratorTest.java index ea6d4a19aea..c4c2ff53c2d 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/sensors/CloseReviewsDecoratorTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/sensors/CloseReviewsDecoratorTest.java @@ -37,7 +37,7 @@ public class CloseReviewsDecoratorTest extends DatabaseTestCase { setupData("fixture"); CloseReviewsDecorator reviewsDecorator = new CloseReviewsDecorator(null, null); - String sqlRequest = reviewsDecorator.generateSqlRequest(666, 222); + String sqlRequest = reviewsDecorator.generateUpdateOnResourceSqlRequest(666, 222); Statement stmt = getConnection().createStatement(); int count = stmt.executeUpdate(sqlRequest); -- 2.39.5