]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-2428 Detect new violations, when new module added to project
authorEvgeny Mandrikov <mandrikov@gmail.com>
Tue, 14 Jun 2011 23:26:35 +0000 (03:26 +0400)
committerEvgeny Mandrikov <mandrikov@gmail.com>
Wed, 15 Jun 2011 16:42:21 +0000 (20:42 +0400)
sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshot.java
sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinderByPreviousAnalysis.java
sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinderByVersion.java
sonar-batch/src/test/java/org/sonar/batch/components/PastSnapshotFinderByPreviousAnalysisTest.java
sonar-batch/src/test/java/org/sonar/batch/components/PastSnapshotFinderByVersionTest.java

index 152dacce0f1e0be889b4a9323564a7e5c44ff04c..97886481de560ad08e4ab119d52f765670d98953 100644 (file)
@@ -54,7 +54,7 @@ public class PastSnapshot {
   }
 
   public boolean isRelatedToSnapshot() {
-    return projectSnapshot!=null;
+    return projectSnapshot != null;
   }
 
   public Snapshot getProjectSnapshot() {
@@ -62,7 +62,7 @@ public class PastSnapshot {
   }
 
   public Date getDate() {
-    return (projectSnapshot!=null ? projectSnapshot.getCreatedAt() : null);
+    return (projectSnapshot != null ? projectSnapshot.getCreatedAt() : null);
   }
 
   public String getMode() {
@@ -86,12 +86,10 @@ public class PastSnapshot {
     return (projectSnapshot != null ? projectSnapshot.getQualifier() : null);
   }
 
-
   public Date getTargetDate() {
     return targetDate;
   }
 
-
   @Override
   public String toString() {
     if (StringUtils.equals(mode, PastSnapshotFinderByVersion.MODE)) {
@@ -102,16 +100,20 @@ public class PastSnapshot {
       if (isRelatedToSnapshot()) {
         label += ", analysis of " + getDate();
       }
-      label+=")";
+      label += ")";
       return label;
     }
     if (StringUtils.equals(mode, CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS)) {
-      return String.format("Compare to previous analysis  (%s)", DateUtils.formatDate(getDate()));
+      String label = "Compare to previous analysis";
+      if (isRelatedToSnapshot()) {
+        label += String.format(" (%s)", DateUtils.formatDate(getDate()));
+      }
+      return label;
     }
     if (StringUtils.equals(mode, PastSnapshotFinderByDate.MODE)) {
       String label = "Compare to date " + DateUtils.formatDate(getTargetDate());
       if (isRelatedToSnapshot()) {
-        label += String.format("(analysis of %s)", DateUtils.formatDate(getDate()));
+        label += String.format(" (analysis of %s)", DateUtils.formatDate(getDate()));
       }
       return label;
     }
index d3eb23519e9c09be83d9d23c42cfce0fe725c5f6..5f8ca55592c174d3a078a05c310115c7deb09663 100644 (file)
@@ -27,6 +27,7 @@ import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.utils.DateUtils;
 
 import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 
 public class PastSnapshotFinderByPreviousAnalysis implements BatchExtension {
@@ -37,8 +38,15 @@ public class PastSnapshotFinderByPreviousAnalysis implements BatchExtension {
     this.session = session;
   }
 
+  /**
+   * See SONAR-2428 : even if past snapshot does not exist, we should perform comparison.
+   * In this case as a value for target date we use moment just before current snapshot
+   * to be able to perform strict comparison of dates.
+   * Also note that ruby side (resource viewer) has precision in one minute.
+   */
   PastSnapshot findByPreviousAnalysis(Snapshot projectSnapshot) {
-    String hql = "from " + Snapshot.class.getSimpleName() + " where createdAt<:date AND resourceId=:resourceId AND status=:status and last=:last and qualifier<>:lib order by createdAt desc";
+    String hql = "from " + Snapshot.class.getSimpleName()
+        + " where createdAt<:date AND resourceId=:resourceId AND status=:status and last=:last and qualifier<>:lib order by createdAt desc";
     List<Snapshot> snapshots = session.createQuery(hql)
         .setParameter("date", projectSnapshot.getCreatedAt())
         .setParameter("resourceId", projectSnapshot.getResourceId())
@@ -48,12 +56,16 @@ public class PastSnapshotFinderByPreviousAnalysis implements BatchExtension {
         .setMaxResults(1)
         .getResultList();
 
+    Snapshot snapshot;
+    Date targetDate;
     if (snapshots.isEmpty()) {
-      return null;
+      snapshot = null;
+      targetDate = new Date(projectSnapshot.getCreatedAt().getTime() - 1000 * 60);
+    } else {
+      snapshot = snapshots.get(0);
+      targetDate = snapshot.getCreatedAt();
     }
-    Snapshot snapshot = snapshots.get(0);
     SimpleDateFormat format = new SimpleDateFormat(DateUtils.DATE_FORMAT);
-    return new PastSnapshot(CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS, snapshot.getCreatedAt(), snapshot).setModeParameter(format.format(snapshot.getCreatedAt()));
+    return new PastSnapshot(CoreProperties.TIMEMACHINE_MODE_PREVIOUS_ANALYSIS, targetDate, snapshot).setModeParameter(format.format(targetDate));
   }
-
 }
index 9bf15e1414ced4db38c380cdc55ecfc9af828343..ed353e975d7fda58b8516d9c743752fa099a55e1 100644 (file)
@@ -24,6 +24,7 @@ import org.sonar.api.database.DatabaseSession;
 import org.sonar.api.database.model.Snapshot;
 import org.sonar.api.resources.Qualifiers;
 
+import java.util.Date;
 import java.util.List;
 
 public class PastSnapshotFinderByVersion implements BatchExtension {
@@ -36,6 +37,9 @@ public class PastSnapshotFinderByVersion implements BatchExtension {
     this.session = session;
   }
 
+  /**
+   * See comments in {@link PastSnapshotFinderByPreviousAnalysis#findByPreviousAnalysis(Snapshot)}
+   */
   PastSnapshot findByVersion(Snapshot projectSnapshot, String version) {
     String hql = "from " + Snapshot.class.getSimpleName() + " where version=:version AND resourceId=:resourceId AND status=:status AND qualifier<>:lib order by createdAt desc";
     List<Snapshot> snapshots = session.createQuery(hql)
@@ -46,11 +50,16 @@ public class PastSnapshotFinderByVersion implements BatchExtension {
         .setMaxResults(1)
         .getResultList();
 
+    Snapshot snapshot;
+    Date targetDate;
     if (snapshots.isEmpty()) {
-      return null;
+      snapshot = null;
+      targetDate = new Date(projectSnapshot.getCreatedAt().getTime() - 1000 * 60);
+    } else {
+      snapshot = snapshots.get(0);
+      targetDate = snapshot.getCreatedAt();
     }
-    Snapshot snapshot = snapshots.get(0);
-    return new PastSnapshot(MODE, snapshot.getCreatedAt(), snapshot).setModeParameter(snapshot.getVersion());
+    return new PastSnapshot(MODE, targetDate, snapshot).setModeParameter(version);
   }
 
 }
index 62a10db48e76f9b0672a3d452ed4579a24db17c5..9e6cb1b98b70d3ba1fa1909a7f58040956472f2a 100644 (file)
  */
 package org.sonar.batch.components;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+
 import org.junit.Test;
 import org.sonar.api.database.model.Snapshot;
 import org.sonar.jpa.test.AbstractDbUnitTestCase;
 
 import java.text.ParseException;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
-
 public class PastSnapshotFinderByPreviousAnalysisTest extends AbstractDbUnitTestCase {
 
   @Test
@@ -43,12 +43,15 @@ public class PastSnapshotFinderByPreviousAnalysisTest extends AbstractDbUnitTest
   }
 
   @Test
-  public void shouldNotFindPreviousAnalysis() throws ParseException {
+  public void shouldReturnPastSnapshotEvenWhenNoPreviousAnalysis() throws ParseException {
     setupData("shouldNotFindPreviousAnalysis");
 
     Snapshot projectSnapshot = getSession().getSingleResult(Snapshot.class, "id", 1010);
     PastSnapshotFinderByPreviousAnalysis finder = new PastSnapshotFinderByPreviousAnalysis(getSession());
 
-    assertNull(finder.findByPreviousAnalysis(projectSnapshot));
+    PastSnapshot pastSnapshot = finder.findByPreviousAnalysis(projectSnapshot);
+    assertThat(pastSnapshot.isRelatedToSnapshot(), is(false));
+    assertThat(pastSnapshot.getProjectSnapshot(), nullValue());
+    assertThat(projectSnapshot.getCreatedAt().getTime() - pastSnapshot.getTargetDate().getTime(), is(1000L * 60));
   }
 }
index 29f23920f0d98dece8010a922f5e9a6cbd07d932..046610f5e0bf0dbf61f035fb3e0aaed48afa2d9c 100644 (file)
  */
 package org.sonar.batch.components;
 
-import org.junit.Test;
-import org.sonar.api.database.model.Snapshot;
-import org.sonar.jpa.test.AbstractDbUnitTestCase;
-
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.core.IsNull.nullValue;
 import static org.junit.Assert.assertThat;
 
+import org.junit.Test;
+import org.sonar.api.database.model.Snapshot;
+import org.sonar.jpa.test.AbstractDbUnitTestCase;
+
 public class PastSnapshotFinderByVersionTest extends AbstractDbUnitTestCase {
 
   @Test
@@ -40,12 +40,15 @@ public class PastSnapshotFinderByVersionTest extends AbstractDbUnitTestCase {
   }
 
   @Test
-  public void shouldNotFindVersion() {
+  public void shouldReturnPastSnapshotEvenWhenNoPreviousAnalysis() {
     setupData("shared");
 
     Snapshot currentProjectSnapshot = getSession().getSingleResult(Snapshot.class, "id", 1010);
     PastSnapshotFinderByVersion finder = new PastSnapshotFinderByVersion(getSession());
 
-    assertThat(finder.findByVersion(currentProjectSnapshot, "1.0"), nullValue());
+    PastSnapshot pastSnapshot = finder.findByVersion(currentProjectSnapshot, "1.0");
+    assertThat(pastSnapshot.isRelatedToSnapshot(), is(false));
+    assertThat(pastSnapshot.getProjectSnapshot(), nullValue());
+    assertThat(currentProjectSnapshot.getCreatedAt().getTime() - pastSnapshot.getTargetDate().getTime(), is(1000L * 60));
   }
 }