diff options
author | simonbrandhof <simon.brandhof@gmail.com> | 2010-11-29 21:00:15 +0000 |
---|---|---|
committer | simonbrandhof <simon.brandhof@gmail.com> | 2010-11-29 21:00:15 +0000 |
commit | 83b138bebbbf508cb5d913494daef67826fde583 (patch) | |
tree | 3b664d6d36c85371e6a97f4a849a5a3a432b7646 | |
parent | 5276b9eadc0d4859d44667166155811b87832886 (diff) | |
download | sonarqube-83b138bebbbf508cb5d913494daef67826fde583.tar.gz sonarqube-83b138bebbbf508cb5d913494daef67826fde583.zip |
SONAR-249 add the class TimeMachineConfiguration
7 files changed, 140 insertions, 30 deletions
diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java index ae915535904..a354846e9a9 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java @@ -43,6 +43,7 @@ import org.sonar.plugins.core.testdetailsviewer.TestsViewerDefinition; import org.sonar.plugins.core.timemachine.DifferentialValueDecorator; import org.sonar.plugins.core.timemachine.PeriodLocator; import org.sonar.plugins.core.timemachine.TendencyDecorator; +import org.sonar.plugins.core.timemachine.TimeMachineConfiguration; import org.sonar.plugins.core.ui.pageselector.GwtPageSelector; import org.sonar.plugins.core.violationsviewer.ViolationsViewerDefinition; import org.sonar.plugins.core.widgets.*; @@ -180,7 +181,6 @@ public class CorePlugin implements Plugin { extensions.add(ViolationsDecorator.class); extensions.add(WeightedViolationsDecorator.class); extensions.add(ViolationsDensityDecorator.class); - extensions.add(TendencyDecorator.class); extensions.add(LineCoverageDecorator.class); extensions.add(CoverageDecorator.class); extensions.add(BranchCoverageDecorator.class); @@ -192,8 +192,11 @@ public class CorePlugin implements Plugin { extensions.add(DirectoriesDecorator.class); extensions.add(FilesDecorator.class); + // time machine + extensions.add(TendencyDecorator.class); extensions.add(PeriodLocator.class); extensions.add(DifferentialValueDecorator.class); + extensions.add(TimeMachineConfiguration.class); return extensions; } diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PeriodLocator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PeriodLocator.java index cff7762d595..ef1acbcbf22 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PeriodLocator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PeriodLocator.java @@ -19,6 +19,7 @@ */ package org.sonar.plugins.core.timemachine; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; import org.sonar.api.BatchExtension; import org.sonar.api.database.DatabaseSession; @@ -27,7 +28,6 @@ import org.sonar.api.database.model.Snapshot; import java.util.Date; import java.util.List; -// TODO should implement BatchComponent public final class PeriodLocator implements BatchExtension { private Snapshot projectSnapshot; // TODO replace by PersistenceManager private DatabaseSession session; @@ -37,7 +37,12 @@ public final class PeriodLocator implements BatchExtension { this.session = session; } - public Snapshot locate(int days) { + // currently not used + boolean acceptProperty(String property) { + return doAcceptProperty(property); + } + + Snapshot locate(int days) { List<Snapshot> snapshots = loadSnapshotsFromDatabase(); return getNearestToTarget(snapshots, projectSnapshot.getCreatedAt(), days); } @@ -71,4 +76,8 @@ public final class PeriodLocator implements BatchExtension { static long distance(Date d1, Date d2) { return Math.abs(d1.getTime() - d2.getTime()); } + + static Boolean doAcceptProperty(String property) { + return StringUtils.trimToEmpty(property).matches("[0-9]+d"); + } } diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java index c28c1f52084..52599e033d8 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java @@ -22,9 +22,7 @@ package org.sonar.plugins.core.timemachine; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; -import org.apache.commons.configuration.Configuration; import org.apache.commons.lang.time.DateUtils; -import org.sonar.api.CoreProperties; import org.sonar.api.batch.*; import org.sonar.api.measures.Measure; import org.sonar.api.measures.Metric; @@ -43,10 +41,10 @@ public class TendencyDecorator implements Decorator { private TimeMachine timeMachine; private TimeMachineQuery query; private TendencyAnalyser analyser; - private Configuration configuration; + private TimeMachineConfiguration configuration; private List<Metric> metrics; - public TendencyDecorator(TimeMachine timeMachine, MetricFinder metricFinder, Configuration configuration) { + public TendencyDecorator(TimeMachine timeMachine, MetricFinder metricFinder, TimeMachineConfiguration configuration) { this.timeMachine = timeMachine; this.analyser = new TendencyAnalyser(); this.configuration = configuration; @@ -58,7 +56,7 @@ public class TendencyDecorator implements Decorator { } } - protected TendencyDecorator(TimeMachine timeMachine, TimeMachineQuery query, TendencyAnalyser analyser, Configuration configuration) { + protected TendencyDecorator(TimeMachine timeMachine, TimeMachineQuery query, TendencyAnalyser analyser, TimeMachineConfiguration configuration) { this.timeMachine = timeMachine; this.query = query; this.analyser = analyser; @@ -71,7 +69,7 @@ public class TendencyDecorator implements Decorator { } protected TimeMachineQuery initQuery(Project project) { - int days = project.getConfiguration().getInt(CoreProperties.CORE_TENDENCY_DEPTH_PROPERTY, CoreProperties.CORE_TENDENCY_DEPTH_DEFAULT_VALUE); + int days = configuration.getTendencyPeriodInDays(); query = new TimeMachineQuery(null) // resource is set after .setFrom(DateUtils.addDays(project.getAnalysisDate(), -days)) @@ -89,7 +87,7 @@ public class TendencyDecorator implements Decorator { } public boolean shouldExecuteOnProject(Project project) { - return !configuration.getBoolean(CoreProperties.SKIP_TENDENCIES_PROPERTY, CoreProperties.SKIP_TENDENCIES_DEFAULT_VALUE); + return !configuration.skipTendencies(); } public void decorate(Resource resource, DecoratorContext context) { diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java new file mode 100644 index 00000000000..0a4efdff2d1 --- /dev/null +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java @@ -0,0 +1,53 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2009 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.core.timemachine; + +import org.apache.commons.configuration.Configuration; +import org.sonar.api.BatchExtension; +import org.sonar.api.CoreProperties; +import org.sonar.api.database.model.Snapshot; + +public final class TimeMachineConfiguration implements BatchExtension { + + private Configuration configuration; + private PeriodLocator periodLocator; + + public TimeMachineConfiguration(Configuration configuration, PeriodLocator periodLocator) { + this.configuration = configuration; + this.periodLocator = periodLocator; + } + + boolean skipTendencies() { + return configuration.getBoolean(CoreProperties.SKIP_TENDENCIES_PROPERTY, CoreProperties.SKIP_TENDENCIES_DEFAULT_VALUE); + } + + int getTendencyPeriodInDays() { + return configuration.getInt(CoreProperties.CORE_TENDENCY_DEPTH_PROPERTY, CoreProperties.CORE_TENDENCY_DEPTH_DEFAULT_VALUE); + } + + Snapshot getProjectSnapshotForDiffValues(int index) { + String property = configuration.getString("sonar.timemachine.diff" + index); + Snapshot projectSnapshot = null; + if (property!=null) { + projectSnapshot = periodLocator.locate(Integer.valueOf(property)); + } + return projectSnapshot; + } +} diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/PeriodLocatorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/PeriodLocatorTest.java index d0d99fed25f..54ceea82043 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/PeriodLocatorTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/PeriodLocatorTest.java @@ -41,6 +41,22 @@ public class PeriodLocatorTest extends AbstractDbUnitTestCase { private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); @Test + public void shouldAcceptProperty() { + assertThat(PeriodLocator.doAcceptProperty("1d"), is(true)); + assertThat(PeriodLocator.doAcceptProperty("2d"), is(true)); + assertThat(PeriodLocator.doAcceptProperty("500d"), is(true)); + assertThat(PeriodLocator.doAcceptProperty(" 500d "), is(true)); + } + + @Test + public void shouldNotAcceptProperty() { + assertThat(PeriodLocator.doAcceptProperty(null), is(false)); + assertThat(PeriodLocator.doAcceptProperty(""), is(false)); + assertThat(PeriodLocator.doAcceptProperty("1.2.3"), is(false)); + assertThat(PeriodLocator.doAcceptProperty("2010-05-18"), is(false)); + } + + @Test public void shouldLoadSnapshotsFromDatabase() { setupData("shouldLoadSnapshotsFromDatabase"); diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TendencyDecoratorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TendencyDecoratorTest.java index e37d54ee5a8..48a7ab71d2a 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TendencyDecoratorTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TendencyDecoratorTest.java @@ -21,7 +21,6 @@ package org.sonar.plugins.core.timemachine; import org.apache.commons.configuration.PropertiesConfiguration; import org.junit.Test; -import org.sonar.api.CoreProperties; import org.sonar.api.batch.DecoratorContext; import org.sonar.api.batch.TimeMachine; import org.sonar.api.batch.TimeMachineQuery; @@ -47,12 +46,11 @@ public class TendencyDecoratorTest { public void initQuery() throws ParseException { Project project = mock(Project.class); when(project.getAnalysisDate()).thenReturn(date("2009-12-25")); - when(project.getConfiguration()).thenReturn(new PropertiesConfiguration()); MetricFinder metricFinder = mock(MetricFinder.class); when(metricFinder.findAll()).thenReturn(Arrays.asList(CoreMetrics.LINES, CoreMetrics.COVERAGE, CoreMetrics.COVERAGE_LINE_HITS_DATA, CoreMetrics.PROFILE)); - TendencyDecorator decorator = new TendencyDecorator(null, metricFinder, new PropertiesConfiguration()); + TendencyDecorator decorator = new TendencyDecorator(null, metricFinder, newConf()); TimeMachineQuery query = decorator.initQuery(project); assertThat(query.getMetrics().size(), is(2)); @@ -61,6 +59,10 @@ public class TendencyDecoratorTest { assertThat(query.isToCurrentAnalysis(), is(true)); } + private TimeMachineConfiguration newConf() { + return new TimeMachineConfiguration(new PropertiesConfiguration(), null); + } + @Test public void includeCurrentMeasures() throws ParseException { TendencyAnalyser analyser = mock(TendencyAnalyser.class); @@ -79,7 +81,7 @@ public class TendencyDecoratorTest { when(context.getMeasure(CoreMetrics.LINES)).thenReturn(new Measure(CoreMetrics.LINES, 1400.0)); when(context.getMeasure(CoreMetrics.COVERAGE)).thenReturn(new Measure(CoreMetrics.LINES, 90.0)); - TendencyDecorator decorator = new TendencyDecorator(timeMachine, query, analyser, new PropertiesConfiguration()); + TendencyDecorator decorator = new TendencyDecorator(timeMachine, query, analyser, newConf()); decorator.decorate(new JavaPackage("org.foo"), context); verify(analyser).analyseLevel(Arrays.asList(1200.0, 1300.0, 1150.0, 1400.0)); @@ -98,27 +100,12 @@ public class TendencyDecoratorTest { )); DecoratorContext context = mock(DecoratorContext.class); - TendencyDecorator decorator = new TendencyDecorator(timeMachine, query, analyser, new PropertiesConfiguration()); + TendencyDecorator decorator = new TendencyDecorator(timeMachine, query, analyser, newConf()); decorator.decorate(new JavaPackage("org.foo"), context); verify(analyser, never()).analyseLevel(anyList()); } - @Test - public void shouldSkipExecution() { - PropertiesConfiguration conf = new PropertiesConfiguration(); - conf.setProperty(CoreProperties.SKIP_TENDENCIES_PROPERTY, true); - TendencyDecorator decorator = new TendencyDecorator(null, null, null, conf); - assertThat(decorator.shouldExecuteOnProject(null), is(false)); - } - - @Test - public void shouldNotSkipExecutionByDefault() { - PropertiesConfiguration conf = new PropertiesConfiguration(); - TendencyDecorator decorator = new TendencyDecorator(null, null, null, conf); - assertThat(decorator.shouldExecuteOnProject(null), is(true)); - } - private Date date(String date) throws ParseException { return new SimpleDateFormat("yyyy-MM-dd").parse(date); } diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest.java new file mode 100644 index 00000000000..313905f6796 --- /dev/null +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest.java @@ -0,0 +1,44 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2009 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.plugins.core.timemachine; + +import org.apache.commons.configuration.PropertiesConfiguration; +import org.junit.Test; +import org.sonar.api.CoreProperties; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class TimeMachineConfigurationTest { + + @Test + public void shouldSkipTendencies() { + PropertiesConfiguration conf = new PropertiesConfiguration(); + conf.setProperty(CoreProperties.SKIP_TENDENCIES_PROPERTY, true); + assertThat(new TimeMachineConfiguration(conf, null).skipTendencies(), is(true)); + } + + @Test + public void shouldNotSkipTendenciesByDefault() { + PropertiesConfiguration conf = new PropertiesConfiguration(); + assertThat(new TimeMachineConfiguration(conf, null).skipTendencies(), is(false)); + } + +} |