misc better api usability, javadoc, and debugging, esp around feeds sensors have a default persistence mode, `Entities.dumpInfo` will list feeds (which aren't persisted), `EntityInitializer` explains its lifecycle better, and CAMP gives a slightly more useful error
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/c217303e Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/c217303e Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/c217303e Branch: refs/heads/master Commit: c217303e526ccc166b7dcfc4b970cb6dbfb547f3 Parents: a57dbe4 Author: Alex Heneveld <[email protected]> Authored: Tue Sep 8 13:31:56 2015 +0100 Committer: Alex Heneveld <[email protected]> Committed: Tue Sep 8 13:31:56 2015 +0100 ---------------------------------------------------------------------- .../brooklyn/api/entity/EntityInitializer.java | 9 +++++ .../BasicAssemblyTemplateInstantiator.java | 2 +- .../apache/brooklyn/core/entity/Entities.java | 37 ++++++++++++++++++-- .../apache/brooklyn/core/sensor/Sensors.java | 2 +- 4 files changed, 45 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c217303e/api/src/main/java/org/apache/brooklyn/api/entity/EntityInitializer.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/org/apache/brooklyn/api/entity/EntityInitializer.java b/api/src/main/java/org/apache/brooklyn/api/entity/EntityInitializer.java index 24ae8d3..a9f407a 100644 --- a/api/src/main/java/org/apache/brooklyn/api/entity/EntityInitializer.java +++ b/api/src/main/java/org/apache/brooklyn/api/entity/EntityInitializer.java @@ -20,12 +20,21 @@ package org.apache.brooklyn.api.entity; import java.util.Map; +import org.apache.brooklyn.api.objs.EntityAdjunct; +import org.apache.brooklyn.api.policy.Policy; +import org.apache.brooklyn.api.sensor.Feed; + /** * Instances of this class supply logic which can be used to initialize entities. * These can be added to an {@link EntitySpec} programmatically, or declared as part * of YAML recipes in a <code>brooklyn.initializers</code> section. * In the case of the latter, implementing classes should define a no-arg constructor * or a {@link Map} constructor so that YAML parameters can be supplied. + * <p> + * Note that initializers are only invoked on first creation; they are not called + * during a rebind. Instead, the typical pattern is that initializers will create + * {@link EntityAdjunct} instances such as {@link Policy} and {@link Feed} + * which will be attached during rebind. **/ public interface EntityInitializer { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c217303e/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/instantiate/BasicAssemblyTemplateInstantiator.java ---------------------------------------------------------------------- diff --git a/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/instantiate/BasicAssemblyTemplateInstantiator.java b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/instantiate/BasicAssemblyTemplateInstantiator.java index 28eac3a..82751c3 100644 --- a/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/instantiate/BasicAssemblyTemplateInstantiator.java +++ b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/instantiate/BasicAssemblyTemplateInstantiator.java @@ -30,7 +30,7 @@ public class BasicAssemblyTemplateInstantiator implements AssemblyTemplateInstan // template.getPlatformComponentTemplates().links().iterator().next().resolve(); // platforms should set a bunch of instantiators, or else let the ComponentTemplates do this! - throw new UnsupportedOperationException("Basic instantiator not yet supported"); + throw new UnsupportedOperationException("No instantiator could be found which understands the submitted plan. Basic instantiator not yet supported."); } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c217303e/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java index c1a77ad..c2c2195 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java @@ -58,6 +58,7 @@ import org.apache.brooklyn.api.mgmt.TaskFactory; import org.apache.brooklyn.api.policy.Policy; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.api.sensor.Enricher; +import org.apache.brooklyn.api.sensor.Feed; import org.apache.brooklyn.api.sensor.Sensor; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.config.ConfigKey.HasConfigKey; @@ -318,7 +319,10 @@ public class Entities { out.append(currentIndentation+tab+tab+"locations = "+e.getLocations()+"\n"); - Set<ConfigKey<?>> keys = Sets.newLinkedHashSet( ((EntityInternal)e).getConfigMap().getLocalConfig().keySet() ); + Set<ConfigKey<?>> keys = Sets.newLinkedHashSet( + ((EntityInternal)e).config().getLocalBag().getAllConfigAsConfigKeyMap().keySet() + //((EntityInternal)e).getConfigMap().getLocalConfig().keySet() + ); for (ConfigKey<?> it : sortConfigKeys(keys)) { // use the official config key declared on the type if available // (since the map sometimes contains <object> keys @@ -385,6 +389,13 @@ public class Entities { } } + if (!((EntityInternal)e).feeds().getFeeds().isEmpty()) { + out.append(currentIndentation+tab+tab+"Feeds:\n"); + for (Feed feed : ((EntityInternal)e).feeds().getFeeds()) { + dumpInfo(feed, out, currentIndentation+tab+tab+tab, tab); + } + } + for (Entity it : e.getChildren()) { dumpInfo(it, out, currentIndentation+tab, tab); } @@ -477,6 +488,26 @@ public class Entities { out.flush(); } + public static void dumpInfo(Feed feed, String currentIndentation, String tab) throws IOException { + dumpInfo(feed, new PrintWriter(System.out), currentIndentation, tab); + } + public static void dumpInfo(Feed feed, Writer out, String currentIndentation, String tab) throws IOException { + out.append(currentIndentation+feed.toString()+"\n"); + + // TODO create a FeedType cf EnricherType ? + for (ConfigKey<?> key : sortConfigKeys(((BrooklynObjectInternal)feed).config().getBag().getAllConfigAsConfigKeyMap().keySet())) { + Maybe<Object> val = ((BrooklynObjectInternal)feed).config().getRaw(key); + if (!isTrivial(val)) { + out.append(currentIndentation+tab+tab+key); + out.append(" = "); + if (isSecret(key.getName())) out.append("xxxxxxxx"); + else out.append(""+val.get()); + out.append("\n"); + } + } + + out.flush(); + } public static void dumpInfo(Policy pol) { try { @@ -963,7 +994,7 @@ public class Entities { } public static <T> Supplier<T> attributeSupplier(Entity entity, AttributeSensor<T> sensor) { - return EntityAndAttribute.supplier(entity, sensor); + return EntityAndAttribute.create(entity, sensor); } public static <T> Supplier<T> attributeSupplier(EntityAndAttribute<T> tuple) { return tuple; } @@ -1061,7 +1092,7 @@ public class Entities { /** Logs a warning if an entity has a value for a config key. */ public static void warnOnIgnoringConfig(Entity entity, ConfigKey<?> key) { - if (entity.getConfigRaw(key, true).isPresentAndNonNull()) + if (((EntityInternal)entity).config().getRaw(key).isPresentAndNonNull()) log.warn("Ignoring "+key+" set on "+entity+" ("+entity.getConfig(key)+")"); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c217303e/core/src/main/java/org/apache/brooklyn/core/sensor/Sensors.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/sensor/Sensors.java b/core/src/main/java/org/apache/brooklyn/core/sensor/Sensors.java index 05227d0..823689d 100644 --- a/core/src/main/java/org/apache/brooklyn/core/sensor/Sensors.java +++ b/core/src/main/java/org/apache/brooklyn/core/sensor/Sensors.java @@ -56,7 +56,7 @@ public class Sensors { private String name; private TypeToken<T> type; private String description; - private SensorPersistenceMode persistence; + private SensorPersistenceMode persistence = SensorPersistenceMode.REQUIRED; protected Builder() { // use builder(type, name) instead }
