aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-plugin-api
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2014-03-17 14:13:22 +0100
committerJulien Lancelot <julien.lancelot@sonarsource.com>2014-03-17 14:13:31 +0100
commitdb4d7f826ef8a51797dc7a9d4f35f15b60867276 (patch)
tree3b48dbf83df6d1796ac90a3d3d04f9ea173e1427 /sonar-plugin-api
parentbe23543432b96b3fdfd8a0cffaaf56dda0f5f158 (diff)
downloadsonarqube-db4d7f826ef8a51797dc7a9d4f35f15b60867276.tar.gz
sonarqube-db4d7f826ef8a51797dc7a9d4f35f15b60867276.zip
SONAR-5056 Create DebtRemediationFunction API on batch side
Diffstat (limited to 'sonar-plugin-api')
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/DebtRemediationFunction.java115
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/Rule.java24
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/DefaultRule.java32
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/NewRule.java28
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/rule/RemediationFunction.java30
-rw-r--r--sonar-plugin-api/src/test/java/org/sonar/api/batch/rule/DebtRemediationFunctionTest.java77
-rw-r--r--sonar-plugin-api/src/test/java/org/sonar/api/batch/rule/internal/RulesBuilderTest.java11
7 files changed, 223 insertions, 94 deletions
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/DebtRemediationFunction.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/DebtRemediationFunction.java
new file mode 100644
index 00000000000..60f3faccefe
--- /dev/null
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/DebtRemediationFunction.java
@@ -0,0 +1,115 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.api.batch.rule;
+
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.sonar.api.utils.Duration;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
+/**
+ * @since 4.3
+ */
+public class DebtRemediationFunction {
+
+ public static enum Type {
+ LINEAR, LINEAR_OFFSET, CONSTANT_ISSUE
+ }
+
+ private Type type;
+ private Duration factor;
+ private Duration offset;
+
+ private DebtRemediationFunction(Type type, @Nullable Duration factor, @Nullable Duration offset) {
+ this.type = type;
+ this.factor = factor;
+ this.offset = offset;
+ }
+
+ public static DebtRemediationFunction create(Type type, @Nullable Duration factor, @Nullable Duration offset) {
+ return new DebtRemediationFunction(type, factor, offset);
+ }
+
+ public static DebtRemediationFunction createLinear(Duration factor) {
+ return new DebtRemediationFunction(Type.LINEAR, factor, null);
+ }
+
+ public static DebtRemediationFunction createLinearWithOffset(Duration factor, Duration offset) {
+ return new DebtRemediationFunction(Type.LINEAR_OFFSET, factor, offset);
+ }
+
+ public static DebtRemediationFunction createConstantPerIssue(Duration offset) {
+ return new DebtRemediationFunction(Type.CONSTANT_ISSUE, null, offset);
+ }
+
+ public Type type() {
+ return type;
+ }
+
+ @CheckForNull
+ public Duration factor() {
+ return factor;
+ }
+
+ @CheckForNull
+ public Duration offset() {
+ return offset;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ DebtRemediationFunction that = (DebtRemediationFunction) o;
+
+ if (type != that.type) {
+ return false;
+ }
+ if (factor != null ? !factor.equals(that.factor) : that.factor != null) {
+ return false;
+ }
+ if (offset != null ? !offset.equals(that.offset) : that.offset != null) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = type.hashCode();
+ result = 31 * result + (factor != null ? factor.hashCode() : 0);
+ result = 31 * result + (offset != null ? offset.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
+ }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/Rule.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/Rule.java
index 3332c5a89da..27a75566c09 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/Rule.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/Rule.java
@@ -20,10 +20,8 @@
package org.sonar.api.batch.rule;
import com.google.common.annotations.Beta;
-import org.sonar.api.rule.RemediationFunction;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.utils.Duration;
import javax.annotation.CheckForNull;
@@ -60,30 +58,14 @@ public interface Rule {
* @since 4.3
*/
@CheckForNull
- String characteristic();
+ String debtCharacteristic();
/**
- * Remediation function : one of LINEAR, LINEAR_OFFSET or CONSTANT_ISSUE.
+ * Remediation function : one of LINEAR (with a factor), LINEAR_OFFSET (with a factor and an offset) or CONSTANT_ISSUE (with an offset)
*
* @since 4.3
*/
@CheckForNull
- RemediationFunction function();
-
- /**
- * Remediation factor duration (used for LINEAR function).
- *
- * @since 4.3
- */
- @CheckForNull
- Duration factor();
-
- /**
- * Remediation offset duration (used for LINEAR_OFFSET or CONSTANT_ISSUE function).
- *
- * @since 4.3
- */
- @CheckForNull
- Duration offset();
+ DebtRemediationFunction debtRemediationFunction();
}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/DefaultRule.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/DefaultRule.java
index 13a3d3890eb..5b2db0d27b9 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/DefaultRule.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/DefaultRule.java
@@ -20,12 +20,11 @@
package org.sonar.api.batch.rule.internal;
import com.google.common.collect.ImmutableMap;
+import org.sonar.api.batch.rule.DebtRemediationFunction;
import org.sonar.api.batch.rule.Rule;
import org.sonar.api.batch.rule.RuleParam;
-import org.sonar.api.rule.RemediationFunction;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.utils.Duration;
import javax.annotation.CheckForNull;
import javax.annotation.concurrent.Immutable;
@@ -38,10 +37,9 @@ public class DefaultRule implements Rule {
private final RuleKey key;
private final Integer id;
- private final String name, severity, description, metadata, characteristic;
+ private final String name, severity, description, metadata, debtCharacteristic;
private final RuleStatus status;
- private final RemediationFunction function;
- private final Duration factor, offset;
+ private final DebtRemediationFunction debtRemediationFunction;
private final Map<String, RuleParam> params;
@@ -53,10 +51,8 @@ public class DefaultRule implements Rule {
this.description = newRule.description;
this.metadata = newRule.metadata;
this.status = newRule.status;
- this.characteristic = newRule.characteristic;
- this.function = newRule.function;
- this.factor = newRule.factor;
- this.offset = newRule.offset;
+ this.debtCharacteristic = newRule.debtCharacteristic;
+ this.debtRemediationFunction = newRule.debtRemediationFunction;
ImmutableMap.Builder<String, RuleParam> builder = ImmutableMap.builder();
for (NewRuleParam newRuleParam : newRule.params.values()) {
@@ -101,23 +97,13 @@ public class DefaultRule implements Rule {
}
@Override
- public String characteristic() {
- return characteristic;
+ public String debtCharacteristic() {
+ return debtCharacteristic;
}
@Override
- public RemediationFunction function() {
- return function;
- }
-
- @Override
- public Duration factor() {
- return factor;
- }
-
- @Override
- public Duration offset() {
- return offset;
+ public DebtRemediationFunction debtRemediationFunction() {
+ return debtRemediationFunction;
}
@Override
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/NewRule.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/NewRule.java
index 1f67eeb4e96..c3506ff1b50 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/NewRule.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rule/internal/NewRule.java
@@ -21,11 +21,10 @@ package org.sonar.api.batch.rule.internal;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
-import org.sonar.api.rule.RemediationFunction;
+import org.sonar.api.batch.rule.DebtRemediationFunction;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.utils.Duration;
import javax.annotation.Nullable;
@@ -38,9 +37,8 @@ public class NewRule {
final RuleKey key;
Integer id;
- String name, description, severity = DEFAULT_SEVERITY, metadata, characteristic;
- RemediationFunction function;
- Duration factor, offset;
+ String name, description, severity = DEFAULT_SEVERITY, metadata, debtCharacteristic;
+ DebtRemediationFunction debtRemediationFunction;
RuleStatus status = RuleStatus.defaultStatus();
Map<String, NewRuleParam> params = new HashMap<String, NewRuleParam>();
@@ -69,7 +67,7 @@ public class NewRule {
}
public NewRule setStatus(@Nullable RuleStatus s) {
- this.status = (RuleStatus)ObjectUtils.defaultIfNull(s, RuleStatus.defaultStatus());
+ this.status = (RuleStatus) ObjectUtils.defaultIfNull(s, RuleStatus.defaultStatus());
return this;
}
@@ -78,23 +76,13 @@ public class NewRule {
return this;
}
- public NewRule setCharacteristic(@Nullable String c) {
- this.characteristic = c;
+ public NewRule setDebtCharacteristic(@Nullable String c) {
+ this.debtCharacteristic = c;
return this;
}
- public NewRule setFunction(@Nullable RemediationFunction f) {
- this.function = f;
- return this;
- }
-
- public NewRule setFactor(@Nullable Duration f) {
- this.factor = f;
- return this;
- }
-
- public NewRule setOffset(@Nullable Duration o) {
- this.offset = o;
+ public NewRule setDebtRemediationFunction(@Nullable DebtRemediationFunction f) {
+ this.debtRemediationFunction = f;
return this;
}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/rule/RemediationFunction.java b/sonar-plugin-api/src/main/java/org/sonar/api/rule/RemediationFunction.java
deleted file mode 100644
index f88baec8ff0..00000000000
--- a/sonar-plugin-api/src/main/java/org/sonar/api/rule/RemediationFunction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube 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.
- *
- * SonarQube 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 this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.sonar.api.rule;
-
-/**
- * List of availables remediation function
- *
- * @since 4.3
- */
-public enum RemediationFunction {
- LINEAR, LINEAR_OFFSET, CONSTANT_ISSUE
-}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/rule/DebtRemediationFunctionTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/rule/DebtRemediationFunctionTest.java
new file mode 100644
index 00000000000..a377c4abb73
--- /dev/null
+++ b/sonar-plugin-api/src/test/java/org/sonar/api/batch/rule/DebtRemediationFunctionTest.java
@@ -0,0 +1,77 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.api.batch.rule;
+
+import org.junit.Test;
+import org.sonar.api.server.rule.DebtRemediationFunction;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+public class DebtRemediationFunctionTest {
+
+ @Test
+ public void create_linear() throws Exception {
+ org.sonar.api.server.rule.DebtRemediationFunction function = org.sonar.api.server.rule.DebtRemediationFunction.createLinear("10h");
+ assertThat(function.type()).isEqualTo(org.sonar.api.server.rule.DebtRemediationFunction.Type.LINEAR);
+ assertThat(function.factor()).isEqualTo("10h");
+ assertThat(function.offset()).isNull();
+ }
+
+ @Test
+ public void create_linear_with_offset() throws Exception {
+ org.sonar.api.server.rule.DebtRemediationFunction function = org.sonar.api.server.rule.DebtRemediationFunction.createLinearWithOffset("10h", "5min");
+ assertThat(function.type()).isEqualTo(org.sonar.api.server.rule.DebtRemediationFunction.Type.LINEAR_OFFSET);
+ assertThat(function.factor()).isEqualTo("10h");
+ assertThat(function.offset()).isEqualTo("5min");
+ }
+
+ @Test
+ public void create_constant_per_issue() throws Exception {
+ org.sonar.api.server.rule.DebtRemediationFunction function = org.sonar.api.server.rule.DebtRemediationFunction.createConstantPerIssue("10h");
+ assertThat(function.type()).isEqualTo(org.sonar.api.server.rule.DebtRemediationFunction.Type.CONSTANT_ISSUE);
+ assertThat(function.factor()).isNull();
+ assertThat(function.offset()).isEqualTo("10h");
+ }
+
+ @Test
+ public void test_equals_and_hashcode() throws Exception {
+ org.sonar.api.server.rule.DebtRemediationFunction function = org.sonar.api.server.rule.DebtRemediationFunction.createLinearWithOffset("10h", "5min");
+ org.sonar.api.server.rule.DebtRemediationFunction functionWithSameValue = org.sonar.api.server.rule.DebtRemediationFunction.createLinearWithOffset("10h", "5min");
+ org.sonar.api.server.rule.DebtRemediationFunction functionWithDifferentType = org.sonar.api.server.rule.DebtRemediationFunction.createConstantPerIssue("5min");
+
+ assertThat(function).isEqualTo(function);
+ assertThat(function).isEqualTo(functionWithSameValue);
+ assertThat(function).isNotEqualTo(functionWithDifferentType);
+ assertThat(function).isNotEqualTo(org.sonar.api.server.rule.DebtRemediationFunction.createLinearWithOffset("11h", "5min"));
+ assertThat(function).isNotEqualTo(org.sonar.api.server.rule.DebtRemediationFunction.createLinearWithOffset("10h", "6min"));
+ assertThat(function).isNotEqualTo(org.sonar.api.server.rule.DebtRemediationFunction.createLinear("10h"));
+ assertThat(function).isNotEqualTo(org.sonar.api.server.rule.DebtRemediationFunction.createConstantPerIssue("6min"));
+
+ assertThat(function.hashCode()).isEqualTo(function.hashCode());
+ assertThat(function.hashCode()).isEqualTo(functionWithSameValue.hashCode());
+ assertThat(function.hashCode()).isNotEqualTo(functionWithDifferentType.hashCode());
+ }
+
+ @Test
+ public void test_to_string() throws Exception {
+ assertThat(DebtRemediationFunction.createLinearWithOffset("10h", "5min").toString()).isNotNull();
+ }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/rule/internal/RulesBuilderTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/rule/internal/RulesBuilderTest.java
index a314191e3cb..881823e3cf6 100644
--- a/sonar-plugin-api/src/test/java/org/sonar/api/batch/rule/internal/RulesBuilderTest.java
+++ b/sonar-plugin-api/src/test/java/org/sonar/api/batch/rule/internal/RulesBuilderTest.java
@@ -20,11 +20,13 @@
package org.sonar.api.batch.rule.internal;
import org.junit.Test;
+import org.sonar.api.batch.rule.DebtRemediationFunction;
import org.sonar.api.batch.rule.Rule;
import org.sonar.api.batch.rule.Rules;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
+import org.sonar.api.utils.Duration;
import static org.fest.assertions.Assertions.assertThat;
import static org.fest.assertions.Fail.fail;
@@ -46,6 +48,8 @@ public class RulesBuilderTest {
newSquid1.setMetadata("foo=bar");
newSquid1.setSeverity(Severity.CRITICAL);
newSquid1.setStatus(RuleStatus.BETA);
+ newSquid1.setDebtCharacteristic("COMPILER");
+ newSquid1.setDebtRemediationFunction(DebtRemediationFunction.create(DebtRemediationFunction.Type.LINEAR_OFFSET, Duration.create(10), Duration.create(60)));
newSquid1.addParam("min");
newSquid1.addParam("max").setDescription("Maximum");
// most simple rule
@@ -67,6 +71,11 @@ public class RulesBuilderTest {
assertThat(squid1.metadata()).isEqualTo("foo=bar");
assertThat(squid1.status()).isEqualTo(RuleStatus.BETA);
assertThat(squid1.severity()).isEqualTo(Severity.CRITICAL);
+ assertThat(squid1.debtCharacteristic()).isEqualTo("COMPILER");
+ assertThat(squid1.debtRemediationFunction().type()).isEqualTo(DebtRemediationFunction.Type.LINEAR_OFFSET);
+ assertThat(squid1.debtRemediationFunction().factor()).isEqualTo(Duration.create(10));
+ assertThat(squid1.debtRemediationFunction().offset()).isEqualTo(Duration.create(60));
+ assertThat(squid1.debtCharacteristic()).isEqualTo("COMPILER");
assertThat(squid1.params()).hasSize(2);
assertThat(squid1.param("min").key()).isEqualTo("min");
assertThat(squid1.param("min").description()).isNull();
@@ -80,6 +89,8 @@ public class RulesBuilderTest {
assertThat(squid2.metadata()).isNull();
assertThat(squid2.status()).isEqualTo(RuleStatus.defaultStatus());
assertThat(squid2.severity()).isEqualTo(Severity.defaultSeverity());
+ assertThat(squid2.debtCharacteristic()).isNull();
+ assertThat(squid2.debtRemediationFunction()).isNull();
assertThat(squid2.params()).isEmpty();
}