]> source.dussan.org Git - sonarqube.git/commitdiff
* SONAR-1809: MetricFinder should be available on server side
authorGodin <mandrikov@gmail.com>
Wed, 8 Dec 2010 21:30:14 +0000 (21:30 +0000)
committerGodin <mandrikov@gmail.com>
Wed, 8 Dec 2010 21:30:14 +0000 (21:30 +0000)
* Fix javadocs

12 files changed:
sonar-core/src/main/java/org/sonar/core/components/CacheMetricFinder.java
sonar-core/src/main/java/org/sonar/core/components/DefaultMetricFinder.java [new file with mode: 0644]
sonar-core/src/test/java/org/sonar/core/components/DefaultMetricFinderTest.java [new file with mode: 0644]
sonar-core/src/test/resources/org/sonar/core/components/DefaultMetricFinderTest/shared.xml [new file with mode: 0644]
sonar-deprecated/src/main/java/org/sonar/api/batch/Purge.java
sonar-deprecated/src/main/java/org/sonar/api/database/daos/MeasuresDao.java
sonar-deprecated/src/main/java/org/sonar/api/database/daos/RulesDao.java
sonar-deprecated/src/main/java/org/sonar/core/purge/AbstractPurge.java
sonar-plugin-api/src/main/java/org/sonar/api/measures/MetricFinder.java
sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileParser.java
sonar-plugin-api/src/test/java/org/sonar/api/profiles/XMLProfileSerializerTest.java
sonar-server/src/main/java/org/sonar/server/platform/Platform.java

index fa125dc9da1ad158afc256992ba5208438aad322..7b42df06bb713d09bbd52312700d9bafbb529f53 100644 (file)
@@ -22,39 +22,40 @@ package org.sonar.core.components;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.sonar.api.measures.Metric;
-import org.sonar.api.measures.MetricFinder;
 import org.sonar.jpa.session.DatabaseSessionFactory;
 
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
-public final class CacheMetricFinder implements MetricFinder {
+public final class CacheMetricFinder extends DefaultMetricFinder {
 
-  private DatabaseSessionFactory sessionFactory;
   private Map<String, Metric> metricsByKey = Maps.newLinkedHashMap();
   private Map<Integer, Metric> metricsById = Maps.newLinkedHashMap();
 
   public CacheMetricFinder(DatabaseSessionFactory sessionFactory) {
-    this.sessionFactory = sessionFactory;
+    super(sessionFactory);
   }
 
   public void start() {
-    List<Metric> list = sessionFactory.getSession().getResults(Metric.class, "enabled", true);
-    for (Metric metric : list) {
+    Collection<Metric> metrics = doFindAll();
+    for (Metric metric : metrics) {
       metricsByKey.put(metric.getKey(), metric);
       metricsById.put(metric.getId(), metric);
     }
   }
 
+  @Override
   public Metric findById(int metricId) {
     return metricsById.get(metricId);
   }
 
+  @Override
   public Metric findByKey(String key) {
     return metricsByKey.get(key);
   }
 
+  @Override
   public Collection<Metric> findAll(List<String> metricKeys) {
     List<Metric> result = Lists.newLinkedList();
     for (String metricKey : metricKeys) {
@@ -66,6 +67,7 @@ public final class CacheMetricFinder implements MetricFinder {
     return result;
   }
 
+  @Override
   public Collection<Metric> findAll() {
     return metricsByKey.values();
   }
diff --git a/sonar-core/src/main/java/org/sonar/core/components/DefaultMetricFinder.java b/sonar-core/src/main/java/org/sonar/core/components/DefaultMetricFinder.java
new file mode 100644 (file)
index 0000000..cf69187
--- /dev/null
@@ -0,0 +1,46 @@
+package org.sonar.core.components;
+
+import com.google.common.collect.Lists;
+import org.sonar.api.measures.Metric;
+import org.sonar.api.measures.MetricFinder;
+import org.sonar.jpa.session.DatabaseSessionFactory;
+
+import java.util.Collection;
+import java.util.List;
+
+public class DefaultMetricFinder implements MetricFinder {
+
+  private DatabaseSessionFactory sessionFactory;
+
+  public DefaultMetricFinder(DatabaseSessionFactory sessionFactory) {
+    this.sessionFactory = sessionFactory;
+  }
+
+  public Metric findById(int id) {
+    return sessionFactory.getSession().getSingleResult(Metric.class, "id", id, "enabled", true);
+  }
+
+  public Metric findByKey(String key) {
+    return sessionFactory.getSession().getSingleResult(Metric.class, "key", key, "enabled", true);
+  }
+
+  public Collection<Metric> findAll(List<String> metricKeys) {
+    List<Metric> result = Lists.newLinkedList();
+    for (String metricKey : metricKeys) {
+      Metric metric = findByKey(metricKey);
+      if (metric != null) {
+        result.add(metric);
+      }
+    }
+    return result;
+  }
+
+  public Collection<Metric> findAll() {
+    return doFindAll();
+  }
+
+  protected Collection<Metric> doFindAll() {
+    return sessionFactory.getSession().getResults(Metric.class, "enabled", true);
+  }
+
+}
diff --git a/sonar-core/src/test/java/org/sonar/core/components/DefaultMetricFinderTest.java b/sonar-core/src/test/java/org/sonar/core/components/DefaultMetricFinderTest.java
new file mode 100644 (file)
index 0000000..31dc62e
--- /dev/null
@@ -0,0 +1,44 @@
+package org.sonar.core.components;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.sonar.jpa.test.AbstractDbUnitTestCase;
+
+import java.util.Arrays;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class DefaultMetricFinderTest extends AbstractDbUnitTestCase {
+
+  private DefaultMetricFinder finder;
+
+  @Before
+  public void setUp() {
+    setupData("shared");
+    finder = new DefaultMetricFinder(getSessionFactory());
+  }
+
+  @Test
+  public void shouldFindAll() {
+    assertThat(finder.findAll().size(), is(2));
+  }
+
+  @Test
+  public void shouldFindByKeys() {
+    assertThat(finder.findAll(Arrays.<String> asList("ncloc", "foo", "coverage")).size(), is(2));
+  }
+
+  @Test
+  public void shouldFindById() {
+    assertThat(finder.findById(1).getKey(), is("ncloc"));
+    assertThat(finder.findById(3), nullValue());
+  }
+
+  @Test
+  public void shouldFindByKey() {
+    assertThat(finder.findByKey("ncloc").getKey(), is("ncloc"));
+    assertThat(finder.findByKey("disabled"), nullValue());
+  }
+}
diff --git a/sonar-core/src/test/resources/org/sonar/core/components/DefaultMetricFinderTest/shared.xml b/sonar-core/src/test/resources/org/sonar/core/components/DefaultMetricFinderTest/shared.xml
new file mode 100644 (file)
index 0000000..85709bc
--- /dev/null
@@ -0,0 +1,12 @@
+<dataset>
+
+  <metrics id="1" name="ncloc" VAL_TYPE="INT" DESCRIPTION="[null]" domain="[null]" short_name=""
+           enabled="true" worst_value="[null]" optimized_best_value="[null]" best_value="[null]" direction="0"
+           hidden="false"/>
+
+  <metrics id="2" name="coverage" VAL_TYPE="INT" DESCRIPTION="[null]" domain="[null]" short_name=""
+           enabled="true" worst_value="0" optimized_best_value="true" best_value="100" direction="1" hidden="false"/>
+
+  <metrics id="3" name="disabled" VAL_TYPE="INT" DESCRIPTION="[null]" domain="[null]" short_name=""
+           enabled="false" worst_value="0" optimized_best_value="true" best_value="100" direction="1" hidden="false"/>
+</dataset>
\ No newline at end of file
index d08323bb23aa5ebaddbd71a771cfefc6123c5fdd..b3562281dfff6d46d41f5898c835115e98cbeae2 100644 (file)
@@ -23,9 +23,10 @@ import org.sonar.api.BatchExtension;
 
 /**
  * Extension point to purge data.
- * <p/>
- * <p>It is executed when the batch finishes.
- *
+ * <p>
+ * It is executed when the batch finishes.
+ * </p>
+ * 
  * @since 1.10
  * @deprecated since 2.5. The DBCleaner plugin implements all required purge taks.
  */
@@ -34,7 +35,7 @@ public interface Purge extends BatchExtension {
 
   /**
    * Snapshots include the current snapshot (flagged as last) and optionally the penultimate one.
-   *
+   * 
    * @snapshots never null.
    */
   void purge(PurgeContext context);
index 383864d37c82c0e010105b22270e91ad49d3207c..6c8ab6284f9189d7f4f4cae6d90631662f981d8e 100644 (file)
@@ -24,6 +24,9 @@ import org.sonar.api.measures.Metric;
 import java.util.Collection;
 import java.util.List;
 
+/**
+ * @deprecated since 2.3
+ */
 @Deprecated
 public class MeasuresDao {
 
@@ -32,6 +35,7 @@ public class MeasuresDao {
   public MeasuresDao(org.sonar.jpa.dao.MeasuresDao target) {
     this.target = target;
   }
+
   public Metric getMetric(Metric metric) {
     return target.getMetric(metric);
   }
index cb7842f049dcdc30fb1e7a109c690029bc90a3cf..bc47708c2766155d47feb6a904b2eeda534b98a2 100644 (file)
@@ -30,6 +30,9 @@ import org.sonar.api.rules.RulesCategory;
 import java.util.Collections;
 import java.util.List;
 
+/**
+ * @deprecated since 2.3
+ */
 @Deprecated
 public class RulesDao {
 
@@ -67,7 +70,6 @@ public class RulesDao {
     return null;
   }
 
-
   public List<RuleParam> getRuleParams() {
     return target.getRuleParams();
   }
index a0f46d286d1a41cc204a9fd53b408daff9c4f79f..8edba7288f58a1400be1cd97b341159d4ac5c53b 100644 (file)
@@ -25,9 +25,14 @@ import org.sonar.api.database.model.*;
 import org.sonar.api.design.DependencyDto;
 import org.sonar.api.utils.TimeProfiler;
 
-import javax.persistence.Query;
 import java.util.List;
 
+import javax.persistence.Query;
+
+/**
+ * @deprecated since 2.5. The DBCleaner plugin implements all required purge taks, but you can extend org.sonar.plugins.dbcleaner.api.Purge
+ */
+@Deprecated
 public abstract class AbstractPurge implements Purge {
 
   private static final int MAX_IN_ELEMENTS = 950;
@@ -56,23 +61,28 @@ public abstract class AbstractPurge implements Purge {
   }
 
   protected void deleteDependencies(List<Integer> snapshotIds) {
-    executeQuery("delete dependencies", snapshotIds, "delete from " + DependencyDto.class.getSimpleName() + " d where d.fromSnapshotId in (:ids)");
-    executeQuery("delete dependencies", snapshotIds, "delete from " + DependencyDto.class.getSimpleName() + " d where d.toSnapshotId in (:ids)");
+    executeQuery("delete dependencies", snapshotIds, "delete from " + DependencyDto.class.getSimpleName()
+        + " d where d.fromSnapshotId in (:ids)");
+    executeQuery("delete dependencies", snapshotIds, "delete from " + DependencyDto.class.getSimpleName()
+        + " d where d.toSnapshotId in (:ids)");
   }
 
   /**
    * Delete all measures, including MEASURE_DATA
    */
   protected void deleteMeasuresBySnapshotId(List<Integer> snapshotIds) {
-    executeQuery("delete measures by snapshot id", snapshotIds, "delete from " + MeasureData.class.getSimpleName() + " m where m.snapshotId in (:ids)");
-    executeQuery("delete measures by snapshot id", snapshotIds, "delete from " + MeasureModel.class.getSimpleName() + " m where m.snapshotId in (:ids)");
+    executeQuery("delete measures by snapshot id", snapshotIds, "delete from " + MeasureData.class.getSimpleName()
+        + " m where m.snapshotId in (:ids)");
+    executeQuery("delete measures by snapshot id", snapshotIds, "delete from " + MeasureModel.class.getSimpleName()
+        + " m where m.snapshotId in (:ids)");
   }
 
   /**
    * Delete all measures, including MEASURE_DATA
    */
   protected void deleteMeasuresById(List<Integer> measureIds) {
-    executeQuery("delete measures by id", measureIds, "delete from " + MeasureData.class.getSimpleName() + " m where m.measure.id in (:ids)");
+    executeQuery("delete measures by id", measureIds, "delete from " + MeasureData.class.getSimpleName()
+        + " m where m.measure.id in (:ids)");
     executeQuery("delete measures by id", measureIds, "delete from " + MeasureModel.class.getSimpleName() + " m where m.id in (:ids)");
   }
 
@@ -87,7 +97,8 @@ public abstract class AbstractPurge implements Purge {
    * Delete violations (RULE_FAILURES table)
    */
   protected void deleteViolations(List<Integer> snapshotIds) {
-    executeQuery("delete violations", snapshotIds, "delete from " + RuleFailureModel.class.getSimpleName() + " e where e.snapshotId in (:ids)");
+    executeQuery("delete violations", snapshotIds, "delete from " + RuleFailureModel.class.getSimpleName()
+        + " e where e.snapshotId in (:ids)");
   }
 
   /**
index d05609c607a600fed3ebf7d5b76de9d7974438f3..0083d62b17e7ffa7d63ddc13d2b510f559bf59fd 100644 (file)
 package org.sonar.api.measures;
 
 import org.sonar.api.BatchComponent;
+import org.sonar.api.ServerComponent;
 
 import java.util.Collection;
 import java.util.List;
 
 /**
- * This component is currently available only on batch-side
- *
  * @since 2.5
  */
-public interface MetricFinder extends BatchComponent {
+public interface MetricFinder extends BatchComponent, ServerComponent {
 
   Metric findById(int id);
 
index 3ecff6e74fb999617755616cc4ae137e841374ab..84cc6c0ea796d4b6928f8502fe78f9a7cfcc586f 100644 (file)
@@ -209,11 +209,7 @@ public final class XMLProfileParser implements ServerComponent {
       if (metric == null) {
         messages.addWarningText("Metric '" + metricKey + "' does not exist");
       } else {
-        Alert alert = new Alert();
-        alert.setMetric(metric);
-        alert.setOperator(operator);
-        alert.setValueError(valueError);
-        alert.setValueWarning(valueWarning);
+        Alert alert = new Alert(profile, metric, operator, valueError, valueWarning);
         profile.getAlerts().add(alert);
       }
     }
index e63801dea3b48e634fb319a0be25d47a0c175c28..bc7a9aa35d924f6d126427c1ff878675e4c0c1fe 100644 (file)
@@ -45,7 +45,7 @@ public class XMLProfileSerializerTest {
     RulesProfile profile = RulesProfile.create("sonar way", "java");
     new XMLProfileSerializer().write(profile, writer);
 
-    assertSimilarXml("/org/sonar/api/profiles/XMLProfileSerializerTest/exportEmptyProfile.xml", writer.toString());
+    assertSimilarXml("exportEmptyProfile.xml", writer.toString());
   }
 
   @Test
@@ -55,7 +55,7 @@ public class XMLProfileSerializerTest {
     profile.activateRule(Rule.create("checkstyle", "IllegalRegexp", "illegal regexp"), RulePriority.BLOCKER);
     new XMLProfileSerializer().write(profile, writer);
 
-    assertSimilarXml("/org/sonar/api/profiles/XMLProfileSerializerTest/exportProfile.xml", writer.toString());
+    assertSimilarXml("exportProfile.xml", writer.toString());
   }
 
   @Test
@@ -73,7 +73,7 @@ public class XMLProfileSerializerTest {
     // the tokens parameter is not set
     new XMLProfileSerializer().write(profile, writer);
 
-    assertSimilarXml("/org/sonar/api/profiles/XMLProfileSerializerTest/exportRuleParameters.xml", writer.toString());
+    assertSimilarXml("exportRuleParameters.xml", writer.toString());
   }
 
   @Test
@@ -88,10 +88,11 @@ public class XMLProfileSerializerTest {
     profile.getAlerts().add(alert);
     new XMLProfileSerializer().write(profile, writer);
 
-    assertSimilarXml("/org/sonar/api/profiles/XMLProfileSerializerTest/exportAlerts.xml", writer.toString());
+    assertSimilarXml("exportAlerts.xml", writer.toString());
   }
 
-  public static void assertSimilarXml(String pathToExpectedXml, String xml) throws IOException, SAXException {
+  public static void assertSimilarXml(String fileWithExpectedXml, String xml) throws IOException, SAXException {
+    String pathToExpectedXml = "/org/sonar/api/profiles/XMLProfileSerializerTest/" + fileWithExpectedXml;
     InputStream stream = XMLProfileSerializerTest.class.getResourceAsStream(pathToExpectedXml);
     try {
       Diff diff = isSimilarXml(IOUtils.toString(stream), xml);
index e17b9e1bac0e07e3a82da2cb38803a8e579e4fa9..bd25a77c12ac1423e7acdc3ac6f58fb11a3b5134 100644 (file)
@@ -38,6 +38,7 @@ import org.sonar.api.rules.XMLRuleParser;
 import org.sonar.api.utils.HttpDownloader;
 import org.sonar.api.utils.IocContainer;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.core.components.DefaultMetricFinder;
 import org.sonar.core.components.DefaultModelFinder;
 import org.sonar.core.components.DefaultRuleFinder;
 import org.sonar.core.plugin.JpaPluginDao;
@@ -68,9 +69,9 @@ public final class Platform {
 
   private static final Platform INSTANCE = new Platform();
 
-  private MutablePicoContainer rootContainer;//level 1 : only database connectors
-  private MutablePicoContainer coreContainer;//level 2 : level 1 + core components
-  private MutablePicoContainer servicesContainer;//level 3 : level 2 + plugin extensions + core components that depend on plugin extensions
+  private MutablePicoContainer rootContainer;// level 1 : only database connectors
+  private MutablePicoContainer coreContainer;// level 2 : level 1 + core components
+  private MutablePicoContainer servicesContainer;// level 3 : level 2 + plugin extensions + core components that depend on plugin extensions
 
   private boolean connected = false;
   private boolean started = false;
@@ -105,7 +106,6 @@ public final class Platform {
     }
   }
 
-
   private void startDatabaseConnectors(Configuration configuration) {
     rootContainer = IocContainer.buildPicoContainer();
     ConfigurationLogger.log(configuration);
@@ -180,6 +180,7 @@ public final class Platform {
     servicesContainer.as(Characteristics.CACHE).addComponent(AnnotationRuleParser.class);
     servicesContainer.as(Characteristics.CACHE).addComponent(XMLRuleParser.class);
     servicesContainer.as(Characteristics.CACHE).addComponent(DefaultRuleFinder.class);
+    servicesContainer.as(Characteristics.CACHE).addComponent(DefaultMetricFinder.class);
     servicesContainer.as(Characteristics.CACHE).addComponent(DeprecatedRuleRepositories.class);
     servicesContainer.as(Characteristics.CACHE).addComponent(DeprecatedProfiles.class);
     servicesContainer.as(Characteristics.CACHE).addComponent(DeprecatedProfileExporters.class);