@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; } }
@Override public void init() { super.init(); setAttribute(SERVICE_UP, false); }
@Override public boolean removeChild(Entity child) { boolean changed = super.removeChild(child); if (changed) { removeMember(child); } return changed; }
@Override public void setManagementContext(ManagementContextInternal managementContext) { super.setManagementContext(managementContext); Set<Entity> oldMembers = members; members = Collections.newSetFromMap(managementContext.getStorage().<Entity,Boolean>getMap(getId()+"-members")); // Only override stored defaults if we have actual values. We might be in setManagementContext // because we are reconstituting an existing entity in a new brooklyn management-node (in which // case believe what is already in the storage), or we might be in the middle of creating a new // entity. Normally for a new entity (using EntitySpec creation approach), this will get called // before setting the parent etc. However, for backwards compatibility we still support some // things calling the entity's constructor directly. if (oldMembers.size() > 0) members.addAll(oldMembers); }
@Override public Entity addChild(Entity child) { Entity result = super.addChild(child); if (getConfig(CHILDREN_AS_MEMBERS)) { addMember(child); } return result; }
@Override public void onManagementStarting() { super.onManagementStarting(); if (getConfig(TARGET_PARENT) != null) { recompute(); // following line could be more efficient (just modify the addresses set, not clearing it each time; // but since addresses is lazy loaded not that big a deal) // subscribe(this, Changeable.GROUP_SIZE, { resetAddresses(true) } as SensorEventListener); // above not needed since our target tracking figures this out } }
Collection<Entity> currentMembers = super.getMembers(); Collection<Entity> toRemove = new LinkedHashSet<Entity>(currentMembers);
@Override public boolean removeChild(Entity child) { boolean changed = super.removeChild(child); if (changed) { removeMember(child); } 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; } }
@Override public void init() { super.init(); setAttribute(RUNNING, true); }
@Override public boolean removeChild(Entity child) { boolean result = super.removeChild(child); if (getConfig(CHILDREN_AS_MEMBERS)) { removeMember(child); } return result; } }
@Override public void init() { super.init(); fabricSizeEnricher = CustomAggregatingEnricher.newSummingEnricher(MutableMap.of("allMembers", true), Changeable.GROUP_SIZE, FABRIC_SIZE); addEnricher(fabricSizeEnricher); setAttribute(SERVICE_UP, false); }