aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-plugin-api/src/main/java
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2014-03-26 13:19:19 +0100
committerJulien Lancelot <julien.lancelot@sonarsource.com>2014-03-26 13:19:19 +0100
commit679bc82d5c453bccdf2eb8f51c410cda1773165a (patch)
treebc13cdeae8440a1764247de177c51112fdd39857 /sonar-plugin-api/src/main/java
parent55a9be1fa31394aec3093bc27cd9c501f0f0cc60 (diff)
downloadsonarqube-679bc82d5c453bccdf2eb8f51c410cda1773165a.tar.gz
sonarqube-679bc82d5c453bccdf2eb8f51c410cda1773165a.zip
Improve duration format validation
Diffstat (limited to 'sonar-plugin-api/src/main/java')
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/server/debt/internal/DefaultDebtRemediationFunction.java1
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/utils/Duration.java40
2 files changed, 31 insertions, 10 deletions
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/server/debt/internal/DefaultDebtRemediationFunction.java b/sonar-plugin-api/src/main/java/org/sonar/api/server/debt/internal/DefaultDebtRemediationFunction.java
index 759aef8d543..1f13976ea27 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/server/debt/internal/DefaultDebtRemediationFunction.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/server/debt/internal/DefaultDebtRemediationFunction.java
@@ -38,7 +38,6 @@ public class DefaultDebtRemediationFunction implements DebtRemediationFunction {
public DefaultDebtRemediationFunction(Type type, @Nullable String factor, @Nullable String offset) {
this.type = type;
- // TODO validate factor and offset format
this.factor = sanitizeValue("factor", factor);
this.offset = sanitizeValue("offset", offset);
validate();
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/Duration.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/Duration.java
index c4db504e465..31ea02837d2 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/Duration.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/Duration.java
@@ -20,9 +20,12 @@
package org.sonar.api.utils;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
+import javax.annotation.Nullable;
+
import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -53,20 +56,35 @@ public class Duration implements Serializable {
}
public static Duration decode(String text, int hoursInDay) {
- return new Duration(extractValue(text, DAY), extractValue(text, HOUR), extractValue(text, MINUTE), hoursInDay);
- }
+ int days = 0, hours = 0, minutes = 0;
+ String sanitizedText = StringUtils.deleteWhitespace(text);
+ Pattern pattern = Pattern.compile("\\s*+(?:(\\d++)\\s*+" + DAY + ")?+\\s*+(?:(\\d++)\\s*+" + HOUR + ")?+\\s*+(?:(\\d++)\\s*+" + MINUTE + ")?+\\s*+");
+ Matcher matcher = pattern.matcher(text);
- private static int extractValue(String text, String unit) {
try {
- Pattern pattern = Pattern.compile("(\\d*?)\\D*" + unit);
- Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
- String daysString = matcher.group(1);
- return Integer.parseInt(daysString);
+ String daysDuration = matcher.group(1);
+ if (daysDuration != null) {
+ days = Integer.parseInt(daysDuration);
+ sanitizedText = sanitizedText.replace(daysDuration + DAY, "");
+ }
+ String hoursText = matcher.group(2);
+ if (hoursText != null) {
+ hours = Integer.parseInt(hoursText);
+ sanitizedText = sanitizedText.replace(hoursText + HOUR, "");
+ }
+ String minutesText = matcher.group(3);
+ if (minutesText != null) {
+ minutes = Integer.parseInt(minutesText);
+ sanitizedText = sanitizedText.replace(minutesText + MINUTE, "");
+ }
+ if (sanitizedText.isEmpty()) {
+ return new Duration(days, hours, minutes, hoursInDay);
+ }
}
- return 0;
+ throw invalid(text, null);
} catch (NumberFormatException e) {
- throw new IllegalArgumentException(String.format("Duration '%s' is invalid, it should use the following sample format : 2d 10h 15min", text), e);
+ throw invalid(text, e);
}
}
@@ -113,6 +131,10 @@ public class Duration implements Serializable {
return Duration.create(durationInMinutes * factor);
}
+ private static IllegalArgumentException invalid(String text, @Nullable Exception e) {
+ throw new IllegalArgumentException(String.format("Duration '%s' is invalid, it should use the following sample format : 2d 10h 15min", text), e);
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {