package edu.ualberta.med.biobank.model; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.persistence.Transient; @Entity @Table(name = "DOMAIN") public class Domain extends AbstractBiobankModel { private static final long serialVersionUID = 1L; private Set<Center> centers = new HashSet<Center>(0); private Set<Study> studies = new HashSet<Study>(0); private boolean allCenters = false; private boolean allStudies = false; public Domain() { } public Domain(Domain domain) { getCenters().addAll(domain.getCenters()); getStudies().addAll(domain.getStudies()); setAllCenters(domain.isAllCenters()); setAllStudies(domain.isAllStudies()); } @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "DOMAIN_CENTER", joinColumns = { @JoinColumn(name = "DOMAIN_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "CENTER_ID", nullable = false, updatable = false) }) public Set<Center> getCenters() { return centers; } public void setCenters(Set<Center> centers) { this.centers = centers; } @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "DOMAIN_STUDY", joinColumns = { @JoinColumn(name = "DOMAIN_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "CENTER_ID", nullable = false, updatable = false) }) public Set<Study> getStudies() { return studies; } public void setStudies(Set<Study> studies) { this.studies = studies; } @Column(name = "ALL_CENTERS") public boolean isAllCenters() { return allCenters; } public void setAllCenters(boolean allCenters) { this.allCenters = allCenters; if (allCenters) getCenters().clear(); } @Column(name = "ALL_STUDIES") public boolean isAllStudies() { return allStudies; } public void setAllStudies(boolean allStudies) { this.allStudies = allStudies; if (allStudies) getStudies().clear(); } @Transient public boolean isGlobal() { return isAllCenters() && isAllStudies(); } @Transient public boolean isSuperset(Domain that) { boolean allCenters = containsAllCenters(that); boolean allStudies = containsAllStudies(that); return allCenters && allStudies; } @Transient public boolean contains(Center center) { return isAllCenters() || getCenters().contains(center); } /** * Done on a {@link Domain} instead of a set of {@link Center}-s because if * the given {@link Domain} returns true for {@link #isAllCenters()} but has * an empty set from {@link #getCenters()}, then that is very misleading. * * @param domain * @return */ @Transient public boolean containsAllCenters(Domain that) { return isAllCenters() || (!that.isAllCenters() && getCenters() .containsAll(that.getCenters())); } @Transient public boolean contains(Study study) { return isAllStudies() || getStudies().contains(study); } @Transient public boolean containsAllStudies(Domain that) { return isAllStudies() || (!that.isAllStudies() && getStudies() .containsAll(that.getStudies())); } @Transient public boolean isEquivalent(Domain that) { boolean equivalent = true; equivalent &= isAllCenters() == that.isAllCenters(); equivalent &= isAllStudies() == that.isAllStudies(); equivalent &= getCenters().equals(that.getCenters()); equivalent &= getStudies().equals(that.getStudies()); return equivalent; } }