You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2014/12/16 00:58:17 UTC
[2/3] incubator-brooklyn git commit: Adds
AttributeSensor.persistenceMode
Adds AttributeSensor.persistenceMode
- If set to NONE then that attribute’s value will not be persisted, so will
not be available on rebind.
- Adds Sensors.builder() to avoid too much overloading.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/327c227d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/327c227d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/327c227d
Branch: refs/heads/master
Commit: 327c227d4d1fe53d497b6af0640c988e9a068939
Parents: b3cea88
Author: Aled Sage <al...@gmail.com>
Authored: Mon Dec 15 17:36:20 2014 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Dec 15 21:15:49 2014 +0000
----------------------------------------------------------------------
.../java/brooklyn/event/AttributeSensor.java | 28 ++++++++++++-
.../entity/rebind/dto/MementosGenerators.java | 8 ++--
.../event/basic/BasicAttributeSensor.java | 18 +++++++-
.../main/java/brooklyn/event/basic/Sensors.java | 43 ++++++++++++++++++++
.../entity/rebind/RebindEntityTest.java | 21 ++++++++++
5 files changed, 112 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/327c227d/api/src/main/java/brooklyn/event/AttributeSensor.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/event/AttributeSensor.java b/api/src/main/java/brooklyn/event/AttributeSensor.java
index b50e4ef..58e7480 100644
--- a/api/src/main/java/brooklyn/event/AttributeSensor.java
+++ b/api/src/main/java/brooklyn/event/AttributeSensor.java
@@ -18,9 +18,35 @@
*/
package brooklyn.event;
+import com.google.common.annotations.Beta;
+
/**
* The interface implemented by attribute sensors.
*/
public interface AttributeSensor<T> extends Sensor<T> {
- // Marker Interface
+
+ /**
+ * @since 0.7.0
+ */
+ @Beta
+ public enum SensorPersistenceMode {
+ /**
+ * Indicates that this sensor should be persisted, and its value should be read from
+ * persisted state on rebind.
+ */
+ REQUIRED,
+
+ /**
+ * Indicates that this sensor should not be persisted; therefore its value for any entity
+ * will be null immediately after rebind.
+ */
+ NONE;
+ }
+
+ /**
+ * The persistence mode of this sensor, to determine its behaviour for rebind.
+ *
+ * @since 0.7.0
+ */
+ SensorPersistenceMode getPersistenceMode();
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/327c227d/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java b/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java
index 8ec638a..ca1c434 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java
@@ -38,13 +38,13 @@ import brooklyn.entity.basic.EntityDynamicType;
import brooklyn.entity.basic.EntityInternal;
import brooklyn.entity.rebind.TreeUtils;
import brooklyn.event.AttributeSensor;
+import brooklyn.event.AttributeSensor.SensorPersistenceMode;
import brooklyn.event.feed.AbstractFeed;
import brooklyn.location.Location;
import brooklyn.location.basic.AbstractLocation;
import brooklyn.location.basic.LocationInternal;
import brooklyn.management.ManagementContext;
import brooklyn.management.Task;
-import brooklyn.management.internal.NonDeploymentManagementContext;
import brooklyn.mementos.BrooklynMemento;
import brooklyn.mementos.CatalogItemMemento;
import brooklyn.mementos.EnricherMemento;
@@ -173,8 +173,10 @@ public class MementosGenerators {
Map<AttributeSensor, Object> allAttributes = entity.getAllAttributes();
for (@SuppressWarnings("rawtypes") Map.Entry<AttributeSensor, Object> entry : allAttributes.entrySet()) {
AttributeSensor<?> key = checkNotNull(entry.getKey(), allAttributes);
- Object value = entry.getValue();
- builder.attributes.put((AttributeSensor<?>)key, value);
+ if (key.getPersistenceMode() != SensorPersistenceMode.NONE) {
+ Object value = entry.getValue();
+ builder.attributes.put((AttributeSensor<?>)key, value);
+ }
}
for (Location location : entity.getLocations()) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/327c227d/core/src/main/java/brooklyn/event/basic/BasicAttributeSensor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/basic/BasicAttributeSensor.java b/core/src/main/java/brooklyn/event/basic/BasicAttributeSensor.java
index 318b65b..6333ece 100644
--- a/core/src/main/java/brooklyn/event/basic/BasicAttributeSensor.java
+++ b/core/src/main/java/brooklyn/event/basic/BasicAttributeSensor.java
@@ -18,6 +18,8 @@
*/
package brooklyn.event.basic;
+import static com.google.common.base.Preconditions.checkNotNull;
+
import brooklyn.event.AttributeSensor;
import brooklyn.event.Sensor;
@@ -28,13 +30,15 @@ import com.google.common.reflect.TypeToken;
*/
public class BasicAttributeSensor<T> extends BasicSensor<T> implements AttributeSensor<T> {
private static final long serialVersionUID = -2493209215974820300L;
+
+ private final SensorPersistenceMode persistence;
public BasicAttributeSensor(Class<T> type, String name) {
this(type, name, name);
}
public BasicAttributeSensor(Class<T> type, String name, String description) {
- super(type, name, description);
+ this(TypeToken.of(type), name, description);
}
public BasicAttributeSensor(TypeToken<T> typeToken, String name) {
@@ -42,7 +46,17 @@ public class BasicAttributeSensor<T> extends BasicSensor<T> implements Attribute
}
public BasicAttributeSensor(TypeToken<T> typeToken, String name, String description) {
- super(typeToken, name, description);
+ this(typeToken, name, description, SensorPersistenceMode.REQUIRED);
}
+ public BasicAttributeSensor(TypeToken<T> typeToken, String name, String description, SensorPersistenceMode persistence) {
+ super(typeToken, name, description);
+ this.persistence = checkNotNull(persistence, "persistence");
+ }
+
+ @Override
+ public SensorPersistenceMode getPersistenceMode() {
+ // persistence could be null if deserializing state written by an old version; in which case default to 'required'
+ return (persistence != null) ? persistence : SensorPersistenceMode.REQUIRED;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/327c227d/core/src/main/java/brooklyn/event/basic/Sensors.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/basic/Sensors.java b/core/src/main/java/brooklyn/event/basic/Sensors.java
index ac22e2c..033f6b4 100644
--- a/core/src/main/java/brooklyn/event/basic/Sensors.java
+++ b/core/src/main/java/brooklyn/event/basic/Sensors.java
@@ -18,6 +18,8 @@
*/
package brooklyn.event.basic;
+import static com.google.common.base.Preconditions.checkNotNull;
+
import java.net.InetAddress;
import java.net.URI;
import java.net.URL;
@@ -26,17 +28,58 @@ import javax.annotation.Nullable;
import brooklyn.config.render.RendererHints;
import brooklyn.event.AttributeSensor;
+import brooklyn.event.AttributeSensor.SensorPersistenceMode;
import brooklyn.util.net.UserAndHostAndPort;
import brooklyn.util.text.StringFunctions;
import brooklyn.util.time.Duration;
import brooklyn.util.time.Time;
+import com.google.common.annotations.Beta;
import com.google.common.base.Function;
import com.google.common.net.HostAndPort;
import com.google.common.reflect.TypeToken;
public class Sensors {
+ @Beta
+ public static <T> Builder<T> builder(TypeToken<T> type, String name) {
+ return new Builder<T>().type(type).name(name);
+ }
+
+ @Beta
+ public static <T> Builder<T> builder(Class<T> type, String name) {
+ return new Builder<T>().type(type).name(name);
+ }
+
+ @Beta
+ public static class Builder<T> {
+ private String name;
+ private TypeToken<T> type;
+ private String description;
+ private SensorPersistenceMode persistence;
+
+ protected Builder() { // use builder(type, name) instead
+ }
+ public Builder<T> name(String val) {
+ this.name = checkNotNull(val, "name"); return this;
+ }
+ public Builder<T> type(Class<T> val) {
+ return type(TypeToken.of(val));
+ }
+ public Builder<T> type(TypeToken<T> val) {
+ this.type = checkNotNull(val, "type"); return this;
+ }
+ public Builder<T> description(String val) {
+ this.description = val; return this;
+ }
+ public Builder<T> persistence(SensorPersistenceMode val) {
+ this.persistence = val; return this;
+ }
+ public AttributeSensor<T> build() {
+ return new BasicAttributeSensor<T>(type, name, description, persistence);
+ }
+ }
+
public static <T> AttributeSensor<T> newSensor(Class<T> type, String name) {
return new BasicAttributeSensor<T>(type, name);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/327c227d/core/src/test/java/brooklyn/entity/rebind/RebindEntityTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindEntityTest.java b/core/src/test/java/brooklyn/entity/rebind/RebindEntityTest.java
index d6faccf..ab55346 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RebindEntityTest.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RebindEntityTest.java
@@ -33,6 +33,7 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Semaphore;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -52,6 +53,7 @@ import brooklyn.entity.proxying.ImplementedBy;
import brooklyn.entity.trait.Resizable;
import brooklyn.entity.trait.Startable;
import brooklyn.event.AttributeSensor;
+import brooklyn.event.AttributeSensor.SensorPersistenceMode;
import brooklyn.event.SensorEvent;
import brooklyn.event.SensorEventListener;
import brooklyn.event.basic.BasicAttributeSensor;
@@ -577,6 +579,25 @@ public class RebindEntityTest extends RebindTestFixtureWithApp {
}
@Test
+ public void testRebindDoesNotPersistTransientAttribute() throws Exception {
+ final String sensorName = "test.mydynamicsensor";
+ final AttributeSensor<Object> MY_DYNAMIC_SENSOR = Sensors.builder(Object.class, sensorName)
+ .persistence(SensorPersistenceMode.NONE)
+ .build();
+
+ // Anonymous inner class: we will not be able to rebind that.
+ @SuppressWarnings("serial")
+ Semaphore unrebindableObject = new Semaphore(1) {
+ };
+
+ origApp.setAttribute(MY_DYNAMIC_SENSOR, unrebindableObject);
+ assertEquals(origApp.getAttribute(MY_DYNAMIC_SENSOR), unrebindableObject);
+
+ newApp = rebind();
+ assertNull(newApp.getAttribute(MY_DYNAMIC_SENSOR));
+ }
+
+ @Test
public void testRebindWhenPreviousAppDestroyedHasNoApp() throws Exception {
origApp.stop();