package com.thinkbiganalytics.jira.domain;
/*-
* #%L
* thinkbig-jira-rest-client
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.google.common.base.MoreObjects;
import com.thinkbiganalytics.jira.domain.util.UriUtil;
import org.joda.time.DateTime;
import java.net.URI;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
*/
public class Issue extends BasicIssue {
private Status status;
private IssueType issueType;
private Project project;
private URI transitionsUri;
private Collection<Component> components;
private String summary;
private String description;
private User reporter;
private User assignee;
private Resolution resolution;
private DateTime creationDate;
private DateTime updateDate;
private DateTime dueDate;
private Priority priority;
private Votes votes;
private Collection<Version> fixVersions;
private Collection<Version> affectedVersions;
private Collection<Comment> comments;
private Collection<IssueLink> issueLinks;
//private Collection<Worklog> worklogs;
// private BasicWatchers watchers;
private TimeTracking timeTracking;
// private Collection<Subtask> subtasks;
// private Collection<ChangelogGroup> changelog;
// private Operations operations;
private Set<String> labels;
public Issue(String projectKey, String issueTypeName, String summary, String description) {
Project project = new Project();
project.setKey(projectKey);
IssueType issueType = new IssueType();
issueType.setName(issueTypeName);
this.project = project;
this.issueType = issueType;
this.description = description;
this.summary = summary;
}
public Issue(String projectKey, String issueTypeName, String summary, String description, String assigneeName) {
this(projectKey, issueTypeName, summary, description);
User user = new User();
user.setName(assigneeName);
this.setAssignee(user);
}
public Issue(GetIssue getIssue) {
super(getIssue);
this.status = getIssue.getFields().getStatus();
this.issueType = getIssue.getFields().getIssueType();
this.project = getIssue.getFields().getProject();
this.components = getIssue.getFields().getComponents();
this.summary = getIssue.getFields().getSummary();
this.description = getIssue.getFields().getDescription();
this.reporter = getIssue.getFields().getReporter();
this.assignee = getIssue.getFields().getAssignee();
this.resolution = getIssue.getFields().getResolution();
this.creationDate = getIssue.getFields().getCreated();
this.updateDate = getIssue.getFields().getUpdated();
this.dueDate = getIssue.getFields().getDuedate();
this.priority = getIssue.getFields().getPriority();
this.votes = getIssue.getFields().getVotes();
this.fixVersions = getIssue.getFields().getFixVersions();
this.affectedVersions = getIssue.getFields().getAffectedVersions();
if (getIssue.getFields().getComments() != null) {
this.comments = getIssue.getFields().getComments().getComments();
}
this.issueLinks = getIssue.getFields().getIssuelinks();
this.timeTracking = getIssue.getFields().getTimetracking();
if (getIssue.getFields().getLabels() != null) {
this.labels = new HashSet(getIssue.getFields().getLabels());
}
}
public Issue(URI self, String key, Long id) {
super(self, key, id);
}
public Status getStatus() {
return status;
}
/**
* @return reporter of this issue or <code>null</code> if this issue has no reporter
*/
public User getReporter() {
return reporter;
}
public void setReporter(User reporter) {
this.reporter = reporter;
}
/**
* @return assignee of this issue or <code>null</code> if this issue is unassigned.
*/
public User getAssignee() {
return assignee;
}
public void setAssignee(User assignee) {
this.assignee = assignee;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
/**
* @return priority of this issue
*/
public Priority getPriority() {
return priority;
}
/**
* @return issue links for this issue (possibly nothing) or <code>null</code> when issue links are deactivated for this JIRA instance
*/
public Iterable<IssueLink> getIssueLinks() {
return issueLinks;
}
/**
* @return issue type
*/
public IssueType getIssueType() {
return issueType;
}
/**
* @return comments for this issue
*/
public Iterable<Comment> getComments() {
return comments;
}
public URI getCommentsUri() {
return UriUtil.path(getSelf(), "comment");
}
/**
* @return project this issue belongs to
*/
public Project getProject() {
return project;
}
public void setProject(Project project) {
this.project = project;
}
/**
* @return <code>null</code when voting is disabled in JIRA
*/
public Votes getVotes() {
return votes;
}
public Iterable<Version> getFixVersions() {
return fixVersions;
}
public URI getTransitionsUri() {
return transitionsUri;
}
public Iterable<Version> getAffectedVersions() {
return affectedVersions;
}
public Iterable<Component> getComponents() {
return components;
}
public Set<String> getLabels() {
return labels;
}
public URI getVotesUri() {
return UriUtil.path(getSelf(), "votes");
}
public Resolution getResolution() {
return resolution;
}
public DateTime getCreationDate() {
return creationDate;
}
public DateTime getUpdateDate() {
return updateDate;
}
public DateTime getDueDate() {
return dueDate;
}
public void setDueDate(DateTime dueDate) {
this.dueDate = dueDate;
}
public TimeTracking getTimeTracking() {
return timeTracking;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
protected MoreObjects.ToStringHelper getToStringHelper() {
return super.getToStringHelper().
add("project", project).
add("status", status).
add("description", description).
add("reporter", reporter).
add("assignee", assignee).addValue("\n").
add("issueType", issueType).
add("creationDate", creationDate);
}
}