package scrum.server.issues; import ilarkesto.base.Utl; import ilarkesto.base.time.DateAndTime; import java.util.Comparator; import java.util.Set; import scrum.client.common.LabelSupport; import scrum.client.common.ReferenceSupport; import scrum.server.admin.User; import scrum.server.common.Numbered; import scrum.server.release.Release; public class Issue extends GIssue implements Numbered, ReferenceSupport, LabelSupport { public String getStatusText() { String releasesText = isFixReleasesEmpty() ? "" : " for " + getFixReleasesAsString(); if (isClosed()) return "Issue is closed" + releasesText + "."; if (isIdea()) return "Idea is accepted and the Product Owner needs to create a Story of it."; if (isBug()) { if (isFixed()) return "Bug is fixed" + releasesText + ". Needs to be tested."; if (isOwnerSet()) return getOwner().getName() + " is working on the Bug" + releasesText + "."; return "Bug is accepted as '" + getSeverityLabel() + "' and the Team needs to fix it" + releasesText + "."; } return "Product Owner needs to review this Issue."; } public String getFixReleasesAsString() { Set<Release> releases = getFixReleases(); if (releases.isEmpty()) return null; if (releases.size() == 1) return "Release " + Utl.getElement(releases, 0).getLabel(); StringBuilder sb = new StringBuilder(); sb.append("Releases "); boolean first = true; for (Release release : releases) { if (first) { first = false; } else { sb.append(", "); } sb.append(release.getLabel()); } return sb.toString(); } public String getSeverityLabel() { return scrum.client.issues.Issue.SEVERITY_LABELS.getLabel(getSeverity()); } public String getIssuer() { if (isCreatorSet()) return getCreator().getName(); String name = getIssuerName(); String email = getIssuerEmail(); if (name == null && email == null) return null; if (name == null) return email; if (email == null) return name; return name + " (" + email + ")"; } public boolean isBug() { return isAccepted() && isUrgent(); } public boolean isIdea() { return isAccepted() && !isUrgent(); } public boolean isFixed() { return isFixDateSet(); } public boolean isOpen() { return !isClosed(); } protected boolean isAccepted() { return !isClosed() && isAcceptDateSet(); } @Override public void updateNumber() { if (getNumber() == 0) setNumber(getProject().generateIssueNumber()); } @Override public String getReference() { return scrum.client.issues.Issue.REFERENCE_PREFIX + getNumber(); } public String getReferenceAndLabel() { return getReference() + " " + getLabel(); } public boolean isClosed() { return isCloseDateSet(); } @Override public boolean isVisibleFor(User user) { return getProject().isVisibleFor(user); } public boolean isEditableBy(User user) { return getProject().isEditableBy(user); } @Override public void ensureIntegrity() { super.ensureIntegrity(); updateNumber(); if (!isTypeSet()) setType(scrum.client.issues.Issue.INIT_TYPE); if (!isDateSet()) setDate(DateAndTime.now()); if (isAcceptDateSet() || isCloseDateSet()) setPublished(true); } @Override public String toString() { return getReferenceAndLabel(); } public static final Comparator<Issue> CLOSE_DATE_COMPARATOR = new Comparator<Issue>() { @Override public int compare(Issue a, Issue b) { return Utl.compare(b.getCloseDate(), a.getCloseDate()); } }; public static final Comparator<Issue> ACCEPT_DATE_COMPARATOR = new Comparator<Issue>() { @Override public int compare(Issue a, Issue b) { return Utl.compare(b.getAcceptDate(), a.getAcceptDate()); } }; public static final Comparator<Issue> DATE_COMPARATOR = new Comparator<Issue>() { @Override public int compare(Issue a, Issue b) { return Utl.compare(b.getDate(), a.getDate()); } }; }