]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-1634: Provide meaningful error message, when plugin tries to define metric...
authorGodin <mandrikov@gmail.com>
Fri, 24 Sep 2010 16:17:56 +0000 (16:17 +0000)
committerGodin <mandrikov@gmail.com>
Fri, 24 Sep 2010 16:17:56 +0000 (16:17 +0000)
sonar-server/src/main/java/org/sonar/server/startup/RegisterMetrics.java

index 414fa24fe1621e148f4ed05730a7a4a1fb230664..4b66047e7d2e21f931308ef128bd49930990e0ab 100644 (file)
 package org.sonar.server.startup;\r
 \r
 import org.sonar.api.database.DatabaseSession;\r
-import org.sonar.jpa.dao.MeasuresDao;\r
 import org.sonar.api.measures.CoreMetrics;\r
 import org.sonar.api.measures.Metric;\r
 import org.sonar.api.measures.Metrics;\r
+import org.sonar.api.platform.PluginRepository;\r
 import org.sonar.api.profiles.Alert;\r
 import org.sonar.api.utils.Logs;\r
 import org.sonar.api.utils.TimeProfiler;\r
+import org.sonar.jpa.dao.MeasuresDao;\r
+import org.sonar.server.platform.ServerStartException;\r
+\r
+import com.google.common.collect.Lists;\r
+import com.google.common.collect.Maps;\r
 \r
 import java.util.ArrayList;\r
+import java.util.HashMap;\r
 import java.util.List;\r
+\r
 import javax.persistence.Query;\r
 \r
 public class RegisterMetrics {\r
 \r
+  private PluginRepository pluginRepository;\r
   private MeasuresDao measuresDao;\r
   private Metrics[] metricsRepositories = null;\r
   private DatabaseSession session;\r
 \r
-  public RegisterMetrics(DatabaseSession session, MeasuresDao measuresDao, Metrics[] metricsRepositories) {\r
+  public RegisterMetrics(DatabaseSession session, MeasuresDao measuresDao, PluginRepository pluginRepository, Metrics[] metricsRepositories) {\r
     this.session = session;\r
     this.measuresDao = measuresDao;\r
+    this.pluginRepository = pluginRepository;\r
     this.metricsRepositories = metricsRepositories;\r
   }\r
 \r
@@ -51,10 +60,14 @@ public class RegisterMetrics {
   public void start() {\r
     TimeProfiler profiler = new TimeProfiler().start("Load metrics");\r
     measuresDao.disableAutomaticMetrics();\r
-    List<Metric> metricsToRegister = new ArrayList<Metric>();\r
+\r
+    ArrayList<Metric> metricsToRegister = Lists.newArrayList();\r
     metricsToRegister.addAll(CoreMetrics.getMetrics());\r
+\r
+    HashMap<String, Metrics> metricsByRepository = Maps.newHashMap();\r
     if (metricsRepositories != null) {\r
       for (Metrics metrics : metricsRepositories) {\r
+        checkMetrics(metricsByRepository, metrics);\r
         metricsToRegister.addAll(metrics.getMetrics());\r
       }\r
     }\r
@@ -63,6 +76,22 @@ public class RegisterMetrics {
     profiler.stop();\r
   }\r
 \r
+  private void checkMetrics(HashMap<String, Metrics> metricsByRepository, Metrics metrics) {\r
+    for (Metric metric : metrics.getMetrics()) {\r
+      String metricKey = metric.getKey();\r
+      if (CoreMetrics.metrics.contains(metric)) {\r
+        throw new ServerStartException("Found plugin, which contains metric '" + metricKey + "' from core: " + pluginRepository.getPluginKeyForExtension(metrics));\r
+      }\r
+      Metrics anotherRepository = metricsByRepository.get(metricKey);\r
+      if (anotherRepository != null) {\r
+        String firstPlugin = pluginRepository.getPluginKeyForExtension(anotherRepository);\r
+        String secondPlugin = pluginRepository.getPluginKeyForExtension(metrics);\r
+        throw new ServerStartException("Found two plugins with the same metric '" + metricKey + "': " + firstPlugin + " and " + secondPlugin);\r
+      }\r
+      metricsByRepository.put(metricKey, metrics);\r
+    }\r
+  }\r
+\r
   protected void cleanAlerts() {\r
     Logs.INFO.info("cleaning alert thresholds...");\r
     Query query = session.createQuery("delete from " + Alert.class.getSimpleName() + " a where NOT EXISTS(FROM Metric m WHERE m=a.metric))");\r