From 8ea838b32e45f4fb08d1ac3aa8d480a2e0cef7af Mon Sep 17 00:00:00 2001 From: Godin Date: Wed, 8 Dec 2010 21:30:14 +0000 Subject: [PATCH] * SONAR-1809: MetricFinder should be available on server side * Fix javadocs --- .../core/components/CacheMetricFinder.java | 14 +++--- .../core/components/DefaultMetricFinder.java | 46 +++++++++++++++++++ .../components/DefaultMetricFinderTest.java | 44 ++++++++++++++++++ .../DefaultMetricFinderTest/shared.xml | 12 +++++ .../main/java/org/sonar/api/batch/Purge.java | 9 ++-- .../sonar/api/database/daos/MeasuresDao.java | 4 ++ .../org/sonar/api/database/daos/RulesDao.java | 4 +- .../org/sonar/core/purge/AbstractPurge.java | 25 +++++++--- .../org/sonar/api/measures/MetricFinder.java | 5 +- .../sonar/api/profiles/XMLProfileParser.java | 6 +-- .../profiles/XMLProfileSerializerTest.java | 11 +++-- .../org/sonar/server/platform/Platform.java | 9 ++-- 12 files changed, 154 insertions(+), 35 deletions(-) create mode 100644 sonar-core/src/main/java/org/sonar/core/components/DefaultMetricFinder.java create mode 100644 sonar-core/src/test/java/org/sonar/core/components/DefaultMetricFinderTest.java create mode 100644 sonar-core/src/test/resources/org/sonar/core/components/DefaultMetricFinderTest/shared.xml diff --git a/sonar-core/src/main/java/org/sonar/core/components/CacheMetricFinder.java b/sonar-core/src/main/java/org/sonar/core/components/CacheMetricFinder.java index fa125dc9da1..7b42df06bb7 100644 --- a/sonar-core/src/main/java/org/sonar/core/components/CacheMetricFinder.java +++ b/sonar-core/src/main/java/org/sonar/core/components/CacheMetricFinder.java @@ -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 metricsByKey = Maps.newLinkedHashMap(); private Map metricsById = Maps.newLinkedHashMap(); public CacheMetricFinder(DatabaseSessionFactory sessionFactory) { - this.sessionFactory = sessionFactory; + super(sessionFactory); } public void start() { - List list = sessionFactory.getSession().getResults(Metric.class, "enabled", true); - for (Metric metric : list) { + Collection 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 findAll(List metricKeys) { List result = Lists.newLinkedList(); for (String metricKey : metricKeys) { @@ -66,6 +67,7 @@ public final class CacheMetricFinder implements MetricFinder { return result; } + @Override public Collection 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 index 00000000000..cf691878603 --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/components/DefaultMetricFinder.java @@ -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 findAll(List metricKeys) { + List result = Lists.newLinkedList(); + for (String metricKey : metricKeys) { + Metric metric = findByKey(metricKey); + if (metric != null) { + result.add(metric); + } + } + return result; + } + + public Collection findAll() { + return doFindAll(); + } + + protected Collection 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 index 00000000000..31dc62eb0ac --- /dev/null +++ b/sonar-core/src/test/java/org/sonar/core/components/DefaultMetricFinderTest.java @@ -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. 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 index 00000000000..85709bcbf98 --- /dev/null +++ b/sonar-core/src/test/resources/org/sonar/core/components/DefaultMetricFinderTest/shared.xml @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/sonar-deprecated/src/main/java/org/sonar/api/batch/Purge.java b/sonar-deprecated/src/main/java/org/sonar/api/batch/Purge.java index d08323bb23a..b3562281dff 100644 --- a/sonar-deprecated/src/main/java/org/sonar/api/batch/Purge.java +++ b/sonar-deprecated/src/main/java/org/sonar/api/batch/Purge.java @@ -23,9 +23,10 @@ import org.sonar.api.BatchExtension; /** * Extension point to purge data. - *

- *

It is executed when the batch finishes. - * + *

+ * It is executed when the batch finishes. + *

+ * * @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); diff --git a/sonar-deprecated/src/main/java/org/sonar/api/database/daos/MeasuresDao.java b/sonar-deprecated/src/main/java/org/sonar/api/database/daos/MeasuresDao.java index 383864d37c8..6c8ab6284f9 100644 --- a/sonar-deprecated/src/main/java/org/sonar/api/database/daos/MeasuresDao.java +++ b/sonar-deprecated/src/main/java/org/sonar/api/database/daos/MeasuresDao.java @@ -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); } diff --git a/sonar-deprecated/src/main/java/org/sonar/api/database/daos/RulesDao.java b/sonar-deprecated/src/main/java/org/sonar/api/database/daos/RulesDao.java index cb7842f049d..bc47708c276 100644 --- a/sonar-deprecated/src/main/java/org/sonar/api/database/daos/RulesDao.java +++ b/sonar-deprecated/src/main/java/org/sonar/api/database/daos/RulesDao.java @@ -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 getRuleParams() { return target.getRuleParams(); } diff --git a/sonar-deprecated/src/main/java/org/sonar/core/purge/AbstractPurge.java b/sonar-deprecated/src/main/java/org/sonar/core/purge/AbstractPurge.java index a0f46d286d1..8edba7288f5 100644 --- a/sonar-deprecated/src/main/java/org/sonar/core/purge/AbstractPurge.java +++ b/sonar-deprecated/src/main/java/org/sonar/core/purge/AbstractPurge.java @@ -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 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 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 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 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)"); } /** diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/measures/MetricFinder.java b/sonar-plugin-api/src/main/java/org/sonar/api/measures/MetricFinder.java index d05609c607a..0083d62b17e 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/measures/MetricFinder.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/measures/MetricFinder.java @@ -20,16 +20,15 @@ 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); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileParser.java b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileParser.java index 3ecff6e74fb..84cc6c0ea79 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileParser.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileParser.java @@ -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); } } diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/profiles/XMLProfileSerializerTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/profiles/XMLProfileSerializerTest.java index e63801dea3b..bc7a9aa35d9 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/profiles/XMLProfileSerializerTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/profiles/XMLProfileSerializerTest.java @@ -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); diff --git a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java index e17b9e1bac0..bd25a77c12a 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java @@ -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); -- 2.39.5