/** * Copyright (C) Intersect 2012. * * This module contains Proprietary Information of Intersect, * and should be treated as Confidential. */ package au.org.intersect.exsite9.domain; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import org.apache.commons.lang3.builder.ToStringBuilder; import com.google.common.base.Objects; /** * Represents a Group. */ @Entity @Table(name="RESEARCH_GROUP") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) public class Group implements Serializable, IMetadataAssignable { private static final long serialVersionUID = 1700329934000740424L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @Column(length = 255) private String name; @OneToMany private final List<Group> groups = new ArrayList<Group>(); @ManyToOne private Group parentGroup; @OneToMany private final List<ResearchFile> researchFiles = new ArrayList<ResearchFile>(); @OneToMany private final List<MetadataAssociation> metadataAssociations = new ArrayList<MetadataAssociation>(); @ManyToOne private Project project; /** * The field to sort child research files on. */ private ResearchFileSortField researchFileSortField; /** * The direction to sort child research files on. */ private SortFieldDirection researchFileSortDirection; public Group() { name = ""; researchFileSortField = ResearchFileSortField.NAME; researchFileSortDirection = SortFieldDirection.ASC; } public Group(final String name) { this.name = name; researchFileSortField = ResearchFileSortField.NAME; researchFileSortDirection = SortFieldDirection.ASC; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Group> getGroups() { return groups; } public List<ResearchFile> getResearchFiles() { return researchFiles; } public List<MetadataAssociation> getMetadataAssociations() { return this.metadataAssociations; } public Group getParentGroup() { return this.parentGroup; } public void setParentGroup(final Group parentGroup) { this.parentGroup = parentGroup; } public ResearchFileSortField getResearchFileSortField() { return this.researchFileSortField; } public void setResearchFileSortField(final ResearchFileSortField sortField) { this.researchFileSortField = sortField; } public SortFieldDirection getResearchFileSortDirection() { return this.researchFileSortDirection; } public void setResearchFileSortDirection(final SortFieldDirection sortDirection) { this.researchFileSortDirection = sortDirection; } public Project getProject() { return project; } public void setProject(final Project project) { this.project = project; } /** * {@inheritDoc} */ @Override public boolean equals(final Object obj) { if (obj == this) { return true; } if (!(obj instanceof Group)) { return false; } final Group other = (Group) obj; return Objects.equal(this.id, other.id); } /** * {@inheritDoc} */ @Override public int hashCode() { return Objects.hashCode(this.id); } /** * {@inheritDoc} */ @Override public String toString() { final ToStringBuilder tsb = new ToStringBuilder(this); tsb.append("id", this.id); tsb.append("name", this.name); return tsb.toString(); } /** * Returns true if this group is an ancestor of the specified group * @param group The specified group * @return true if this group is an ancestor of the specified group, false otherwise */ public boolean isAnAncestorOf(Group group) { if (groups.contains(group)) { return true; } for(Group childGroup : this.groups) { if(childGroup.isAnAncestorOf(group)) { return true; } } return false; } }