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
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
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