package org.dddlib.organisation.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import javax.persistence.Entity; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; @Entity public abstract class Organization extends Party { private static final long serialVersionUID = -8953682430610195006L; public Organization() { } public Organization(String name) { super(name); } public Organization getParent(Date date) { return OrgLineMgmt.getParentOfOrganization(this, date); } public List<Organization> getChildren(Date date) { return OrgLineMgmt.findChildrenOfOrganization(this, date); } public Set<Post> getPosts(Date date) { return new HashSet<Post>(Post.findByOrganization(this, date)); } @Override public void terminate(Date date) { if (hasEmployees(date)) { throw new TerminateNotEmptyOrganizationException(); } for (Post post : getPosts(date)) { post.terminate(date); } for (Organization child : getChildren(date)) { child.terminate(date); } super.terminate(date); } private boolean hasEmployees(Date date) { for (Post post : getPosts(date)) { if (!(post.getEmployees(date).isEmpty())) { return true; } } for (Organization child : getChildren(date)) { if (child.hasEmployees(date)) { return true; } } return false; } @Override public String toString() { return new ToStringBuilder(this).append(getName()).build(); } }