diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-03-26 13:19:19 +0100 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-03-26 13:19:19 +0100 |
commit | 679bc82d5c453bccdf2eb8f51c410cda1773165a (patch) | |
tree | bc13cdeae8440a1764247de177c51112fdd39857 /sonar-plugin-api/src/main/java | |
parent | 55a9be1fa31394aec3093bc27cd9c501f0f0cc60 (diff) | |
download | sonarqube-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.java | 1 | ||||
-rw-r--r-- | sonar-plugin-api/src/main/java/org/sonar/api/utils/Duration.java | 40 |
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) { |