summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsimonbrandhof <simon.brandhof@gmail.com>2010-11-29 21:00:15 +0000
committersimonbrandhof <simon.brandhof@gmail.com>2010-11-29 21:00:15 +0000
commit83b138bebbbf508cb5d913494daef67826fde583 (patch)
tree3b664d6d36c85371e6a97f4a849a5a3a432b7646
parent5276b9eadc0d4859d44667166155811b87832886 (diff)
downloadsonarqube-83b138bebbbf508cb5d913494daef67826fde583.tar.gz
sonarqube-83b138bebbbf508cb5d913494daef67826fde583.zip
SONAR-249 add the class TimeMachineConfiguration
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java5
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PeriodLocator.java13
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java12
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java53
-rw-r--r--plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/PeriodLocatorTest.java16
-rw-r--r--plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TendencyDecoratorTest.java27
-rw-r--r--plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/TimeMachineConfigurationTest.java44
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));
+ }
+
+}