]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6014 Remove/Postpone DB dependencies
authorJulien HENRY <julien.henry@sonarsource.com>
Wed, 7 Jan 2015 13:25:07 +0000 (14:25 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Wed, 7 Jan 2015 13:29:30 +0000 (14:29 +0100)
sonar-batch/src/main/java/org/sonar/batch/ProjectConfigurator.java
sonar-batch/src/main/java/org/sonar/batch/index/DefaultIndex.java
sonar-batch/src/main/java/org/sonar/batch/index/DuplicationPersister.java
sonar-batch/src/main/java/org/sonar/batch/index/MeasurePersister.java
sonar-batch/src/main/java/org/sonar/batch/scan/ProjectReactorValidator.java
sonar-batch/src/main/java/org/sonar/batch/scan/ScanTask.java
sonar-batch/src/test/java/org/sonar/batch/index/DefaultIndexTest.java
sonar-batch/src/test/java/org/sonar/batch/index/DefaultResourcePersisterTest.java
sonar-batch/src/test/java/org/sonar/batch/index/MeasurePersisterTest.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/measure/Metric.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/measure/MetricFinder.java

index 0d32ff92dc95c7a4dc70df64fe652441a80586f3..75b4ce1722cbf88cb599c4787dc765c70c31d64e 100644 (file)
@@ -35,6 +35,8 @@ import org.sonar.api.utils.DateUtils;
 import org.sonar.api.utils.SonarException;
 import org.sonar.api.utils.System2;
 
+import javax.annotation.Nullable;
+
 import java.util.Date;
 
 public class ProjectConfigurator implements BatchComponent {
@@ -45,12 +47,16 @@ public class ProjectConfigurator implements BatchComponent {
   private Settings settings;
   private final System2 system2;
 
-  public ProjectConfigurator(DatabaseSession databaseSession, Settings settings, System2 system2) {
+  public ProjectConfigurator(@Nullable DatabaseSession databaseSession, Settings settings, System2 system2) {
     this.databaseSession = databaseSession;
     this.settings = settings;
     this.system2 = system2;
   }
 
+  public ProjectConfigurator(Settings settings, System2 system2) {
+    this(null, settings, system2);
+  }
+
   public Project create(ProjectDefinition definition) {
     Project project = new Project(definition.getKey(), loadProjectBranch(), definition.getName());
 
@@ -84,15 +90,17 @@ public class ProjectConfigurator implements BatchComponent {
   }
 
   private void checkCurrentAnalysisIsTheLatestOne(String projectKey, Date analysisDate) {
-    ResourceModel persistedProject = databaseSession.getSingleResult(ResourceModel.class, "key", projectKey, "enabled", true);
-    if (persistedProject != null) {
-      Snapshot lastSnapshot = databaseSession.getSingleResult(Snapshot.class, "resourceId", persistedProject.getId(), "last", true);
-      if (lastSnapshot != null && !lastSnapshot.getCreatedAt().before(analysisDate)) {
-        throw new IllegalArgumentException(
-          "'sonar.projectDate' property cannot be older than the date of the last known quality snapshot on this project. Value: '" +
-            settings.getString(CoreProperties.PROJECT_DATE_PROPERTY) + "'. " +
-            "Latest quality snapshot: '" + DateUtils.formatDateTime(lastSnapshot.getCreatedAt())
-            + "'. This property may only be used to rebuild the past in a chronological order.");
+    if (databaseSession != null) {
+      ResourceModel persistedProject = databaseSession.getSingleResult(ResourceModel.class, "key", projectKey, "enabled", true);
+      if (persistedProject != null) {
+        Snapshot lastSnapshot = databaseSession.getSingleResult(Snapshot.class, "resourceId", persistedProject.getId(), "last", true);
+        if (lastSnapshot != null && !lastSnapshot.getCreatedAt().before(analysisDate)) {
+          throw new IllegalArgumentException(
+            "'sonar.projectDate' property cannot be older than the date of the last known quality snapshot on this project. Value: '" +
+              settings.getString(CoreProperties.PROJECT_DATE_PROPERTY) + "'. " +
+              "Latest quality snapshot: '" + DateUtils.formatDateTime(lastSnapshot.getCreatedAt())
+              + "'. This property may only be used to rebuild the past in a chronological order.");
+        }
       }
     }
   }
index e05a5a59519438deb002fd0a12d5af165831012a..b2a0c7b2a4d82837016646405dafbefecb75ec64 100644 (file)
@@ -31,12 +31,11 @@ import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.Event;
 import org.sonar.api.batch.SonarIndex;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
+import org.sonar.api.batch.measure.MetricFinder;
 import org.sonar.api.design.Dependency;
 import org.sonar.api.measures.Measure;
 import org.sonar.api.measures.MeasuresFilter;
 import org.sonar.api.measures.MeasuresFilters;
-import org.sonar.api.measures.Metric;
-import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.resources.Directory;
 import org.sonar.api.resources.File;
 import org.sonar.api.resources.Project;
@@ -219,7 +218,7 @@ public class DefaultIndex extends SonarIndex {
   public Measure addMeasure(Resource resource, Measure measure) {
     Bucket bucket = getBucket(resource);
     if (bucket != null) {
-      Metric metric = metricFinder.findByKey(measure.getMetricKey());
+      org.sonar.api.batch.measure.Metric metric = metricFinder.findByKey(measure.getMetricKey());
       if (metric == null) {
         throw new SonarException("Unknown metric: " + measure.getMetricKey());
       }
@@ -227,7 +226,6 @@ public class DefaultIndex extends SonarIndex {
         LOG.debug("Metric " + metric.key() + " is an internal metric computed by SonarQube. Please update your plugin.");
         return measure;
       }
-      measure.setMetric(metric);
       if (measureCache.contains(resource, measure)) {
         throw new SonarException("Can not add the same measure twice on " + resource + ": " + measure);
       }
index 24be13710ba6c8b24078ff83e1bbc7c7044099d9..c5a5d05a02429209a7ce1dd3a7098e09c65206c2 100644 (file)
@@ -24,6 +24,8 @@ import org.sonar.api.database.model.MeasureMapper;
 import org.sonar.api.database.model.MeasureModel;
 import org.sonar.api.measures.CoreMetrics;
 import org.sonar.api.measures.Measure;
+import org.sonar.api.measures.Metric;
+import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.measures.PersistenceMode;
 import org.sonar.api.rules.RuleFinder;
 import org.sonar.batch.duplication.DuplicationCache;
@@ -39,10 +41,10 @@ public final class DuplicationPersister implements ScanPersister {
   private final RuleFinder ruleFinder;
   private final ResourceCache resourceCache;
   private final DuplicationCache duplicationCache;
-  private final org.sonar.api.measures.MetricFinder metricFinder;
+  private final MetricFinder metricFinder;
 
   public DuplicationPersister(MyBatis mybatis, RuleFinder ruleFinder, ResourceCache resourceCache,
-    DuplicationCache duplicationCache, org.sonar.api.measures.MetricFinder metricFinder) {
+    DuplicationCache duplicationCache, MetricFinder metricFinder) {
     this.mybatis = mybatis;
     this.ruleFinder = ruleFinder;
     this.resourceCache = resourceCache;
@@ -55,14 +57,14 @@ public final class DuplicationPersister implements ScanPersister {
     // Don't use batch insert for duplications since keeping all data in memory can produce OOM
     try (DbSession session = mybatis.openSession(false)) {
       MeasureMapper mapper = session.getMapper(MeasureMapper.class);
-      org.sonar.api.measures.Metric duplicationMetricWithId = metricFinder.findByKey(CoreMetrics.DUPLICATIONS_DATA_KEY);
+      Metric duplicationMetricWithId = metricFinder.findByKey(CoreMetrics.DUPLICATIONS_DATA_KEY);
       for (Entry<List<DuplicationGroup>> entry : duplicationCache.entries()) {
         String effectiveKey = entry.key()[0].toString();
         Measure measure = new Measure(duplicationMetricWithId, DuplicationUtils.toXml(entry.value())).setPersistenceMode(PersistenceMode.DATABASE);
         BatchResource batchResource = resourceCache.get(effectiveKey);
 
         if (MeasurePersister.shouldPersistMeasure(batchResource.resource(), measure)) {
-          MeasureModel measureModel = MeasurePersister.model(measure, ruleFinder).setSnapshotId(batchResource.snapshotId());
+          MeasureModel measureModel = MeasurePersister.model(measure, ruleFinder, metricFinder).setSnapshotId(batchResource.snapshotId());
           mapper.insert(measureModel);
           session.commit();
         }
index f6a93249a5f6bab87ce90743c06a7116f460ddb4..fdda9340f9b495b94ef58edb38bbf1634dcabfed 100644 (file)
@@ -23,6 +23,7 @@ import com.google.common.annotations.VisibleForTesting;
 import org.sonar.api.database.model.MeasureMapper;
 import org.sonar.api.database.model.MeasureModel;
 import org.sonar.api.measures.Measure;
+import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.measures.RuleMeasure;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.resources.ResourceUtils;
@@ -42,11 +43,13 @@ public final class MeasurePersister implements ScanPersister {
   private final RuleFinder ruleFinder;
   private final MeasureCache measureCache;
   private final ResourceCache resourceCache;
+  private final MetricFinder metricFinder;
 
-  public MeasurePersister(MyBatis mybatis, RuleFinder ruleFinder,
+  public MeasurePersister(MyBatis mybatis, RuleFinder ruleFinder, MetricFinder metricFinder,
     MeasureCache measureCache, ResourceCache resourceCache) {
     this.mybatis = mybatis;
     this.ruleFinder = ruleFinder;
+    this.metricFinder = metricFinder;
     this.measureCache = measureCache;
     this.resourceCache = resourceCache;
   }
@@ -62,7 +65,7 @@ public final class MeasurePersister implements ScanPersister {
         BatchResource batchResource = resourceCache.get(effectiveKey);
 
         if (shouldPersistMeasure(batchResource.resource(), measure)) {
-          MeasureModel measureModel = model(measure, ruleFinder).setSnapshotId(batchResource.snapshotId());
+          MeasureModel measureModel = model(measure, ruleFinder, metricFinder).setSnapshotId(batchResource.snapshotId());
           mapper.insert(measureModel);
         }
       }
@@ -91,10 +94,9 @@ public final class MeasurePersister implements ScanPersister {
       || isNotEmpty;
   }
 
-  static MeasureModel model(Measure measure, RuleFinder ruleFinder) {
+  static MeasureModel model(Measure measure, RuleFinder ruleFinder, MetricFinder metricFinder) {
     MeasureModel model = new MeasureModel();
-    // we assume that the index has updated the metric
-    model.setMetricId(measure.getMetric().getId());
+    model.setMetricId(metricFinder.findByKey(measure.getMetricKey()).getId());
     model.setDescription(measure.getDescription());
     model.setData(measure.getData());
     model.setAlertStatus(measure.getAlertStatus());
index a5b5c1138ab50dcd0a3a4fdd7f9a6e8a00b67b9e..75faa1d074b4cbf98476f76bc2b00892253aa809 100644 (file)
@@ -46,11 +46,15 @@ public class ProjectReactorValidator {
   private final Settings settings;
   private final ResourceDao resourceDao;
 
-  public ProjectReactorValidator(Settings settings, ResourceDao resourceDao) {
+  public ProjectReactorValidator(Settings settings, @Nullable ResourceDao resourceDao) {
     this.settings = settings;
     this.resourceDao = resourceDao;
   }
 
+  public ProjectReactorValidator(Settings settings) {
+    this(settings, null);
+  }
+
   public void validate(ProjectReactor reactor) {
     preventAutomaticProjectCreationIfNeeded(reactor);
 
@@ -72,10 +76,12 @@ public class ProjectReactorValidator {
   }
 
   private void preventAutomaticProjectCreationIfNeeded(ProjectReactor reactor) {
-    if (settings.getBoolean(CoreProperties.CORE_PREVENT_AUTOMATIC_PROJECT_CREATION)) {
-      String projectKey = reactor.getRoot().getKeyWithBranch();
-      if (resourceDao.findByKey(projectKey) == null) {
-        throw new SonarException(String.format("Unable to scan non-existing project \"%s\"", projectKey));
+    if (resourceDao != null) {
+      if (settings.getBoolean(CoreProperties.CORE_PREVENT_AUTOMATIC_PROJECT_CREATION)) {
+        String projectKey = reactor.getRoot().getKeyWithBranch();
+        if (resourceDao.findByKey(projectKey) == null) {
+          throw new SonarException(String.format("Unable to scan non-existing project \"%s\"", projectKey));
+        }
       }
     }
   }
@@ -84,7 +90,7 @@ public class ProjectReactorValidator {
     if (!ComponentKeys.isValidModuleKey(moduleDef.getKey())) {
       validationMessages.add(String.format("\"%s\" is not a valid project or module key. "
         + "Allowed characters are alphanumeric, '-', '_', '.' and ':', with at least one non-digit.", moduleDef.getKey()));
-    } else if (isSubProject(moduleDef)) {
+    } else if (resourceDao != null && isSubProject(moduleDef)) {
       // SONAR-4692 Validate root project is the same than previous analysis to avoid module with same key in different projects
       String moduleKey = ComponentKeys.createKey(moduleDef.getKey(), branch);
       ResourceDto rootInDB = resourceDao.getRootProjectByComponentKey(moduleKey);
index 2ded6e055b4861e4b2332dd30da99016dbec93b8..b0d80d77839fb10ac4b9f8a48f32d8d7a058e826 100644 (file)
@@ -19,8 +19,6 @@
  */
 package org.sonar.batch.scan;
 
-import org.sonar.batch.scan2.ProjectScanContainer;
-
 import org.sonar.api.CoreProperties;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.task.Task;
@@ -29,6 +27,7 @@ import org.sonar.batch.DefaultProjectTree;
 import org.sonar.batch.bootstrap.BootstrapProperties;
 import org.sonar.batch.bootstrap.TaskContainer;
 import org.sonar.batch.phases.Phases;
+import org.sonar.batch.scan2.ProjectScanContainer;
 
 public class ScanTask implements Task {
   public static final TaskDefinition DEFINITION = TaskDefinition.builder()
index f1e8458f75706817553305dda9e831717c0bdf3b..e943cf779caa7fbe0501b4bce56ca1c36f49748c 100644 (file)
@@ -24,11 +24,11 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
+import org.sonar.api.batch.measure.MetricFinder;
 import org.sonar.api.database.model.Snapshot;
 import org.sonar.api.measures.CoreMetrics;
 import org.sonar.api.measures.Measure;
 import org.sonar.api.measures.MeasuresFilters;
-import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.profiles.RulesProfile;
 import org.sonar.api.resources.Directory;
 import org.sonar.api.resources.File;
index d2eee9095f6e77633b291dcf7e64bfbb4fe9623c..d08e6b9ded39ea13bcaeeab16bf12d9982908e01 100644 (file)
@@ -27,9 +27,9 @@ import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
+import org.sonar.api.batch.measure.MetricFinder;
 import org.sonar.api.config.Settings;
 import org.sonar.api.database.model.Snapshot;
-import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.resources.Directory;
 import org.sonar.api.resources.File;
 import org.sonar.api.resources.Library;
@@ -218,7 +218,8 @@ public class DefaultResourcePersisterTest extends AbstractDbUnitTestCase {
     when(projectTree.getProjectDefinition(moduleB)).thenReturn(ProjectDefinition.create().setBaseDir(new java.io.File(baseDir, "moduleB")));
     when(projectTree.getProjectDefinition(moduleB1)).thenReturn(ProjectDefinition.create().setBaseDir(new java.io.File(baseDir, "moduleB/moduleB1")));
 
-    DefaultIndex index = new DefaultIndex(persister, null, null, null, projectTree, mock(MetricFinder.class), mock(ScanGraph.class), mock(DeprecatedViolations.class),
+    DefaultIndex index = new DefaultIndex(persister, null, null, null, projectTree, mock(MetricFinder.class), mock(ScanGraph.class),
+      mock(DeprecatedViolations.class),
       mock(ResourceKeyMigration.class),
       mock(MeasureCache.class));
 
index 6c4bcc731ebde8f3a6dc93f1eed5ef4982522f89..3ebb40264a25373284e066b3777aabf51f992d20 100644 (file)
@@ -27,6 +27,7 @@ import org.sonar.api.database.model.Snapshot;
 import org.sonar.api.measures.CoreMetrics;
 import org.sonar.api.measures.Measure;
 import org.sonar.api.measures.Metric;
+import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.measures.PersistenceMode;
 import org.sonar.api.measures.RuleMeasure;
 import org.sonar.api.resources.Directory;
@@ -75,7 +76,13 @@ public class MeasurePersisterTest extends AbstractDaoTestCase {
     when(resourceCache.get("foo:org/foo/Bar.java")).thenReturn(fileResource);
     when(resourceCache.get("foo:org/foo")).thenReturn(dirResource);
 
-    measurePersister = new MeasurePersister(getMyBatis(), ruleFinder, measureCache, resourceCache);
+    MetricFinder metricFinder = mock(MetricFinder.class);
+    Metric ncloc = ncloc();
+    Metric coverage = coverage();
+    when(metricFinder.findByKey(ncloc.getKey())).thenReturn(ncloc);
+    when(metricFinder.findByKey(coverage.getKey())).thenReturn(coverage);
+
+    measurePersister = new MeasurePersister(getMyBatis(), ruleFinder, metricFinder, measureCache, resourceCache);
   }
 
   @Test
index 95e3828abb9ef8ce8c07effd7b016130e7976e3f..20cc8d9c1a020f3746a19c6824af637c8e1fe295 100644 (file)
  */
 package org.sonar.api.batch.measure;
 
-import com.google.common.annotations.Beta;
-
 import java.io.Serializable;
 
 /**
- * Experimental - do not use
  * @since 4.4
  */
-@Beta
 public interface Metric<G extends Serializable> {
 
   String key();
index 79967526386973af38560b757bf311e47c8e8cb9..4f91ea5aae422f182717e895e416079545cdf2ac 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.api.batch.measure;
 
-import com.google.common.annotations.Beta;
 import org.sonar.api.BatchComponent;
 
 import javax.annotation.CheckForNull;
@@ -28,10 +27,8 @@ import java.util.Collection;
 import java.util.List;
 
 /**
- * Experimental - do not use
  * @since 4.5
  */
-@Beta
 public interface MetricFinder extends BatchComponent {
 
   @CheckForNull