/* * SonarQube * Copyright (C) 2009-2017 SonarSource SA * mailto:info AT sonarsource DOT com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.sonar.scanner.issue.tracking; import com.google.common.base.Preconditions; import java.io.Serializable; import java.util.Date; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.sonar.api.rule.RuleKey; import org.sonar.core.issue.tracking.Trackable; public class TrackedIssue implements Trackable, Serializable { private static final long serialVersionUID = -1755017079070964287L; private RuleKey ruleKey; private String key; private String severity; private Integer startLine; private Integer startLineOffset; private Integer endLine; private Integer endLineOffset; private Double gap; private boolean isNew; private Date creationDate; private String resolution; private String status; private String assignee; private String componentKey; private String message; private transient FileHashes hashes; public TrackedIssue() { hashes = null; } public TrackedIssue(@Nullable FileHashes hashes) { this.hashes = hashes; } @Override @CheckForNull public String getLineHash() { if (getLine() == null || hashes == null) { return null; } int line = getLine(); Preconditions.checkState(line <= hashes.length(), "Invalid line number for issue %s. File has only %s line(s)", this, hashes.length()); return hashes.getHash(line); } @Override public String getMessage() { return message; } public TrackedIssue setMessage(String message) { this.message = message; return this; } /** * Component key shared by all part of SonarQube (batch, server, WS...). * It doesn't include the branch. */ public String componentKey() { return componentKey; } /** * Component key shared by all part of SonarQube (batch, server, WS...). * It doesn't include the branch. */ public TrackedIssue setComponentKey(String componentKey) { this.componentKey = componentKey; return this; } public String key() { return key; } public Integer startLine() { return startLine; } @Override public Integer getLine() { return startLine; } public TrackedIssue setStartLine(Integer startLine) { this.startLine = startLine; return this; } public Integer startLineOffset() { return startLineOffset; } public TrackedIssue setStartLineOffset(Integer startLineOffset) { this.startLineOffset = startLineOffset; return this; } public Integer endLine() { return endLine; } public TrackedIssue setEndLine(Integer endLine) { this.endLine = endLine; return this; } public Integer endLineOffset() { return endLineOffset; } public TrackedIssue setEndLineOffset(Integer endLineOffset) { this.endLineOffset = endLineOffset; return this; } public TrackedIssue setKey(String key) { this.key = key; return this; } public String assignee() { return assignee; } public TrackedIssue setAssignee(String assignee) { this.assignee = assignee; return this; } public String resolution() { return resolution; } public TrackedIssue setResolution(String resolution) { this.resolution = resolution; return this; } public String status() { return status; } public TrackedIssue setStatus(String status) { this.status = status; return this; } @Override public RuleKey getRuleKey() { return ruleKey; } public String severity() { return severity; } public Double gap() { return gap; } public Date getCreationDate() { return creationDate; } public boolean isNew() { return isNew; } public TrackedIssue setNew(boolean isNew) { this.isNew = isNew; return this; } public Date creationDate() { return creationDate; } public TrackedIssue setCreationDate(Date creationDate) { this.creationDate = creationDate; return this; } public TrackedIssue setRuleKey(RuleKey ruleKey) { this.ruleKey = ruleKey; return this; } public TrackedIssue setSeverity(String severity) { this.severity = severity; return this; } public TrackedIssue setGap(Double gap) { this.gap = gap; return this; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((key == null) ? 0 : key.hashCode()); return result; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } TrackedIssue other = (TrackedIssue) obj; if (key == null) { if (other.key != null) { return false; } } else if (!key.equals(other.key)) { return false; } return true; } @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } }