001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.server.startup;
021
022 import com.google.common.collect.Lists;
023 import com.google.common.collect.Maps;
024 import org.sonar.api.database.DatabaseSession;
025 import org.sonar.api.measures.CoreMetrics;
026 import org.sonar.api.measures.Metric;
027 import org.sonar.api.measures.Metrics;
028 import org.sonar.api.profiles.Alert;
029 import org.sonar.api.utils.Logs;
030 import org.sonar.api.utils.TimeProfiler;
031 import org.sonar.jpa.dao.MeasuresDao;
032 import org.sonar.server.platform.ServerStartException;
033
034 import javax.persistence.Query;
035 import java.util.List;
036 import java.util.Map;
037
038 public class RegisterMetrics {
039
040 private MeasuresDao measuresDao;
041 private Metrics[] metricsRepositories = null;
042 private DatabaseSession session;
043
044 public RegisterMetrics(DatabaseSession session, MeasuresDao measuresDao, Metrics[] metricsRepositories) {
045 this.session = session;
046 this.measuresDao = measuresDao;
047 this.metricsRepositories = metricsRepositories;
048 }
049
050 public void start() {
051 TimeProfiler profiler = new TimeProfiler().start("Load metrics");
052 measuresDao.disableAutomaticMetrics();
053
054 List<Metric> metricsToRegister = Lists.newArrayList();
055 metricsToRegister.addAll(CoreMetrics.getMetrics());
056
057 Map<String, Metrics> metricsByRepository = Maps.newHashMap();
058 if (metricsRepositories != null) {
059 for (Metrics metrics : metricsRepositories) {
060 checkMetrics(metricsByRepository, metrics);
061 metricsToRegister.addAll(metrics.getMetrics());
062 }
063 }
064 register(metricsToRegister);
065 cleanAlerts();
066 profiler.stop();
067 }
068
069 private void checkMetrics(Map<String, Metrics> metricsByRepository, Metrics metrics) {
070 for (Metric metric : metrics.getMetrics()) {
071 String metricKey = metric.getKey();
072 if (CoreMetrics.getMetrics().contains(metric)) {
073 throw new ServerStartException("The following metric is already defined in sonar: " + metricKey);
074 }
075 Metrics anotherRepository = metricsByRepository.get(metricKey);
076 if (anotherRepository != null) {
077 throw new ServerStartException("The metric '" + metricKey + "' is already defined in the extension: " + anotherRepository);
078 }
079 metricsByRepository.put(metricKey, metrics);
080 }
081 }
082
083 protected void cleanAlerts() {
084 Logs.INFO.info("cleaning alert thresholds...");
085 Query query = session.createQuery("delete from " + Alert.class.getSimpleName() + " a where NOT EXISTS(FROM Metric m WHERE m=a.metric))");
086 query.executeUpdate();
087
088 query = session.createQuery("delete from " + Alert.class.getSimpleName() + " a where NOT EXISTS(FROM Metric m WHERE m=a.metric and m.enabled=:enabled))");
089 query.setParameter("enabled", Boolean.TRUE);
090 query.executeUpdate();
091 session.commit();
092 }
093
094 protected void register(List<Metric> metrics) {
095 measuresDao.registerMetrics(metrics);
096 }
097 }