You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by ha...@apache.org on 2015/10/17 18:17:35 UTC
[2/5] incubator-brooklyn git commit: Enrichers: support producer as
Task for deferred supplier
Enrichers: support producer as Task for deferred supplier
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/9402f850
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/9402f850
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/9402f850
Branch: refs/heads/master
Commit: 9402f8508c67fa520be4c1d67f9e0d18f82b589b
Parents: f380b58
Author: Aled Sage <al...@gmail.com>
Authored: Thu Oct 15 16:34:57 2015 +0200
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Oct 15 21:19:34 2015 +0100
----------------------------------------------------------------------
.../brooklyn/enricher/stock/Enrichers.java | 13 +-
.../stock/EnricherWithDeferredSupplierTest.java | 132 +++++++++++++++++++
2 files changed, 144 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9402f850/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java
index 64da60b..2ce2b21 100644
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java
+++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java
@@ -27,6 +27,7 @@ import java.util.Map;
import java.util.Set;
import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.mgmt.Task;
import org.apache.brooklyn.api.sensor.AttributeSensor;
import org.apache.brooklyn.api.sensor.Enricher;
import org.apache.brooklyn.api.sensor.EnricherSpec;
@@ -493,6 +494,7 @@ public class Enrichers {
protected final Boolean propagatingAll;
protected final Iterable<? extends Sensor<?>> propagatingAllBut;
protected Entity fromEntity;
+ protected Task<? extends Entity> fromEntitySupplier;
public AbstractPropagatorBuilder(Map<? extends Sensor<?>, ? extends Sensor<?>> vals) {
super(Propagator.class);
@@ -520,6 +522,10 @@ public class Enrichers {
this.fromEntity = checkNotNull(val);
return self();
}
+ public B from(Task<? extends Entity> val) {
+ this.fromEntitySupplier = checkNotNull(val);
+ return self();
+ }
@Override
protected String getDefaultUniqueTag() {
List<String> summary = MutableList.of();
@@ -539,11 +545,15 @@ public class Enrichers {
summary.add("ALL_BUT:"+com.google.common.base.Joiner.on(",").join(allBut));
}
- return "propagating["+fromEntity.getId()+":"+com.google.common.base.Joiner.on(",").join(summary)+"]";
+ // TODO What to use as the entity id if using fromEntitySupplier?
+ String fromId = (fromEntity != null) ? fromEntity.getId() : fromEntitySupplier.getId();
+
+ return "propagating["+fromId+":"+com.google.common.base.Joiner.on(",").join(summary)+"]";
}
public EnricherSpec<? extends Enricher> build() {
return super.build().configure(MutableMap.builder()
.putIfNotNull(Propagator.PRODUCER, fromEntity)
+ .putIfNotNull(Propagator.PRODUCER, fromEntitySupplier)
.putIfNotNull(Propagator.SENSOR_MAPPING, propagating)
.putIfNotNull(Propagator.PROPAGATING_ALL, propagatingAll)
.putIfNotNull(Propagator.PROPAGATING_ALL_BUT, propagatingAllBut)
@@ -555,6 +565,7 @@ public class Enrichers {
return Objects.toStringHelper(this)
.omitNullValues()
.add("fromEntity", fromEntity)
+ .add("fromEntitySupplier", fromEntitySupplier)
.add("propagating", propagating)
.add("propagatingAll", propagatingAll)
.add("propagatingAllBut", propagatingAllBut)
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9402f850/core/src/test/java/org/apache/brooklyn/enricher/stock/EnricherWithDeferredSupplierTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/enricher/stock/EnricherWithDeferredSupplierTest.java b/core/src/test/java/org/apache/brooklyn/enricher/stock/EnricherWithDeferredSupplierTest.java
new file mode 100644
index 0000000..9727403
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/enricher/stock/EnricherWithDeferredSupplierTest.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.enricher.stock;
+
+import java.util.Collection;
+import java.util.NoSuchElementException;
+import java.util.concurrent.Callable;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.api.mgmt.TaskFactory;
+import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.effector.EffectorTasks;
+import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.entity.EntityInternal;
+import org.apache.brooklyn.core.entity.EntityPredicates;
+import org.apache.brooklyn.core.location.SimulatedLocation;
+import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
+import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
+import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.test.EntityTestUtils;
+import org.apache.brooklyn.util.core.task.DeferredSupplier;
+import org.apache.brooklyn.util.core.task.TaskBuilder;
+import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+
+public class EnricherWithDeferredSupplierTest extends BrooklynAppUnitTestSupport {
+
+ public static final Logger log = LoggerFactory.getLogger(EnricherWithDeferredSupplierTest.class);
+
+ protected static final ConfigKey<String> TAG = ConfigKeys.newStringConfigKey("mytag");
+
+ TestEntity producer;
+ TestEntity target;
+ AttributeSensor<Integer> sensor;
+
+ @Test
+ public void testProducerUsingDeferredSupplier() throws Exception {
+ producer = app.createAndManageChild(EntitySpec.create(TestEntity.class)
+ .configure(TAG, "myproducer"));
+ target = app.createAndManageChild(EntitySpec.create(TestEntity.class));
+ sensor = new BasicAttributeSensor<Integer>(Integer.class, "int.sensor.a");
+
+ app.start(ImmutableList.of(new SimulatedLocation()));
+
+ producer.sensors().set(sensor, 3);
+
+ target.enrichers().add(Enrichers.builder()
+ .propagating(sensor)
+ .from(new EntityDeferredSupplier("myproducer").newTask())
+ .build());
+
+ EntityTestUtils.assertAttributeEqualsEventually(target, sensor, 3);
+ }
+
+ // TODO This is a cut-down version of DslComponent, from the camp project
+ public static class EntityDeferredSupplier implements DeferredSupplier<Entity>, TaskFactory<Task<Entity>> {
+
+ private static final Logger log = LoggerFactory.getLogger(EntityDeferredSupplier.class);
+
+ private final String tag;
+
+ EntityDeferredSupplier(String tag) {
+ this.tag = tag;
+ }
+
+ protected final static EntityInternal entity() {
+ // rely on implicit ThreadLocal for now
+ return (EntityInternal) EffectorTasks.findEntity();
+ }
+
+ @Override
+ public final synchronized Entity get() {
+ try {
+ if (log.isDebugEnabled())
+ log.debug("Queuing task to resolve child "+tag);
+ Entity result = Entities.submit(entity(), newTask()).get();
+ if (log.isDebugEnabled())
+ log.debug("Resolved "+result+" from child "+tag);
+ return result;
+ } catch (Exception e) {
+ throw Exceptions.propagate(e);
+ }
+ }
+
+ @Override
+ public Task<Entity> newTask() {
+ return TaskBuilder.<Entity>builder()
+ .displayName(toString())
+ .tag(BrooklynTaskTags.TRANSIENT_TASK_TAG)
+ .body(new Callable<Entity>() {
+ public Entity call() {
+ EntityInternal entity = entity();
+ Collection<Entity> entitiesToSearch = entity.getManagementContext().getEntityManager().getEntities();
+ Optional<Entity> result = Iterables.tryFind(entitiesToSearch, EntityPredicates.configEqualTo(TAG, tag));
+
+ if (result.isPresent()) {
+ return result.get();
+ } else {
+ throw new NoSuchElementException("No entity matching id " + tag+" in "+entitiesToSearch);
+ }
+ }})
+ .build();
+ }
+ }
+}