package scrum.client.release;
import ilarkesto.gwt.client.Date;
import ilarkesto.gwt.client.HyperlinkWidget;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import scrum.client.ScrumGwt;
import scrum.client.collaboration.ForumSupport;
import scrum.client.common.ReferenceSupport;
import scrum.client.common.ShowEntityAction;
import scrum.client.issues.Issue;
import scrum.client.project.Project;
import scrum.client.project.Requirement;
import scrum.client.sprint.Sprint;
import com.google.gwt.user.client.ui.Widget;
public class Release extends GRelease implements ReferenceSupport, ForumSupport {
public static final String REFERENCE_PREFIX = "rel";
public Release(Project project) {
setProject(project);
}
public Release(Map data) {
super(data);
}
public boolean isMajor() {
return !isBugfix();
}
public boolean isBugfix() {
return isParentReleaseSet();
}
public List<Release> getBugfixReleases() {
return getDao().getReleasesByParentRelease(this);
}
public List<Issue> getAffectedByIssues() {
List<Issue> ret = new ArrayList<Issue>();
for (Issue issue : getDao().getIssues()) {
if (issue.getAffectedReleases().contains(this)) ret.add(issue);
}
return ret;
}
public List<Issue> getFixedIssues() {
List<Issue> ret = new ArrayList<Issue>();
for (Issue issue : getDao().getIssues()) {
if (issue.isClosed() && issue.getFixReleases().contains(this)) ret.add(issue);
}
return ret;
}
public List<Issue> getPlannedIssues() {
List<Issue> ret = new ArrayList<Issue>();
for (Issue issue : getDao().getIssues()) {
if (!issue.isClosed() && issue.getFixReleases().contains(this)) ret.add(issue);
}
return ret;
}
public String getReference() {
return REFERENCE_PREFIX + getNumber();
}
public Widget createForumItemWidget() {
return new HyperlinkWidget(new ShowEntityAction(this, getLabel()));
}
public String getIzemizedReleaseNotes() {
String notes = "";
// add Stories from all Sprints that are part of this Release
if (someSprintHasStories()) {
notes += "'''New Features'''\n\n";
for (Sprint sprint : getSprints()) {
for (Requirement story : sprint.getRequirements()) {
notes += "* " + (story.isClosed() ? "" : "(UNFINISHED) ") + story.getReferenceAndLabel() + "\n";
}
}
notes += "\n\n";
}
// add Bugs that have been fixed for this Release
if (!getFixedIssues().isEmpty() || !getPlannedIssues().isEmpty()) {
notes += "'''Fixed Bugs'''\n\n";
for (Issue issue : getFixedIssues()) {
notes += "* " + issue.getReferenceAndLabel() + "\n";
}
for (Issue issue : getPlannedIssues()) {
notes += "* (UNFINISHED) " + issue.getReferenceAndLabel() + "\n";
}
notes += "\n\n";
}
// add all Bugs that have not been fixed for this Release
if (!getAffectedByIssues().isEmpty()) {
notes += "'''Known Issues'''\n\n";
for (Issue issue : getAffectedByIssues()) {
notes += "* " + issue.getReferenceAndLabel() + "\n";
}
}
return notes;
}
private boolean someSprintHasStories() {
for (Sprint sprint : getSprints()) {
if (!sprint.getRequirements().isEmpty()) return true;
}
return false;
}
@Override
public String toHtml() {
return ScrumGwt.toHtml(getReference(), getLabel());
}
@Override
public String toString() {
return getReference() + " " + getLabel();
}
public static final Comparator<Release> DATE_COMPARATOR = new Comparator<Release>() {
public int compare(Release ra, Release rb) {
Date a = ra.getReleaseDate();
Date b = rb.getReleaseDate();
if (a == null && b == null) return 0;
if (a == null) return 1;
if (b == null) return -1;
return a.compareTo(b);
}
};
public static final Comparator<Release> DATE_REVERSE_COMPARATOR = new Comparator<Release>() {
public int compare(Release ra, Release rb) {
return -DATE_COMPARATOR.compare(ra, rb);
}
};
public List<Requirement> getRequirements() {
List<Requirement> ret = new ArrayList<Requirement>();
for (Sprint sprint : getSprints()) {
ret.addAll(sprint.getRequirements());
}
return ret;
}
}