@Override protected void setEntityLoadingConfig() { super.setEntityLoadingConfig(); Preconditions.checkNotNull(getSourceSensors(), "sourceSensors must be set"); }
@Override protected void onProducerRemoved(Entity producer) { synchronized (values) { for (Sensor<?> sensor: getSourceSensors()) { Map<Entity,Object> vs = values.get(sensor.getName()); if (vs!=null) vs.remove(producer); } } onUpdated(); }
@Override protected void addProducerHardcoded(Entity producer) { for (Sensor<?> sourceSensor: getSourceSensors()) { subscriptions().subscribe(producer, sourceSensor, this); } onProducerAdded(producer); }
@Override protected void onProducerAdded(Entity producer) { BrooklynLogging.log(LOG, BrooklynLogging.levelDebugOrTraceIfReadOnly(producer), "{} listening to {}", this, producer); synchronized (values) { for (Sensor<?> sensor: getSourceSensors()) { Map<Entity,Object> vs = values.get(sensor.getName()); if (vs==null) { vs = new LinkedHashMap<Entity,Object>(); values.put(sensor.getName(), vs); } Object vo = vs.get(producer); if (vo==null) { Object initialVal; if (sensor instanceof AttributeSensor) { initialVal = producer.getAttribute((AttributeSensor<?>)sensor); } else { initialVal = null; } vs.put(producer, initialVal != null ? initialVal : defaultMemberValue); // NB: see notes on possible race, in Aggregator#onProducerAdded } } } }
@Override protected void setEntityBeforeSubscribingProducerChildrenEvents() { BrooklynLogging.log(LOG, BrooklynLogging.levelDebugOrTraceIfReadOnly(producer), "{} subscribing to children of {}", this, producer); for (Sensor<?> sourceSensor: getSourceSensors()) { subscriptions().subscribeToChildren(producer, sourceSensor, this); } }