package org.jvnet.hudson.plugins.jira.issueversioning.domain.api.model.rest;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import com.google.common.base.Preconditions;
/**
* @author Stig Kleppe-Jorgensen, 2009.12.28
* @fixme add description
*/
@XmlRootElement
public final class Project {
@XmlElement
private final String name;
@XmlElement
private String versionForOkBuild;
@XmlElement
private final Build okBuild;
@XmlElement
private final Set<Build> failedBuilds = new HashSet<Build>();
@XmlTransient
private final Set<String> allIssues;
/**
* JAXB need default constructor to work.
*/
private Project() {
name = "";
versionForOkBuild = "";
okBuild = Build.EMPTY;
allIssues = new HashSet<String>();
}
public Project(String name, String versionForOkBuild, Build okBuild) {
this.name = name;
this.versionForOkBuild = versionForOkBuild;
this.okBuild = okBuild;
allIssues = new HashSet<String>();
loadAllIssues();
}
public String getName() {
return name;
}
public String getVersionForOkBuild() {
return versionForOkBuild;
}
public Build getOkBuild() {
return okBuild;
}
public void addFailedBuild(Build build) {
failedBuilds.add(build);
addToAllIssuesFrom(build);
}
public Set<Build> getFailedBuilds() {
return Collections.unmodifiableSet(failedBuilds);
}
public Set<String> getAllIssues() {
return allIssues;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Project project = (Project) o;
return name.equals(project.name) &&
versionForOkBuild.equals(project.versionForOkBuild) &&
okBuild.equals(project.okBuild) &&
failedBuilds.equals(project.failedBuilds);
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + versionForOkBuild.hashCode();
result = 31 * result + okBuild.hashCode();
result = 31 * result + failedBuilds.hashCode();
return result;
}
private void loadAllIssues() {
Preconditions.checkNotNull(allIssues);
addToAllIssuesFrom(okBuild);
for (Build build : failedBuilds) {
addToAllIssuesFrom(build);
}
}
private void addToAllIssuesFrom(Build build) {
allIssues.addAll(build.getIssues());
}
/**
* Called after unmarshalling is done so the list of all issues can be initialized.
*/
public void afterUnmarshal(Unmarshaller u, Object parent) {
loadAllIssues();
}
}