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
021 package org.sonar.api.technicaldebt.batch.internal;
022
023 import org.apache.commons.lang.StringUtils;
024 import org.apache.commons.lang.builder.ToStringBuilder;
025 import org.apache.commons.lang.builder.ToStringStyle;
026 import org.sonar.api.technicaldebt.batch.Characteristic;
027
028 import javax.annotation.CheckForNull;
029 import javax.annotation.Nullable;
030
031 import java.util.Date;
032 import java.util.List;
033
034 import static com.google.common.collect.Lists.newArrayList;
035
036 public class DefaultCharacteristic implements Characteristic {
037
038 private Integer id;
039 private String key;
040 private String name;
041 private Integer order;
042 private DefaultCharacteristic parent;
043 private DefaultCharacteristic root;
044 private List<DefaultCharacteristic> children;
045 private List<DefaultRequirement> requirements;
046
047 private Date createdAt;
048 private Date updatedAt;
049
050 public DefaultCharacteristic() {
051 this.children = newArrayList();
052 this.requirements = newArrayList();
053 }
054
055 public Integer id() {
056 return id;
057 }
058
059 public DefaultCharacteristic setId(Integer id) {
060 this.id = id;
061 return this;
062 }
063
064 public String key() {
065 return key;
066 }
067
068 public DefaultCharacteristic setKey(String key) {
069 this.key = StringUtils.trimToNull(key);
070 return this;
071 }
072
073 public String name() {
074 return name;
075 }
076
077 public DefaultCharacteristic setName(String name) {
078 this.name = name;
079 return this;
080 }
081
082 // TODO Replace this is a TechnicalDebtFactory class
083 public DefaultCharacteristic setName(String s, boolean asKey) {
084 this.name = StringUtils.trimToNull(s);
085 if (asKey) {
086 this.key = StringUtils.upperCase(this.name);
087 this.key = StringUtils.replaceChars(this.key, ' ', '_');
088 }
089 return this;
090 }
091
092 @CheckForNull
093 public Integer order() {
094 return order;
095 }
096
097 public DefaultCharacteristic setOrder(@Nullable Integer order) {
098 this.order = order;
099 return this;
100 }
101
102 @CheckForNull
103 public DefaultCharacteristic parent() {
104 return parent;
105 }
106
107 public DefaultCharacteristic setParent(@Nullable DefaultCharacteristic parent) {
108 if (parent != null) {
109 this.parent = parent;
110 parent.addChild(this);
111 }
112 return this;
113 }
114
115 @CheckForNull
116 public DefaultCharacteristic root() {
117 return root;
118 }
119
120 public DefaultCharacteristic setRoot(@Nullable DefaultCharacteristic root) {
121 this.root = root;
122 return this;
123 }
124
125 public List<DefaultCharacteristic> children() {
126 return children;
127 }
128
129 private DefaultCharacteristic addChild(DefaultCharacteristic child) {
130 this.children.add(child);
131 return this;
132 }
133
134 public List<DefaultRequirement> requirements() {
135 return requirements;
136 }
137
138 public DefaultCharacteristic addRequirement(DefaultRequirement requirement) {
139 this.requirements.add(requirement);
140 return this;
141 }
142
143 public boolean isRoot() {
144 return parent == null;
145 }
146
147 public Date createdAt() {
148 return createdAt;
149 }
150
151 public DefaultCharacteristic setCreatedAt(Date createdAt) {
152 this.createdAt = createdAt;
153 return this;
154 }
155
156 public Date updatedAt() {
157 return updatedAt;
158 }
159
160 public DefaultCharacteristic setUpdatedAt(Date updatedAt) {
161 this.updatedAt = updatedAt;
162 return this;
163 }
164
165 @Override
166 public String toString() {
167 return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
168 }
169
170 @Override
171 public boolean equals(Object o) {
172 if (this == o) {
173 return true;
174 }
175 if (o == null || getClass() != o.getClass()) {
176 return false;
177 }
178 DefaultCharacteristic that = (DefaultCharacteristic) o;
179 return key.equals(that.key);
180 }
181
182 @Override
183 public int hashCode() {
184 return key.hashCode();
185 }
186 }