001/* 002 * SonarQube, open source software quality management tool. 003 * Copyright (C) 2008-2013 SonarSource 004 * mailto:contact AT sonarsource DOT com 005 * 006 * SonarQube is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 3 of the License, or (at your option) any later version. 010 * 011 * SonarQube is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public License 017 * along with this program; if not, write to the Free Software Foundation, 018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 019 */ 020 021package org.sonar.api.technicaldebt.server.internal; 022 023import org.apache.commons.lang.builder.ToStringBuilder; 024import org.apache.commons.lang.builder.ToStringStyle; 025import org.sonar.api.rule.RuleKey; 026import org.sonar.api.technicaldebt.server.Characteristic; 027import org.sonar.api.utils.WorkUnit; 028import org.sonar.api.utils.internal.WorkDuration; 029 030import javax.annotation.CheckForNull; 031import javax.annotation.Nullable; 032 033/** 034 * @since 4.1 035 */ 036public class DefaultCharacteristic implements Characteristic { 037 038 private Integer id; 039 private String key; 040 private String name; 041 private Integer order; 042 private Integer parentId; 043 private Integer rootId; 044 private RuleKey ruleKey; 045 private String function; 046 private Integer factorValue; 047 private WorkDuration.UNIT factorUnit; 048 private Integer offsetValue; 049 private WorkDuration.UNIT offsetUnit; 050 051 public Integer id() { 052 return id; 053 } 054 055 public DefaultCharacteristic setId(Integer id) { 056 this.id = id; 057 return this; 058 } 059 060 @CheckForNull 061 public String key() { 062 return key; 063 } 064 065 public DefaultCharacteristic setKey(@Nullable String key) { 066 this.key = key; 067 return this; 068 } 069 070 @CheckForNull 071 public String name() { 072 return name; 073 } 074 075 public DefaultCharacteristic setName(@Nullable String name) { 076 this.name = name; 077 return this; 078 } 079 080 @CheckForNull 081 public Integer order() { 082 return order; 083 } 084 085 public DefaultCharacteristic setOrder(@Nullable Integer order) { 086 this.order = order; 087 return this; 088 } 089 090 @CheckForNull 091 public Integer parentId() { 092 return parentId; 093 } 094 095 public DefaultCharacteristic setParentId(@Nullable Integer parentId) { 096 this.parentId = parentId; 097 return this; 098 } 099 100 @CheckForNull 101 public Integer rootId() { 102 return rootId; 103 } 104 105 public DefaultCharacteristic setRootId(@Nullable Integer rootId) { 106 this.rootId = rootId; 107 return this; 108 } 109 110 @CheckForNull 111 public RuleKey ruleKey() { 112 return ruleKey; 113 } 114 115 public DefaultCharacteristic setRuleKey(@Nullable RuleKey ruleKey) { 116 this.ruleKey = ruleKey; 117 return this; 118 } 119 120 @CheckForNull 121 public String function() { 122 return function; 123 } 124 125 public DefaultCharacteristic setFunction(@Nullable String function) { 126 this.function = function; 127 return this; 128 } 129 130 /** 131 * @deprecated since 4.2 132 */ 133 @Deprecated 134 @CheckForNull 135 public WorkUnit factor() { 136 if (factorValue != null && factorUnit != null) { 137 return WorkUnit.create((double) factorValue, fromUnit(factorUnit)); 138 } 139 return null; 140 } 141 142 /** 143 * @deprecated since 4.2 144 */ 145 @Deprecated 146 public DefaultCharacteristic setFactor(@Nullable WorkUnit factor) { 147 if (factor != null) { 148 this.factorValue = (int) factor.getValue(); 149 this.factorUnit = toUnit(factor.getUnit()); 150 } 151 return this; 152 } 153 154 @CheckForNull 155 public Integer factorValue() { 156 return factorValue; 157 } 158 159 public DefaultCharacteristic setFactorValue(@Nullable Integer factorValue) { 160 this.factorValue = factorValue; 161 return this; 162 } 163 164 @CheckForNull 165 public WorkDuration.UNIT factorUnit() { 166 return factorUnit; 167 } 168 169 public DefaultCharacteristic setFactorUnit(@Nullable WorkDuration.UNIT factorUnit) { 170 this.factorUnit = factorUnit; 171 return this; 172 } 173 174 /** 175 * @deprecated since 4.2 176 */ 177 @Deprecated 178 public WorkUnit offset() { 179 if (offsetValue != null && offsetUnit != null) { 180 return WorkUnit.create((double) offsetValue, fromUnit(offsetUnit)); 181 } 182 return null; 183 } 184 185 /** 186 * @deprecated since 4.2 187 */ 188 @Deprecated 189 public DefaultCharacteristic setOffset(@Nullable WorkUnit offset) { 190 if (offset != null) { 191 this.offsetValue = (int) offset.getValue(); 192 this.offsetUnit = toUnit(offset.getUnit()); 193 } 194 return this; 195 } 196 197 @CheckForNull 198 public Integer offsetValue() { 199 return offsetValue; 200 } 201 202 public DefaultCharacteristic setOffsetValue(@Nullable Integer offsetValue) { 203 this.offsetValue = offsetValue; 204 return this; 205 } 206 207 @CheckForNull 208 public WorkDuration.UNIT offsetUnit() { 209 return offsetUnit; 210 } 211 212 public DefaultCharacteristic setOffsetUnit(@Nullable WorkDuration.UNIT offsetUnit) { 213 this.offsetUnit = offsetUnit; 214 return this; 215 } 216 217 public static WorkDuration.UNIT toUnit(@Nullable String requirementUnit) { 218 if (requirementUnit != null) { 219 if (WorkUnit.DAYS.equals(requirementUnit)) { 220 return WorkDuration.UNIT.DAYS; 221 } else if (WorkUnit.HOURS.equals(requirementUnit)) { 222 return WorkDuration.UNIT.HOURS; 223 } else if (WorkUnit.MINUTES.equals(requirementUnit)) { 224 return WorkDuration.UNIT.MINUTES; 225 } 226 throw new IllegalStateException("Invalid unit : " + requirementUnit); 227 } 228 return null; 229 } 230 231 private static String fromUnit(WorkDuration.UNIT unit) { 232 if (WorkDuration.UNIT.DAYS.equals(unit)) { 233 return WorkUnit.DAYS; 234 } else if (WorkDuration.UNIT.HOURS.equals(unit)) { 235 return WorkUnit.HOURS; 236 } else if (WorkDuration.UNIT.MINUTES.equals(unit)) { 237 return WorkUnit.MINUTES; 238 } 239 throw new IllegalStateException("Invalid unit : " + unit); 240 } 241 242 public boolean isRoot() { 243 return parentId == null; 244 } 245 246 public boolean isRequirement() { 247 return ruleKey != null; 248 } 249 250 @Override 251 public boolean equals(Object o) { 252 if (this == o) { 253 return true; 254 } 255 if (o == null || getClass() != o.getClass()) { 256 return false; 257 } 258 259 DefaultCharacteristic that = (DefaultCharacteristic) o; 260 261 if (key != null ? !key.equals(that.key) : that.key != null) { 262 return false; 263 } 264 if (ruleKey != null ? !ruleKey.equals(that.ruleKey) : that.ruleKey != null) { 265 return false; 266 } 267 268 return true; 269 } 270 271 @Override 272 public int hashCode() { 273 int result = key != null ? key.hashCode() : 0; 274 result = 31 * result + (ruleKey != null ? ruleKey.hashCode() : 0); 275 return result; 276 } 277 278 @Override 279 public String toString() { 280 return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); 281 } 282 283}