]> source.dussan.org Git - sonarqube.git/blob
b975510a8f5939697ebc5c95482692bc23ae3266
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2017 SonarSource SA
4  * mailto:info AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 package org.sonar.api.server.debt.internal;
21
22 import com.google.common.base.MoreObjects;
23 import javax.annotation.CheckForNull;
24 import javax.annotation.Nullable;
25 import org.apache.commons.lang.StringUtils;
26 import org.apache.commons.lang.builder.EqualsBuilder;
27 import org.sonar.api.server.debt.DebtRemediationFunction;
28 import org.sonar.api.utils.Duration;
29
30 import static com.google.common.base.Preconditions.checkArgument;
31
32 public class DefaultDebtRemediationFunction implements DebtRemediationFunction {
33
34   private static final int HOURS_IN_DAY = 24;
35
36   private final Type type;
37   private final String gapMultiplier;
38   private final String baseEffort;
39
40   public DefaultDebtRemediationFunction(@Nullable Type type, @Nullable String gapMultiplier, @Nullable String baseEffort) {
41     this.type = type;
42     this.gapMultiplier = sanitizeValue("gap multiplier", gapMultiplier);
43     this.baseEffort = sanitizeValue("base effort", baseEffort);
44     validate();
45   }
46
47   @CheckForNull
48   private static String sanitizeValue(String label, @Nullable String s) {
49     if (StringUtils.isNotBlank(s)) {
50       try {
51         Duration duration = Duration.decode(s, HOURS_IN_DAY);
52         return duration.encode(HOURS_IN_DAY);
53       } catch (Exception e) {
54         throw new IllegalArgumentException(String.format("Invalid %s: %s (%s)", label, s, e.getMessage()), e);
55       }
56     }
57     return null;
58   }
59
60   @Override
61   public Type type() {
62     return type;
63   }
64
65   /**
66    * @deprecated since 5.5, replaced by {@link #gapMultiplier}
67    */
68   @Override
69   @CheckForNull
70   @Deprecated
71   public String coefficient() {
72     return gapMultiplier();
73   }
74
75
76   @Override
77   @CheckForNull
78   public String gapMultiplier() {
79     return gapMultiplier;
80   }
81
82   /**
83    * @deprecated since 5.5, replaced by {@link #baseEffort}
84    */
85   @Override
86   @CheckForNull
87   @Deprecated
88   public String offset() {
89     return baseEffort();
90   }
91
92   @Override
93   public String baseEffort() {
94     return baseEffort;
95   }
96
97
98   private void validate() {
99     checkArgument(type != null, "Remediation function type cannot be null");
100     switch (type) {
101       case LINEAR:
102         checkArgument(this.gapMultiplier != null && this.baseEffort == null, "Linear functions must only have a non empty gap multiplier");
103         break;
104       case LINEAR_OFFSET:
105         checkArgument(this.gapMultiplier != null && this.baseEffort != null, "Linear with offset functions must have both non null gap multiplier and base effort");
106         break;
107       case CONSTANT_ISSUE:
108         checkArgument(this.gapMultiplier == null && this.baseEffort != null, "Constant/issue functions must only have a non empty base effort");
109         break;
110       default:
111         throw new IllegalArgumentException(String.format("Unknown type on %s", this));
112     }
113   }
114
115   @Override
116   public boolean equals(Object o) {
117     if (!(o instanceof DefaultDebtRemediationFunction)) {
118       return false;
119     }
120     if (this == o) {
121       return true;
122     }
123     DefaultDebtRemediationFunction other = (DefaultDebtRemediationFunction) o;
124     return new EqualsBuilder()
125       .append(gapMultiplier, other.gapMultiplier())
126       .append(baseEffort, other.baseEffort())
127       .append(type, other.type())
128       .isEquals();
129   }
130
131   @Override
132   public int hashCode() {
133     int result = type.hashCode();
134     result = 31 * result + (gapMultiplier != null ? gapMultiplier.hashCode() : 0);
135     result = 31 * result + (baseEffort != null ? baseEffort.hashCode() : 0);
136     return result;
137   }
138
139   @Override
140   public String toString() {
141     return MoreObjects.toStringHelper(DebtRemediationFunction.class)
142       .add("type", type)
143       .add("gap multiplier", gapMultiplier)
144       .add("base effort", baseEffort)
145       .toString();
146   }
147 }