package org.dayatang.security.domain;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import javax.persistence.*;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
/**
* 用户组。用户组可以包含用户和其他用户组
* Created by yyang on 15/1/24.
*/
@Entity
@DiscriminatorValue("GROUP")
public class UserGroup extends Actor {
@ManyToMany
@JoinTable(name = "security_group_member_relationship",
joinColumns = @JoinColumn(name = "group_id"),
inverseJoinColumns = @JoinColumn(name = "member_id"))
private Set<Actor> members = new HashSet<Actor>();
protected UserGroup() {
super();
}
public UserGroup(String name) {
super(name);
}
public Set<Actor> getMembers() {
return members;
}
public void addMember(Actor actor) {
members.add(actor);
actor.addParentGroup(this);
save();
}
public void removeMember(Actor actor) {
members.remove(actor);
actor.removeParentGroup(this);
save();
}
public Set<User> getUsers() {
Set<User> results = new HashSet<User>();
for (Actor actor : getMembers()) {
if (actor instanceof User) {
results.add((User) actor);
}
}
return results;
}
public Set<UserGroup> getChildGroups() {
Set<UserGroup> results = new HashSet<UserGroup>();
for (Actor actor : getMembers()) {
if (actor instanceof UserGroup) {
results.add((UserGroup) actor);
}
}
return results;
}
private boolean hasMember(Actor actor) {
return getMembers().contains(actor);
}
@Override
public void remove() {
for (UserGroup each : getChildGroups()) {
each.remove();
}
super.remove();
}
@Override
public void disable(Date date) {
for (UserGroup each : getChildGroups()) {
each.disable(date);
}
super.disable(date);
}
public UserGroup createChild(String childGroupName) {
UserGroup child = create(childGroupName);
this.addMember(child);
return child;
}
public static UserGroup create(String name) {
UserGroup group = new UserGroup(name);
group.save();
return group;
}
/**
* 根据ID获取用户组。
* @param id 用户组ID
* @return 如果找到指定组ID的用户则返回该用户组,否则返回null
*/
public static UserGroup get(String id) {
return get(UserGroup.class, id);
}
/**
* 根据名称获取用户组。
* @param name 名称
* @return 如果找到指定名字的用户组则返回该用户组,否则返回null
*/
public static UserGroup getByName(String name) {
return getByName(UserGroup.class, name);
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 23).append(getName()).toHashCode();
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof UserGroup)) {
return false;
}
UserGroup that = (UserGroup) other;
return new EqualsBuilder().append(this.getName(), that.getName()).isEquals();
}
@Override
public String toString() {
return getName();
}
}