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 */
020package org.sonar.plugins.core.sensors;
021
022import org.sonar.api.batch.*;
023import org.sonar.api.measures.CoreMetrics;
024import org.sonar.api.measures.Measure;
025import org.sonar.api.measures.Metric;
026import org.sonar.api.profiles.RulesProfile;
027import org.sonar.api.resources.Project;
028
029import java.util.List;
030
031public class ProfileEventsSensor implements Sensor {
032
033  private final RulesProfile profile;
034  private final TimeMachine timeMachine;
035
036  public ProfileEventsSensor(RulesProfile profile, TimeMachine timeMachine) {
037    this.profile = profile;
038    this.timeMachine = timeMachine;
039  }
040
041  public boolean shouldExecuteOnProject(Project project) {
042    return true;
043  }
044
045  public void analyse(Project project, SensorContext context) {
046    if (profile == null) {
047      return;
048    }
049
050    Measure pastProfileMeasure = getPreviousMeasure(project, CoreMetrics.PROFILE);
051    if (pastProfileMeasure == null) {
052      return; // first analysis
053    }
054    int pastProfileId = pastProfileMeasure.getIntValue();
055    Measure pastProfileVersionMeasure = getPreviousMeasure(project, CoreMetrics.PROFILE_VERSION);
056    final int pastProfileVersion;
057    if (pastProfileVersionMeasure == null) { // first analysis with versions
058      pastProfileVersion = 1;
059    } else {
060      pastProfileVersion = pastProfileVersionMeasure.getIntValue();
061    }
062    String pastProfile = formatProfileDescription(pastProfileMeasure.getData(), pastProfileVersion);
063
064    int currentProfileId = profile.getId();
065    int currentProfileVersion = profile.getVersion();
066    String currentProfile = formatProfileDescription(profile.getName(), currentProfileVersion);
067
068    if ((pastProfileId != currentProfileId) || (pastProfileVersion != currentProfileVersion)) {
069      // A different profile is used for this project or new version of same profile
070      context.createEvent(project, currentProfile, currentProfile + " is used instead of " + pastProfile, Event.CATEGORY_PROFILE, null);
071    }
072  }
073
074  private static String formatProfileDescription(String name, int version) {
075    return name + " version " + version;
076  }
077
078  private Measure getPreviousMeasure(Project project, Metric metric) {
079    TimeMachineQuery query = new TimeMachineQuery(project)
080        .setOnlyLastAnalysis(true)
081        .setMetrics(metric);
082    List<Measure> measures = timeMachine.getMeasures(query);
083    if (measures.isEmpty()) {
084      return null;
085    }
086    return measures.get(0);
087  }
088
089  @Override
090  public String toString() {
091    return getClass().getSimpleName();
092  }
093}