@Override public void setMembers(Collection<Entity> mm, Predicate<Entity> filter) { synchronized (members) { log.debug("Group {} members set explicitly to {} (of which some possibly filtered)", this, members); List<Entity> mmo = new ArrayList<Entity>(getMembers()); for (Entity m: mmo) { if (!(mm.contains(m) && (filter==null || filter.apply(m)))) // remove, unless already present, being set, and not filtered out removeMember(m); } for (Entity m: mm) { if ((!mmo.contains(m)) && (filter==null || filter.apply(m))) { // add if not alrady contained, and not filtered out addMember(m); } } getManagementSupport().getEntityChangeListener().onMembersChanged(); } }
/** * Returns {@code true} if the group was changed as a result of the call. */ @Override public boolean removeMember(Entity member) { synchronized (members) { boolean changed = (member != null && members.remove(member)); if (changed) { log.debug("Group {} lost member {}", this, member); emit(MEMBER_REMOVED, member); setAttribute(Changeable.GROUP_SIZE, getCurrentSize()); getManagementSupport().getEntityChangeListener().onMembersChanged(); } return changed; } }
/** * Adds the given entity as a member of this group <em>and</em> this group as one of the groups of the child */ @Override public boolean addMember(Entity member) { synchronized (members) { member.addGroup(this); boolean changed = members.add(member); if (changed) { log.debug("Group {} got new member {}", this, member); emit(MEMBER_ADDED, member); setAttribute(Changeable.GROUP_SIZE, getCurrentSize()); getManagementSupport().getEntityChangeListener().onMembersChanged(); } return changed; } }