package hu.sch.domain; import hu.sch.domain.enums.GroupStatus; import hu.sch.domain.user.User; import hu.sch.domain.logging.Log; import hu.sch.domain.util.MembershipSorter; import hu.sch.util.HungarianStringComparator; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; /** * * @author hege */ @Entity @Table(name = "groups") @NamedQueries({ @NamedQuery(name = Group.findAll, query = "SELECT g FROM Group g " + "WHERE g.status='akt' ORDER BY g.name"), @NamedQuery(name = Group.groupHierarchy, query = "SELECT g FROM Group g LEFT JOIN FETCH g.parent " + "WHERE g.status='akt' ORDER BY g.name"), @NamedQuery(name = Group.findByName, query = "SELECT g FROM Group g WHERE g.name = :name"), @NamedQuery(name = Group.findByNameFragment, query = "SELECT g FROM Group g WHERE UPPER(g.name) LIKE UPPER(:groupName) ORDER BY g.name"), @NamedQuery(name = Group.countByNameFragment, query = "SELECT COUNT(g) FROM Group g WHERE UPPER(g.name) LIKE UPPER(:groupName)"), @NamedQuery(name = Group.findMembersByGroupAndPost, query = "SELECT u FROM User u " + "LEFT JOIN u.memberships ms " + "LEFT JOIN ms.posts p " + "LEFT JOIN p.postType pt " + "WHERE ms.groupId = :groupId AND pt.postName = :post") }) @SequenceGenerator(name = "groups_seq", sequenceName = "groups_grp_id_seq", allocationSize = 1) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Group implements Serializable, Comparable<Group> { public static final long SVIE = 369L; public static final long VALASZTMANY = 370L; public static final long SCH_QPA = 27L; /** * Jutalmazást Elbíráló Testület */ public static final long JET = 156L; public static final long KIRDEV = 106L; private static final long serialVersionUID = 1L; public static final String findAll = "findAllGroup"; public static final String groupHierarchy = "groupHierarchy"; public static final String findByName = "findByName"; public static final String findMembersByGroupAndPost = "findMembersByGroupAndPost"; public static final String findByNameFragment = "Group.findByNameFragment"; public static final String countByNameFragment = "Group.countByNameFragment"; //---------------------------------------------------- @Id @GeneratedValue(generator = "groups_seq") @Column(name = "grp_id") private Long id; //---------------------------------------------------- @Column(name = "grp_name", length = 255, columnDefinition = "text") private String name; //---------------------------------------------------- @Column(name = "grp_type") private String type; //---------------------------------------------------- @ManyToOne(optional = true, fetch = FetchType.LAZY) @JoinColumn(name = "grp_parent") private Group parent; //---------------------------------------------------- @Enumerated(EnumType.STRING) @Column(name = "grp_state") private GroupStatus status = GroupStatus.akt; //---------------------------------------------------- @Column(name = "grp_description", columnDefinition = "text") private String introduction; //---------------------------------------------------- @Column(name = "grp_webpage", length = 64) private String webPage; //---------------------------------------------------- @Column(name = "grp_maillist", length = 64) private String mailingList; //---------------------------------------------------- @Column(name = "grp_users_can_apply") private boolean usersCanApply; //---------------------------------------------------- @XmlTransient @Column(name = "grp_head", length = 48) private String head; //---------------------------------------------------- @XmlTransient @Column(name = "grp_founded") private Integer founded; //---------------------------------------------------- @Column(name = "grp_issvie") private Boolean isSvie = Boolean.FALSE; //---------------------------------------------------- @XmlTransient @Column(name = "grp_svie_delegate_nr") private Integer delegateNumber; //---------------------------------------------------- @XmlTransient @Transient private List<Group> subGroups; //---------------------------------------------------- @XmlTransient @Transient private Long numberOfPrimaryMembers; //---------------------------------------------------- @XmlTransient @OneToMany(mappedBy = "group", fetch = FetchType.LAZY) private List<Membership> memberships; //---------------------------------------------------- @XmlTransient @Transient private List<User> members; //---------------------------------------------------- @XmlTransient @Transient private List<Membership> activeMemberships; //---------------------------------------------------- @XmlTransient @Transient private List<Membership> inactiveMemberships; //---------------------------------------------------- @XmlTransient @OneToMany(mappedBy = "group", fetch = FetchType.LAZY) private List<Log> logs; //---------------------------------------------------- @XmlTransient @Transient private List<User> activeUsers; public Group() { } 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 String getType() { return type; } public void setType(String type) { this.type = type; } public Group getParent() { return parent; } public void setParent(Group parent) { this.parent = parent; } /** * Státusz (aktiv / öreg) */ public GroupStatus getStatus() { return status; } public void setStatus(GroupStatus status) { this.status = status; } /** * Kör bemutatkozása */ public String getIntroduction() { return introduction; } public void setIntroduction(String introduction) { this.introduction = introduction; } public String getWebPage() { return webPage; } public void setWebPage(String webPage) { this.webPage = webPage; } public String getMailingList() { return mailingList; } public void setMailingList(String mailingList) { this.mailingList = mailingList; } /** * A kör vezetőjének egyéni titulusa */ public String getHead() { return head; } public void setHead(String head) { this.head = head; } public Integer getFounded() { return founded; } public void setFounded(Integer founded) { this.founded = founded; } /** * Az adott kör tagja-e a SVIE-nek */ public Boolean getIsSvie() { return isSvie; } public void setIsSvie(Boolean isSvie) { this.isSvie = isSvie; } /** * Az adott kör hány tagot küldhet küldött gyülésre */ public Integer getDelegateNumber() { return delegateNumber; } public void setDelegateNumber(Integer delegateNumber) { this.delegateNumber = delegateNumber; } /** * Az elsődleges körtagok száma */ public Long getNumberOfPrimaryMembers() { return numberOfPrimaryMembers; } public void setNumberOfPrimaryMembers(Long numberOfPrimaryMembers) { this.numberOfPrimaryMembers = numberOfPrimaryMembers; } /** * Csoporttagságok */ public List<Membership> getMemberships() { return memberships; } public void setMemberships(List<Membership> memberships) { this.memberships = memberships; } /** * Alcsoportok */ public List<Group> getSubGroups() { return subGroups; } public void setSubGroups(List<Group> subGroups) { this.subGroups = subGroups; } /** * Cache-elt mező */ public List<User> getMembers() { if (members == null) { loadMembers(); } return members; } public List<User> getActiveMembers() { if (members == null) { loadMembers(); } return activeUsers; } private void loadMembers() { List<Membership> list = new MembershipSorter(getMemberships()).sort(); members = new ArrayList<>(list.size()); activeMemberships = new ArrayList<>(); inactiveMemberships = new ArrayList<>(); activeUsers = new ArrayList<>(list.size()); for (Membership cst : list) { members.add(cst.getUser()); if (cst.getEnd() == null) { activeUsers.add(cst.getUser()); activeMemberships.add(cst); } else { inactiveMemberships.add(cst); } } } /** * Aktív tagságok */ public List<Membership> getActiveMemberships() { if (members == null) { loadMembers(); } return activeMemberships; } /** * Öregtagok */ public List<Membership> getInactiveMemberships() { if (members == null) { loadMembers(); } return inactiveMemberships; } public List<Log> getLogs() { return logs; } public void setLogs(List<Log> logs) { this.logs = logs; } /** * Jelentkezhetnek-e új tagok a körbe */ public boolean getUsersCanApply() { return usersCanApply; } public void setUsersCanApply(boolean canApply) { usersCanApply = canApply; } @Override public String toString() { return getName(); } @Override public int compareTo(Group o) { return HungarianStringComparator.scompare(getName(), o.getName()); } @Override public boolean equals(Object obj) { //Részletekért lásd: http://brandon.fuller.name/archives/2009/03/17/16.37.41/ if (obj == null) { return false; } if (!getClass().isAssignableFrom(obj.getClass())) { return false; } final Group other = (Group) obj; if (this.id != other.id && (this.id == null || !this.id.equals(other.getId()))) { return false; } return true; } @Override public int hashCode() { int hash = 7; hash = 31 * hash + (this.id != null ? this.id.hashCode() : 0); hash = 31 * hash + (this.name != null ? this.name.hashCode() : 0); hash = 31 * hash + (this.type != null ? this.type.hashCode() : 0); hash = 31 * hash + (this.webPage != null ? this.webPage.hashCode() : 0); hash = 31 * hash + (this.introduction != null ? this.introduction.hashCode() : 0); hash = 31 * hash + (this.mailingList != null ? this.mailingList.hashCode() : 0); hash = 31 * hash + (this.founded != null ? this.founded.hashCode() : 0); hash = 31 * hash + (this.status != null ? this.status.hashCode() : 0); return hash; } }