diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-03-17 14:13:22 +0100 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-03-17 14:13:31 +0100 |
commit | db4d7f826ef8a51797dc7a9d4f35f15b60867276 (patch) | |
tree | 3b48dbf83df6d1796ac90a3d3d04f9ea173e1427 /sonar-plugin-api | |
parent | be23543432b96b3fdfd8a0cffaaf56dda0f5f158 (diff) | |
download | sonarqube-db4d7f826ef8a51797dc7a9d4f35f15b60867276.tar.gz sonarqube-db4d7f826ef8a51797dc7a9d4f35f15b60867276.zip |
SONAR-5056 Create DebtRemediationFunction API on batch side
Diffstat (limited to 'sonar-plugin-api')
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(); } |