You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/08/01 22:12:56 UTC

[1/8] git commit: Creating BrooklynObject super-type

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master d67444a3e -> 8b5d48ac2


Creating BrooklynObject super-type

- a super type for Entity, Location, Policy and Enricher


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/0194580e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/0194580e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/0194580e

Branch: refs/heads/master
Commit: 0194580ea36d0a00ab56fa7bbf9ade6b718dfef2
Parents: 5ca049e
Author: Aled Sage <al...@gmail.com>
Authored: Wed Jul 2 09:34:37 2014 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Jul 14 23:45:19 2014 +0100

----------------------------------------------------------------------
 .../java/brooklyn/basic/BrooklynObject.java     | 31 +++++++++++
 api/src/main/java/brooklyn/entity/Entity.java   | 10 ++--
 .../rebind/PersistenceExceptionHandler.java     |  4 +-
 .../entity/rebind/RebindExceptionHandler.java   |  6 +--
 .../main/java/brooklyn/location/Location.java   |  5 +-
 .../java/brooklyn/policy/EntityAdjunct.java     | 11 +---
 .../brooklyn/basic/AbstractBrooklynObject.java  | 33 ++++++++++++
 .../brooklyn/basic/BrooklynObjectInternal.java  | 24 +++++++++
 .../brooklyn/entity/basic/AbstractEntity.java   | 57 +++++++++-----------
 .../brooklyn/entity/basic/EntityInternal.java   |  3 +-
 .../rebind/PersistenceExceptionHandlerImpl.java |  4 +-
 .../rebind/RebindExceptionHandlerImpl.java      |  6 +--
 .../location/basic/AbstractLocation.java        | 45 +++++++---------
 .../location/basic/LocationInternal.java        |  3 +-
 .../policy/basic/AbstractEntityAdjunct.java     | 13 ++---
 .../rebind/RecordingRebindExceptionHandler.java | 10 ++--
 16 files changed, 162 insertions(+), 103 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/api/src/main/java/brooklyn/basic/BrooklynObject.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/basic/BrooklynObject.java b/api/src/main/java/brooklyn/basic/BrooklynObject.java
new file mode 100644
index 0000000..9e22f96
--- /dev/null
+++ b/api/src/main/java/brooklyn/basic/BrooklynObject.java
@@ -0,0 +1,31 @@
+/*
+ * 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 brooklyn.basic;
+
+import brooklyn.entity.trait.Identifiable;
+
+/**
+ * Super-type of entity, location, policy and enricher.
+ */
+public interface BrooklynObject extends Identifiable {
+    /**
+     * A display name; recommended to be a concise single-line description.
+     */
+    String getDisplayName();
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/api/src/main/java/brooklyn/entity/Entity.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/Entity.java b/api/src/main/java/brooklyn/entity/Entity.java
index 14e7853..c792067 100644
--- a/api/src/main/java/brooklyn/entity/Entity.java
+++ b/api/src/main/java/brooklyn/entity/Entity.java
@@ -25,12 +25,10 @@ import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.collect.ImmutableMap;
-
+import brooklyn.basic.BrooklynObject;
 import brooklyn.config.ConfigKey;
 import brooklyn.config.ConfigKey.HasConfigKey;
 import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.trait.Identifiable;
 import brooklyn.event.AttributeSensor;
 import brooklyn.location.Location;
 import brooklyn.management.Task;
@@ -40,6 +38,8 @@ import brooklyn.policy.Policy;
 import brooklyn.policy.PolicySpec;
 import brooklyn.util.guava.Maybe;
 
+import com.google.common.collect.ImmutableMap;
+
 /**
  * The basic interface for a Brooklyn entity.
  * <p>
@@ -53,7 +53,7 @@ import brooklyn.util.guava.Maybe;
  * 
  * @see brooklyn.entity.basic.AbstractEntity
  */
-public interface Entity extends Identifiable {
+public interface Entity extends BrooklynObject {
     /**
      * The unique identifier for this entity.
      */
@@ -71,7 +71,7 @@ public interface Entity extends Identifiable {
     String getDisplayName();
     
     /** 
-     * A URL pointing to an image which can be used to represent this icon.
+     * A URL pointing to an image which can be used to represent this entity.
      */
     @Nullable String getIconUrl();
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java b/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java
index 024cbb1..120512d 100644
--- a/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java
+++ b/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java
@@ -18,7 +18,7 @@
  */
 package brooklyn.entity.rebind;
 
-import brooklyn.entity.trait.Identifiable;
+import brooklyn.basic.BrooklynObject;
 import brooklyn.mementos.Memento;
 
 import com.google.common.annotations.Beta;
@@ -33,7 +33,7 @@ public interface PersistenceExceptionHandler {
 
     void stop();
 
-    void onGenerateMementoFailed(BrooklynObjectType type, Identifiable instance, Exception e);
+    void onGenerateMementoFailed(BrooklynObjectType type, BrooklynObject instance, Exception e);
     
     void onPersistMementoFailed(Memento memento, Exception e);
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java b/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java
index 4e5aa60..1c99044 100644
--- a/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java
+++ b/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java
@@ -18,9 +18,9 @@
  */
 package brooklyn.entity.rebind;
 
+import brooklyn.basic.BrooklynObject;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.trait.Identifiable;
 import brooklyn.location.Location;
 import brooklyn.policy.Enricher;
 import brooklyn.policy.Policy;
@@ -61,13 +61,13 @@ public interface RebindExceptionHandler {
 
     void onNotFound(BrooklynObjectType type, String id);
 
-    void onRebindFailed(BrooklynObjectType type, Identifiable instance, Exception e);
+    void onRebindFailed(BrooklynObjectType type, BrooklynObject instance, Exception e);
 
     void onAddPolicyFailed(EntityLocal entity, Policy policy, Exception e);
 
     void onAddEnricherFailed(EntityLocal entity, Enricher enricher, Exception e);
 
-    void onManageFailed(BrooklynObjectType type, Identifiable instance, Exception e);
+    void onManageFailed(BrooklynObjectType type, BrooklynObject instance, Exception e);
 
     void onDone();
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/api/src/main/java/brooklyn/location/Location.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/location/Location.java b/api/src/main/java/brooklyn/location/Location.java
index 6b5f9dc..fe9bf51 100644
--- a/api/src/main/java/brooklyn/location/Location.java
+++ b/api/src/main/java/brooklyn/location/Location.java
@@ -22,9 +22,9 @@ import java.io.Serializable;
 import java.util.Collection;
 import java.util.Map;
 
+import brooklyn.basic.BrooklynObject;
 import brooklyn.config.ConfigKey;
 import brooklyn.config.ConfigKey.HasConfigKey;
-import brooklyn.entity.trait.Identifiable;
 
 /**
  * A location that an entity can be in. Examples of locations include a single machine
@@ -34,7 +34,7 @@ import brooklyn.entity.trait.Identifiable;
  * 
  * Locations may not be {@link Serializable} in subsequent releases!
  */
-public interface Location extends Serializable, Identifiable {
+public interface Location extends Serializable, BrooklynObject {
 
     /**
      * A unique id for this location.
@@ -48,6 +48,7 @@ public interface Location extends Serializable, Identifiable {
      * @return the name assigned to the location.
      * @since 0.6 (previously getName())
      */
+    @Override
     String getDisplayName();
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/api/src/main/java/brooklyn/policy/EntityAdjunct.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/EntityAdjunct.java b/api/src/main/java/brooklyn/policy/EntityAdjunct.java
index d0d0d37..fa05a2a 100644
--- a/api/src/main/java/brooklyn/policy/EntityAdjunct.java
+++ b/api/src/main/java/brooklyn/policy/EntityAdjunct.java
@@ -18,13 +18,13 @@
  */
 package brooklyn.policy;
 
-import brooklyn.entity.trait.Identifiable;
+import brooklyn.basic.BrooklynObject;
 
 /**
  * EntityAdjuncts are supplementary logic that can be attached to Entities, providing sensor enrichment
  * or enabling policy
  */
-public interface EntityAdjunct extends Identifiable {
+public interface EntityAdjunct extends BrooklynObject {
     /**
      * A unique id for this adjunct
      */
@@ -32,13 +32,6 @@ public interface EntityAdjunct extends Identifiable {
     String getId();
 
     /**
-     * Get the name assigned to this adjunct
-     *
-     * @return the name assigned to the adjunct
-     */
-    String getDisplayName();
-    
-    /**
      * @deprecated since 0.7; use {@link #getDisplayName()}
      */
     @Deprecated

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java b/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java
new file mode 100644
index 0000000..b64db51
--- /dev/null
+++ b/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java
@@ -0,0 +1,33 @@
+/*
+ * 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 brooklyn.basic;
+
+import brooklyn.util.flags.SetFromFlag;
+import brooklyn.util.text.Identifiers;
+
+public abstract class AbstractBrooklynObject implements BrooklynObjectInternal {
+
+    @SetFromFlag(value="id")
+    private String id = Identifiers.makeRandomId(8);
+    
+    @Override
+    public String getId() {
+        return id;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/main/java/brooklyn/basic/BrooklynObjectInternal.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/basic/BrooklynObjectInternal.java b/core/src/main/java/brooklyn/basic/BrooklynObjectInternal.java
new file mode 100644
index 0000000..76033dc
--- /dev/null
+++ b/core/src/main/java/brooklyn/basic/BrooklynObjectInternal.java
@@ -0,0 +1,24 @@
+/*
+ * 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 brooklyn.basic;
+
+import brooklyn.entity.rebind.Rebindable;
+
+public interface BrooklynObjectInternal extends BrooklynObject, Rebindable {
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
index 081e0a6..43debba 100644
--- a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
+++ b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.basic.AbstractBrooklynObject;
 import brooklyn.config.ConfigKey;
 import brooklyn.config.ConfigKey.HasConfigKey;
 import brooklyn.enricher.basic.AbstractEnricher;
@@ -77,10 +78,8 @@ import brooklyn.util.collections.MutableMap;
 import brooklyn.util.collections.SetFromLiveMap;
 import brooklyn.util.config.ConfigBag;
 import brooklyn.util.flags.FlagUtils;
-import brooklyn.util.flags.SetFromFlag;
 import brooklyn.util.guava.Maybe;
 import brooklyn.util.task.DeferredSupplier;
-import brooklyn.util.text.Identifiers;
 import brooklyn.util.text.Strings;
 
 import com.google.common.annotations.Beta;
@@ -125,7 +124,7 @@ import com.google.common.collect.Sets;
  * The legacy (pre 0.5) mechanism for creating entities is for others to call the constructor directly.
  * This is now deprecated.
  */
-public abstract class AbstractEntity implements EntityLocal, EntityInternal {
+public abstract class AbstractEntity extends AbstractBrooklynObject implements EntityLocal, EntityInternal {
     
     private static final Logger LOG = LoggerFactory.getLogger(AbstractEntity.class);
     
@@ -153,9 +152,6 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
     public static final BasicNotificationSensor<Entity> CHILD_REMOVED = new BasicNotificationSensor<Entity>(Entity.class,
             "entity.children.removed", "Child dynamically removed from entity");
 
-    @SetFromFlag(value="id")
-    private String id = Identifiers.makeRandomId(8);
-    
     private boolean displayNameAutoGenerated = true;
     
     private Entity selfProxy;
@@ -281,13 +277,13 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
 
     @Override
     public int hashCode() {
-        return id.hashCode();
+        return getId().hashCode();
     }
     
     @Override
     public boolean equals(Object o) {
         return (o == this || o == selfProxy) || 
-                (o instanceof Entity && Objects.equal(id, ((Entity)o).getId()));
+                (o instanceof Entity && Objects.equal(getId(), ((Entity)o).getId()));
     }
     
     protected boolean isLegacyConstruction() {
@@ -298,11 +294,6 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
         return RebindManagerImpl.RebindTracker.isRebinding();
     }
     
-    @Override
-    public String getId() {
-        return id;
-    }
-    
     public void setProxy(Entity proxy) {
         if (selfProxy != null) throw new IllegalStateException("Proxy is already set; cannot reset proxy for "+toString());
         selfProxy = checkNotNull(proxy, "proxy");
@@ -364,7 +355,7 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
             displayName.set((String) flags.remove("name"));
             displayNameAutoGenerated = false;
         } else if (isLegacyConstruction()) {
-            displayName.set(getClass().getSimpleName()+":"+Strings.maxlen(id, 4));
+            displayName.set(getClass().getSimpleName()+":"+Strings.maxlen(getId(), 4));
             displayNameAutoGenerated = true;
         }
 
@@ -420,7 +411,7 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
     public void setManagementContext(ManagementContextInternal managementContext) {
         getManagementSupport().setManagementContext(managementContext);
         entityType.setName(getEntityTypeName());
-        if (displayNameAutoGenerated) displayName.set(getEntityType().getSimpleName()+":"+Strings.maxlen(id, 4));
+        if (displayNameAutoGenerated) displayName.set(getEntityType().getSimpleName()+":"+Strings.maxlen(getId(), 4));
         
         Entity oldParent = parent.get();
         Set<Group> oldGroups = groups;
@@ -432,13 +423,13 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
         String oldDisplayName = displayName.get();
         String oldIconUrl = iconUrl.get();
         
-        parent = managementContext.getStorage().getReference(id+"-parent");
-        groups = SetFromLiveMap.create(managementContext.getStorage().<Group,Boolean>getMap(id+"-groups"));
-        children = SetFromLiveMap.create(managementContext.getStorage().<Entity,Boolean>getMap(id+"-children"));
-        locations = managementContext.getStorage().getNonConcurrentList(id+"-locations");
-        creationTimeUtc = managementContext.getStorage().getReference(id+"-creationTime");
-        displayName = managementContext.getStorage().getReference(id+"-displayName");
-        iconUrl = managementContext.getStorage().getReference(id+"-iconUrl");
+        parent = managementContext.getStorage().getReference(getId()+"-parent");
+        groups = SetFromLiveMap.create(managementContext.getStorage().<Group,Boolean>getMap(getId()+"-groups"));
+        children = SetFromLiveMap.create(managementContext.getStorage().<Entity,Boolean>getMap(getId()+"-children"));
+        locations = managementContext.getStorage().getNonConcurrentList(getId()+"-locations");
+        creationTimeUtc = managementContext.getStorage().getReference(getId()+"-creationTime");
+        displayName = managementContext.getStorage().getReference(getId()+"-displayName");
+        iconUrl = managementContext.getStorage().getReference(getId()+"-iconUrl");
         
         // 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
@@ -458,13 +449,13 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
         }
         if (iconUrl.isNull()) iconUrl.set(oldIconUrl);
         
-        configsInternal = new EntityConfigMap(this, managementContext.getStorage().<ConfigKey<?>, Object>getMap(id+"-config"));
+        configsInternal = new EntityConfigMap(this, managementContext.getStorage().<ConfigKey<?>, Object>getMap(getId()+"-config"));
         if (oldConfig.getLocalConfig().size() > 0) {
             configsInternal.setLocalConfig(oldConfig.getLocalConfig());
         }
         refreshInheritedConfig();
         
-        attributesInternal = new AttributeMap(this, managementContext.getStorage().<Collection<String>, Object>getMap(id+"-attributes"));
+        attributesInternal = new AttributeMap(this, managementContext.getStorage().<Collection<String>, Object>getMap(getId()+"-attributes"));
         if (oldAttribs.asRawMap().size() > 0) {
             for (Map.Entry<Collection<String>,Object> entry : oldAttribs.asRawMap().entrySet()) {
                 attributesInternal.update(entry.getKey(), entry.getValue());
@@ -1217,7 +1208,7 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
     public void onManagementStarting() {
         if (isLegacyConstruction()) {
             entityType.setName(getEntityTypeName());
-            if (displayNameAutoGenerated) displayName.set(getEntityType().getSimpleName()+":"+Strings.maxlen(id, 4));
+            if (displayNameAutoGenerated) displayName.set(getEntityType().getSimpleName()+":"+Strings.maxlen(getId(), 4));
         }
     }
     
@@ -1249,14 +1240,14 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
     public void onManagementStopped() {
         if (getManagementContext().isRunning()) {
             BrooklynStorage storage = ((ManagementContextInternal)getManagementContext()).getStorage();
-            storage.remove(id+"-parent");
-            storage.remove(id+"-groups");
-            storage.remove(id+"-children");
-            storage.remove(id+"-locations");
-            storage.remove(id+"-creationTime");
-            storage.remove(id+"-displayName");
-            storage.remove(id+"-config");
-            storage.remove(id+"-attributes");
+            storage.remove(getId()+"-parent");
+            storage.remove(getId()+"-groups");
+            storage.remove(getId()+"-children");
+            storage.remove(getId()+"-locations");
+            storage.remove(getId()+"-creationTime");
+            storage.remove(getId()+"-displayName");
+            storage.remove(getId()+"-config");
+            storage.remove(getId()+"-attributes");
         }
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/main/java/brooklyn/entity/basic/EntityInternal.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/EntityInternal.java b/core/src/main/java/brooklyn/entity/basic/EntityInternal.java
index 665ce10..7fef8c5 100644
--- a/core/src/main/java/brooklyn/entity/basic/EntityInternal.java
+++ b/core/src/main/java/brooklyn/entity/basic/EntityInternal.java
@@ -21,6 +21,7 @@ package brooklyn.entity.basic;
 import java.util.Collection;
 import java.util.Map;
 
+import brooklyn.basic.BrooklynObjectInternal;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Effector;
 import brooklyn.entity.rebind.RebindSupport;
@@ -41,7 +42,7 @@ import com.google.common.annotations.Beta;
  * for the brooklyn framework only).
  */
 @Beta
-public interface EntityInternal extends EntityLocal, Rebindable {
+public interface EntityInternal extends BrooklynObjectInternal, EntityLocal, Rebindable {
     
     void addLocations(Collection<? extends Location> locations);
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java b/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java
index 92f6619..799da62 100644
--- a/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java
@@ -24,7 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.entity.trait.Identifiable;
+import brooklyn.basic.BrooklynObject;
 import brooklyn.mementos.Memento;
 import brooklyn.util.exceptions.Exceptions;
 
@@ -59,7 +59,7 @@ public class PersistenceExceptionHandlerImpl implements PersistenceExceptionHand
     }
     
     @Override
-    public void onGenerateMementoFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
+    public void onGenerateMementoFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) {
         String errmsg = "generate memento for "+type+" "+instance.getClass().getName()+"("+instance.getId()+")";
         onErrorImpl(errmsg, e, prevFailedMementoGenerators.add(instance.getId()));
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
index 53b0c5f..a13aa80 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
@@ -27,10 +27,10 @@ import java.util.Set;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.basic.BrooklynObject;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.entity.rebind.RebindManager.RebindFailureMode;
-import brooklyn.entity.trait.Identifiable;
 import brooklyn.location.Location;
 import brooklyn.policy.Enricher;
 import brooklyn.policy.Policy;
@@ -188,7 +188,7 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler {
     }
     
     @Override
-    public void onRebindFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
+    public void onRebindFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) {
         Exceptions.propagateIfFatal(e);
         String errmsg = "problem rebinding "+type+" "+instance.getId()+" ("+instance+")";
         
@@ -255,7 +255,7 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler {
     }
 
     @Override
-    public void onManageFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
+    public void onManageFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) {
         Exceptions.propagateIfFatal(e);
         String errmsg = "problem managing "+type+" "+instance.getId()+" ("+instance+")";
         

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/AbstractLocation.java b/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
index ebb5909..ce54536 100644
--- a/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
@@ -32,6 +32,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.basic.AbstractBrooklynObject;
 import brooklyn.config.ConfigKey;
 import brooklyn.config.ConfigKey.HasConfigKey;
 import brooklyn.entity.basic.EntityDynamicType;
@@ -55,10 +56,8 @@ import brooklyn.mementos.LocationMemento;
 import brooklyn.util.collections.SetFromLiveMap;
 import brooklyn.util.config.ConfigBag;
 import brooklyn.util.flags.FlagUtils;
-import brooklyn.util.flags.SetFromFlag;
 import brooklyn.util.flags.TypeCoercions;
 import brooklyn.util.stream.Streams;
-import brooklyn.util.text.Identifiers;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
@@ -77,7 +76,7 @@ import com.google.common.collect.Sets;
  * 
  * Override {@link #configure(Map)} to add special initialization logic.
  */
-public abstract class AbstractLocation implements LocationInternal, HasHostGeoInfo, Configurable {
+public abstract class AbstractLocation extends AbstractBrooklynObject implements LocationInternal, HasHostGeoInfo, Configurable {
     
     /** @deprecated since 0.7.0 shouldn't be public */
     @Deprecated
@@ -87,9 +86,6 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
     
     private final AtomicBoolean configured = new AtomicBoolean(false);
     
-    @SetFromFlag(value="id")
-    private String id = Identifiers.makeRandomId(8);
-
     private Reference<Long> creationTimeUtc = new BasicReference<Long>(System.currentTimeMillis());
     
     // _not_ set from flag; configured explicitly in configure, because we also need to update the parent's list of children
@@ -181,7 +177,7 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
 
     public void setManagementContext(ManagementContextInternal managementContext) {
         this.managementContext = managementContext;
-        if (displayNameAutoGenerated && id != null) name.set(getClass().getSimpleName()+":"+id.substring(0, Math.min(id.length(),4)));
+        if (displayNameAutoGenerated && getId() != null) name.set(getClass().getSimpleName()+":"+getId().substring(0, Math.min(getId().length(),4)));
 
         Location oldParent = parent.get();
         Set<Location> oldChildren = children;
@@ -190,11 +186,11 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
         String oldDisplayName = name.get();
         HostGeoInfo oldHostGeoInfo = hostGeoInfo.get();
         
-        parent = managementContext.getStorage().getReference(id+"-parent");
-        children = SetFromLiveMap.create(managementContext.getStorage().<Location,Boolean>getMap(id+"-children"));
-        creationTimeUtc = managementContext.getStorage().getReference(id+"-creationTime");
-        hostGeoInfo = managementContext.getStorage().getReference(id+"-hostGeoInfo");
-        name = managementContext.getStorage().getReference(id+"-displayName");
+        parent = managementContext.getStorage().getReference(getId()+"-parent");
+        children = SetFromLiveMap.create(managementContext.getStorage().<Location,Boolean>getMap(getId()+"-children"));
+        creationTimeUtc = managementContext.getStorage().getReference(getId()+"-creationTime");
+        hostGeoInfo = managementContext.getStorage().getReference(getId()+"-hostGeoInfo");
+        name = managementContext.getStorage().getReference(getId()+"-displayName");
         
         // 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
@@ -212,7 +208,7 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
             displayNameAutoGenerated = false;
         }
         
-        configBag = ConfigBag.newLiveInstance(managementContext.getStorage().<String,Object>getMap(id+"-config"));
+        configBag = ConfigBag.newLiveInstance(managementContext.getStorage().<String,Object>getMap(getId()+"-config"));
         if (oldConfig.size() > 0) {
             configBag.putAll(oldConfig);
         }
@@ -264,7 +260,7 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
             name.set((String) removeIfPossible(properties, "name"));
             displayNameAutoGenerated = false;
         } else if (isLegacyConstruction()) {
-            name.set(getClass().getSimpleName()+":"+id.substring(0, Math.min(id.length(),4)));
+            name.set(getClass().getSimpleName()+":"+getId().substring(0, Math.min(getId().length(),4)));
             displayNameAutoGenerated = true;
         }
 
@@ -328,7 +324,7 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
     }
 
     public void onManagementStarted() {
-        if (displayNameAutoGenerated) name.set(getClass().getSimpleName()+":"+id.substring(0, Math.min(id.length(),4)));
+        if (displayNameAutoGenerated) name.set(getClass().getSimpleName()+":"+getId().substring(0, Math.min(getId().length(),4)));
         this.managed = true;
     }
     
@@ -336,12 +332,12 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
         this.managed = false;
         if (managementContext.isRunning()) {
             BrooklynStorage storage = ((ManagementContextInternal)managementContext).getStorage();
-            storage.remove(id+"-parent");
-            storage.remove(id+"-children");
-            storage.remove(id+"-creationTime");
-            storage.remove(id+"-hostGeoInfo");
-            storage.remove(id+"-displayName");
-            storage.remove(id+"-config");
+            storage.remove(getId()+"-parent");
+            storage.remove(getId()+"-children");
+            storage.remove(getId()+"-creationTime");
+            storage.remove(getId()+"-hostGeoInfo");
+            storage.remove(getId()+"-displayName");
+            storage.remove(getId()+"-config");
         }
     }
     
@@ -350,11 +346,6 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
     }
     
     @Override
-    public String getId() {
-        return id;
-    }
-    
-    @Override
     public String getDisplayName() {
         return name.get();
     }
@@ -559,7 +550,7 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
 
     /** override this, adding to the returned value, to supply additional fields to include in the toString */
     protected ToStringHelper string() {
-        return Objects.toStringHelper(getClass()).add("id", id).add("name", name);
+        return Objects.toStringHelper(getClass()).add("id", getId()).add("name", name);
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/main/java/brooklyn/location/basic/LocationInternal.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/LocationInternal.java b/core/src/main/java/brooklyn/location/basic/LocationInternal.java
index 4450822..8c8f38c 100644
--- a/core/src/main/java/brooklyn/location/basic/LocationInternal.java
+++ b/core/src/main/java/brooklyn/location/basic/LocationInternal.java
@@ -20,6 +20,7 @@ package brooklyn.location.basic;
 
 import java.util.Map;
 
+import brooklyn.basic.BrooklynObjectInternal;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.rebind.RebindSupport;
@@ -34,7 +35,7 @@ import com.google.common.annotations.Beta;
 /**
  * Information about locations private to Brooklyn.
  */
-public interface LocationInternal extends Location, Rebindable {
+public interface LocationInternal extends BrooklynObjectInternal, Location {
 
     @Beta
     public static final ConfigKey<String> ORIGINAL_SPEC = ConfigKeys.newStringConfigKey("spec.original", "The original spec used to instantiate a location");

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
index b6dd15f..7774825 100644
--- a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
+++ b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
@@ -31,6 +31,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.basic.AbstractBrooklynObject;
+import brooklyn.basic.BrooklynObjectInternal;
 import brooklyn.config.ConfigKey;
 import brooklyn.config.ConfigMap;
 import brooklyn.entity.Entity;
@@ -53,7 +55,6 @@ import brooklyn.util.config.ConfigBag;
 import brooklyn.util.flags.FlagUtils;
 import brooklyn.util.flags.SetFromFlag;
 import brooklyn.util.flags.TypeCoercions;
-import brooklyn.util.text.Identifiers;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Objects;
@@ -64,7 +65,7 @@ import com.google.common.collect.Maps;
 /**
  * Common functionality for policies and enrichers
  */
-public abstract class AbstractEntityAdjunct implements EntityAdjunct, Configurable {
+public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject implements BrooklynObjectInternal, EntityAdjunct, Configurable {
     private static final Logger log = LoggerFactory.getLogger(AbstractEntityAdjunct.class);
 
     private volatile ManagementContext managementContext;
@@ -88,9 +89,6 @@ public abstract class AbstractEntityAdjunct implements EntityAdjunct, Configurab
     protected final AdjunctType adjunctType = new AdjunctType(this);
 
     @SetFromFlag
-    protected String id = Identifiers.makeRandomId(8);
-    
-    @SetFromFlag
     protected String name;
     
     protected transient EntityLocal entity;
@@ -292,11 +290,6 @@ public abstract class AbstractEntityAdjunct implements EntityAdjunct, Configurab
     @Deprecated
     public void setName(String name) { setDisplayName(name); }
 
-    @Override
-    public String getId() { return id; }
-    
-    public void setId(String id) { this.id = id; }
- 
     public void setEntity(EntityLocal entity) {
         if (destroyed.get()) throw new IllegalStateException("Cannot set entity on a destroyed entity adjunct");
         this.entity = entity;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0194580e/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java b/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
index f9dbe78..2cec642 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
@@ -21,8 +21,8 @@ package brooklyn.entity.rebind;
 import java.util.List;
 import java.util.Map;
 
+import brooklyn.basic.BrooklynObject;
 import brooklyn.entity.Entity;
-import brooklyn.entity.trait.Identifiable;
 import brooklyn.location.Location;
 
 import com.google.common.collect.Lists;
@@ -32,8 +32,8 @@ public class RecordingRebindExceptionHandler extends RebindExceptionHandlerImpl
 
     protected final List<Exception> loadMementoFailures = Lists.newArrayList();
     protected final Map<String, Exception> createFailures = Maps.newLinkedHashMap();
-    protected final Map<Identifiable, Exception> rebindFailures = Maps.newLinkedHashMap();
-    protected final Map<Identifiable, Exception> manageFailures = Maps.newLinkedHashMap();
+    protected final Map<BrooklynObject, Exception> rebindFailures = Maps.newLinkedHashMap();
+    protected final Map<BrooklynObject, Exception> manageFailures = Maps.newLinkedHashMap();
     protected final Map<String, Exception> notFoundFailures = Maps.newLinkedHashMap();
     protected Exception failed;
     
@@ -70,13 +70,13 @@ public class RecordingRebindExceptionHandler extends RebindExceptionHandlerImpl
     }
     
     @Override
-    public void onRebindFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
+    public void onRebindFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) {
         rebindFailures.put(instance, new IllegalStateException("problem rebinding "+type+" "+instance.getId()+" ("+instance+")", e));
         super.onRebindFailed(type, instance, e);
     }
 
     @Override
-    public void onManageFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
+    public void onManageFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) {
         manageFailures.put(instance, new IllegalStateException("problem managing "+type+" "+instance.getId()+" ("+instance+")", e));
         super.onManageFailed(type, instance, e);
     }


[5/8] git commit: Remove duplication in rebind code

Posted by he...@apache.org.
Remove duplication in rebind code


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/cbb6e40c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/cbb6e40c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/cbb6e40c

Branch: refs/heads/master
Commit: cbb6e40c55fa7d2e1382fecbfff0d70ff7b4f79f
Parents: e07155a
Author: Aled Sage <al...@gmail.com>
Authored: Mon Jul 14 15:55:27 2014 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Jul 14 23:45:19 2014 +0100

----------------------------------------------------------------------
 .../entity/rebind/BrooklynObjectType.java       |  30 +++
 .../rebind/PersistenceExceptionHandler.java     |  13 +-
 .../entity/rebind/RebindExceptionHandler.java   |  43 +---
 .../brooklyn/entity/basic/EntityFunctions.java  |   7 +-
 .../rebind/PeriodicDeltaChangeListener.java     |   8 +-
 .../rebind/PersistenceExceptionHandlerImpl.java |  29 +--
 .../rebind/RebindExceptionHandlerImpl.java      | 244 ++++---------------
 .../entity/rebind/RebindManagerImpl.java        |  36 ++-
 .../entity/rebind/dto/BrooklynMementoImpl.java  |  20 +-
 .../BrooklynMementoPersisterToFile.java         |   1 +
 .../BrooklynMementoPersisterToMultiFile.java    |  20 +-
 .../BrooklynMementoPersisterToObjectStore.java  |  97 +++-----
 .../entity/rebind/RebindFailuresTest.java       |  17 +-
 .../rebind/RecordingRebindExceptionHandler.java | 113 ++-------
 14 files changed, 210 insertions(+), 468 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/api/src/main/java/brooklyn/entity/rebind/BrooklynObjectType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/rebind/BrooklynObjectType.java b/api/src/main/java/brooklyn/entity/rebind/BrooklynObjectType.java
new file mode 100644
index 0000000..a027867
--- /dev/null
+++ b/api/src/main/java/brooklyn/entity/rebind/BrooklynObjectType.java
@@ -0,0 +1,30 @@
+/*
+ * 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 brooklyn.entity.rebind;
+
+import com.google.common.annotations.Beta;
+
+@Beta
+public enum BrooklynObjectType {
+    ENTITY,
+    LOCATION,
+    POLICY,
+    ENRICHER,
+    UNKNOWN;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java b/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java
index 657d2b0..024cbb1 100644
--- a/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java
+++ b/api/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandler.java
@@ -18,11 +18,8 @@
  */
 package brooklyn.entity.rebind;
 
-import brooklyn.entity.Entity;
-import brooklyn.location.Location;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.mementos.Memento;
-import brooklyn.policy.Enricher;
-import brooklyn.policy.Policy;
 
 import com.google.common.annotations.Beta;
 
@@ -36,14 +33,8 @@ public interface PersistenceExceptionHandler {
 
     void stop();
 
-    void onGenerateLocationMementoFailed(Location location, Exception e);
-
-    void onGenerateEntityMementoFailed(Entity entity, Exception e);
-    
-    void onGeneratePolicyMementoFailed(Policy policy, Exception e);
+    void onGenerateMementoFailed(BrooklynObjectType type, Identifiable instance, Exception e);
     
-    void onGenerateEnricherMementoFailed(Enricher enricher, Exception e);
-
     void onPersistMementoFailed(Memento memento, Exception e);
     
     void onDeleteMementoFailed(String id, Exception e);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java b/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java
index 7330bbf..4e5aa60 100644
--- a/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java
+++ b/api/src/main/java/brooklyn/entity/rebind/RebindExceptionHandler.java
@@ -20,6 +20,7 @@ package brooklyn.entity.rebind;
 
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.EntityLocal;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.location.Location;
 import brooklyn.policy.Enricher;
 import brooklyn.policy.Policy;
@@ -34,15 +35,7 @@ import com.google.common.annotations.Beta;
 @Beta
 public interface RebindExceptionHandler {
 
-    void onLoadBrooklynMementoFailed(String msg, Exception e);
-    
-    void onLoadLocationMementoFailed(String msg, Exception e);
-
-    void onLoadEntityMementoFailed(String msg, Exception e);
-    
-    void onLoadPolicyMementoFailed(String msg, Exception e);
-    
-    void onLoadEnricherMementoFailed(String msg, Exception e);
+    void onLoadMementoFailed(BrooklynObjectType type, String msg, Exception e);
     
     /**
      * @return the entity to use in place of the missing one, or null (if hasn't thrown an exception)
@@ -64,41 +57,17 @@ public interface RebindExceptionHandler {
      */
     Enricher onDanglingEnricherRef(String id);
 
-    void onCreateLocationFailed(String locId, String locType, Exception e);
-
-    void onCreateEntityFailed(String entityId, String entityType, Exception e);
-
-    void onCreatePolicyFailed(String id, String type, Exception e);
-
-    void onCreateEnricherFailed(String id, String type, Exception e);
-
-    void onLocationNotFound(String id);
-    
-    void onEntityNotFound(String id);
-    
-    void onPolicyNotFound(String id);
-
-    void onPolicyNotFound(String id, String context);
-
-    void onEnricherNotFound(String id);
+    void onCreateFailed(BrooklynObjectType type, String id, String instanceType, Exception e);
 
-    void onEnricherNotFound(String id, String context);
+    void onNotFound(BrooklynObjectType type, String id);
 
-    void onRebindEntityFailed(Entity entity, Exception e);
-
-    void onRebindLocationFailed(Location location, Exception e);
-
-    void onRebindPolicyFailed(Policy policy, Exception e);
-
-    void onRebindEnricherFailed(Enricher enricher, Exception e);
+    void onRebindFailed(BrooklynObjectType type, Identifiable instance, Exception e);
 
     void onAddPolicyFailed(EntityLocal entity, Policy policy, Exception e);
 
     void onAddEnricherFailed(EntityLocal entity, Enricher enricher, Exception e);
 
-    void onManageLocationFailed(Location location, Exception e);
-
-    void onManageEntityFailed(Entity entity, Exception e);
+    void onManageFailed(BrooklynObjectType type, Identifiable instance, Exception e);
 
     void onDone();
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/main/java/brooklyn/entity/basic/EntityFunctions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/EntityFunctions.java b/core/src/main/java/brooklyn/entity/basic/EntityFunctions.java
index 4226a54..af9454c 100644
--- a/core/src/main/java/brooklyn/entity/basic/EntityFunctions.java
+++ b/core/src/main/java/brooklyn/entity/basic/EntityFunctions.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Application;
 import brooklyn.entity.Entity;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.event.AttributeSensor;
 import brooklyn.management.ManagementContext;
 import brooklyn.util.flags.TypeCoercions;
@@ -59,9 +60,9 @@ public class EntityFunctions {
         };
     }
     
-    public static Function<Entity, String> id() {
-        return new Function<Entity, String>() {
-            @Override public String apply(Entity input) {
+    public static Function<Identifiable, String> id() {
+        return new Function<Identifiable, String>() {
+            @Override public String apply(Identifiable input) {
                 return (input == null) ? null : input.getId();
             }
         };

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
index 6507dc7..955ba2e 100644
--- a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
+++ b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
@@ -225,28 +225,28 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
                     try {
                         persisterDelta.locations.add(((LocationInternal)location).getRebindSupport().getMemento());
                     } catch (Exception e) {
-                        exceptionHandler.onGenerateLocationMementoFailed(location, e);
+                        exceptionHandler.onGenerateMementoFailed(BrooklynObjectType.LOCATION, location, e);
                     }
                 }
                 for (Entity entity : prevDeltaCollector.entities) {
                     try {
                         persisterDelta.entities.add(((EntityInternal)entity).getRebindSupport().getMemento());
                     } catch (Exception e) {
-                        exceptionHandler.onGenerateEntityMementoFailed(entity, e);
+                        exceptionHandler.onGenerateMementoFailed(BrooklynObjectType.ENTITY, entity, e);
                     }
                 }
                 for (Policy policy : prevDeltaCollector.policies) {
                     try {
                         persisterDelta.policies.add(policy.getRebindSupport().getMemento());
                     } catch (Exception e) {
-                        exceptionHandler.onGeneratePolicyMementoFailed(policy, e);
+                        exceptionHandler.onGenerateMementoFailed(BrooklynObjectType.POLICY, policy, e);
                     }
                 }
                 for (Enricher enricher : prevDeltaCollector.enrichers) {
                     try {
                         persisterDelta.enrichers.add(enricher.getRebindSupport().getMemento());
                     } catch (Exception e) {
-                        exceptionHandler.onGenerateEnricherMementoFailed(enricher, e);
+                        exceptionHandler.onGenerateMementoFailed(BrooklynObjectType.ENRICHER, enricher, e);
                     }
                 }
                 persisterDelta.removedLocationIds = prevDeltaCollector.removedLocationIds;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java b/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java
index c8038a2..92f6619 100644
--- a/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/PersistenceExceptionHandlerImpl.java
@@ -24,11 +24,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.entity.Entity;
-import brooklyn.location.Location;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.mementos.Memento;
-import brooklyn.policy.Enricher;
-import brooklyn.policy.Policy;
 import brooklyn.util.exceptions.Exceptions;
 
 import com.google.common.collect.Sets;
@@ -62,27 +59,9 @@ public class PersistenceExceptionHandlerImpl implements PersistenceExceptionHand
     }
     
     @Override
-    public void onGenerateEntityMementoFailed(Entity entity, Exception e) {
-        String errmsg = "generate memento for entity "+entity.getEntityType().getSimpleName()+"("+entity.getId()+")";
-        onErrorImpl(errmsg, e, prevFailedMementoGenerators.add(entity.getId()));
-    }
-    
-    @Override
-    public void onGenerateLocationMementoFailed(Location location, Exception e) {
-        String errmsg = "generate memento for location "+location.getClass().getSimpleName()+"("+location.getId()+")";
-        onErrorImpl(errmsg, e, prevFailedMementoGenerators.add(location.getId()));
-    }
-    
-    @Override
-    public void onGeneratePolicyMementoFailed(Policy policy, Exception e) {
-        String errmsg = "generate memento for policy "+policy.getClass().getSimpleName()+"("+policy.getId()+")";
-        onErrorImpl(errmsg, e, prevFailedMementoGenerators.add(policy.getId()));
-    }
-    
-    @Override
-    public void onGenerateEnricherMementoFailed(Enricher enricher, Exception e) {
-        String errmsg = "generate memento for enricher "+enricher.getClass().getSimpleName()+"("+enricher.getId()+")";
-        onErrorImpl(errmsg, e, prevFailedMementoGenerators.add(enricher.getId()));
+    public void onGenerateMementoFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
+        String errmsg = "generate memento for "+type+" "+instance.getClass().getName()+"("+instance.getId()+")";
+        onErrorImpl(errmsg, e, prevFailedMementoGenerators.add(instance.getId()));
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
index 4a1a5b2..53b0c5f 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindExceptionHandlerImpl.java
@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.entity.rebind.RebindManager.RebindFailureMode;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.location.Location;
 import brooklyn.policy.Enricher;
 import brooklyn.policy.Policy;
@@ -52,10 +53,7 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler {
     protected final Set<String> missingLocations = Sets.newConcurrentHashSet();
     protected final Set<String> missingPolicies = Sets.newConcurrentHashSet();
     protected final Set<String> missingEnrichers = Sets.newConcurrentHashSet();
-    protected final Set<String> creationFailedEntities = Sets.newConcurrentHashSet();
-    protected final Set<String> creationFailedLocations = Sets.newConcurrentHashSet();
-    protected final Set<String> creationFailedPolicies = Sets.newConcurrentHashSet();
-    protected final Set<String> creationFailedEnrichers = Sets.newConcurrentHashSet();
+    protected final Set<String> creationFailedIds = Sets.newConcurrentHashSet();
     protected final Set<Exception> addPolicyFailures = Sets.newConcurrentHashSet();
     protected final Set<Exception> loadPolicyFailures = Sets.newConcurrentHashSet();
     protected final List<Exception> exceptions = Collections.synchronizedList(Lists.<Exception>newArrayList());
@@ -99,64 +97,31 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler {
     }
     
     @Override
-    public void onLoadBrooklynMementoFailed(String msg, Exception e) {
-        onLoadMementoFailure(msg, e);
-    }
-    
-    @Override
-    public void onLoadLocationMementoFailed(String msg, Exception e) {
-        onLoadMementoFailure(msg, e);
-    }
-    
-    @Override
-    public void onLoadEntityMementoFailed(String msg, Exception e) {
-        onLoadMementoFailure(msg, e);
-    }
-    
-    @Override
-    public void onLoadPolicyMementoFailed(String msg, Exception e) {
-        Exceptions.propagateIfFatal(e);
-        String errmsg = "problem loading memento: "+msg;
-        
-        switch (loadPolicyFailureMode) {
-        case FAIL_FAST:
-            throw new IllegalStateException("Rebind: aborting due to "+errmsg, e);
-        case FAIL_AT_END:
-            loadPolicyFailures.add(new IllegalStateException(errmsg, e));
-            break;
-        case CONTINUE:
-            LOG.warn(errmsg+"; continuing", e);
-            break;
-        default:
-            throw new IllegalStateException("Unexpected state '"+loadPolicyFailureMode+"' for loadPolicyFailureMode");
-        }
-    }
-    
-    @Override
-    public void onLoadEnricherMementoFailed(String msg, Exception e) {
+    public void onLoadMementoFailed(BrooklynObjectType type, String msg, Exception e) {
         Exceptions.propagateIfFatal(e);
         String errmsg = "problem loading memento: "+msg;
         
-        switch (loadPolicyFailureMode) {
-        case FAIL_FAST:
-            throw new IllegalStateException("Rebind: aborting due to "+errmsg, e);
-        case FAIL_AT_END:
-            loadPolicyFailures.add(new IllegalStateException(errmsg, e));
-            break;
-        case CONTINUE:
-            LOG.warn(errmsg+"; continuing", e);
-            break;
-        default:
-            throw new IllegalStateException("Unexpected state '"+loadPolicyFailureMode+"' for loadPolicyFailureMode");
+        switch (type) {
+            case POLICY:
+            case ENRICHER:
+                switch (loadPolicyFailureMode) {
+                    case FAIL_FAST:
+                        throw new IllegalStateException("Rebind: aborting due to "+errmsg, e);
+                    case FAIL_AT_END:
+                        loadPolicyFailures.add(new IllegalStateException(errmsg, e));
+                        break;
+                    case CONTINUE:
+                        LOG.warn(errmsg+"; continuing", e);
+                        break;
+                    default:
+                        throw new IllegalStateException("Unexpected state '"+loadPolicyFailureMode+"' for loadPolicyFailureMode");
+                }
+                break;
+            default:
+                exceptions.add(new IllegalStateException(errmsg, e));
+                onErrorImpl(errmsg, e);
         }
     }
-    
-    protected void onLoadMementoFailure(String msg, Exception e) {
-        Exceptions.propagateIfFatal(e);
-        String errmsg = "problem loading memento: "+msg;
-        exceptions.add(new IllegalStateException(errmsg, e));
-        onErrorImpl(errmsg, e);
-    }
 
     @Override
     public Entity onDanglingEntityRef(String id) {
@@ -203,151 +168,51 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler {
     }
 
     @Override
-    public void onCreateLocationFailed(String id, String type, Exception e) {
-        Exceptions.propagateIfFatal(e);
-        String errmsg = "problem creating location "+id+" of type "+type;
-        creationFailedLocations.add(id);
-        exceptions.add(new IllegalStateException(errmsg, e));
-        onErrorImpl(errmsg, e);
-    }
-
-    @Override
-    public void onCreateEntityFailed(String id, String type, Exception e) {
-        Exceptions.propagateIfFatal(e);
-        String errmsg = "problem creating entity "+id+" of type "+type;
-        creationFailedEntities.add(id);
-        exceptions.add(new IllegalStateException(errmsg, e));
-        onErrorImpl(errmsg, e);
-    }
-
-
-    @Override
-    public void onCreatePolicyFailed(String id, String type, Exception e) {
+    public void onCreateFailed(BrooklynObjectType type, String id, String instanceType, Exception e) {
         Exceptions.propagateIfFatal(e);
-        String errmsg = "problem creating policy "+id+" of type "+type;
-        creationFailedPolicies.add(id);
+        String errmsg = "problem creating "+type+" "+id+" of type "+instanceType;
+        creationFailedIds.add(id);
         exceptions.add(new IllegalStateException(errmsg, e));
         onErrorImpl(errmsg, e);
     }
-    
-    @Override
-    public void onCreateEnricherFailed(String id, String type, Exception e) {
-        Exceptions.propagateIfFatal(e);
-        String errmsg = "problem creating policy "+id+" of type "+type;
-        creationFailedEnrichers.add(id);
-        exceptions.add(new IllegalStateException(errmsg, e));
-        onErrorImpl(errmsg, e);
-    }
-
-    @Override
-    public void onLocationNotFound(String id) {
-        if (creationFailedLocations.contains(id)) {
-            // already know about this; ignore
-        } else {
-            String errmsg = "location '"+id+"' not found";
-            exceptions.add(new IllegalStateException(errmsg));
-            onErrorImpl(errmsg);
-        }
-    }
-    
-    @Override
-    public void onEntityNotFound(String id) {
-        if (creationFailedEntities.contains(id)) {
-            // already know about this; ignore
-        } else {
-            String errmsg = "entity '"+id+"' not found";
-            exceptions.add(new IllegalStateException(errmsg));
-            onErrorImpl(errmsg);
-        }
-    }
 
     @Override
-    public void onPolicyNotFound(String id) {
-        onPolicyNotFound(id, null);
-    }
-    
-    @Override
-    public void onPolicyNotFound(String id, String context) {
-        if (creationFailedPolicies.contains(id)) {
+    public void onNotFound(BrooklynObjectType type, String id) {
+        if (creationFailedIds.contains(id)) {
             // already know about this; ignore
         } else {
-            String errmsg = "policy '"+id+"' not found" + (context == null ? "" : "("+context+")");
+            String errmsg = type+" '"+id+"' not found";
             exceptions.add(new IllegalStateException(errmsg));
             onErrorImpl(errmsg);
         }
     }
-
-    @Override
-    public void onEnricherNotFound(String id) {
-        onEnricherNotFound(id, null);
-    }
     
     @Override
-    public void onEnricherNotFound(String id, String context) {
-        if (creationFailedEnrichers.contains(id)) {
-            // already know about this; ignore
-        } else {
-            String errmsg = "enricher '"+id+"' not found" + (context == null ? "" : "("+context+")");
-            exceptions.add(new IllegalStateException(errmsg));
-            onErrorImpl(errmsg);
-        }
-    }
-
-    @Override
-    public void onRebindLocationFailed(Location location, Exception e) {
-        Exceptions.propagateIfFatal(e);
-        String errmsg = "problem rebinding location "+location.getId()+" ("+location+")";
-        
-        exceptions.add(new IllegalStateException(errmsg, e));
-        onErrorImpl(errmsg, e);
-    }
-
-    @Override
-    public void onRebindEntityFailed(Entity entity, Exception e) {
-        Exceptions.propagateIfFatal(e);
-        String errmsg = "problem rebinding entity "+entity.getId()+" ("+entity+")";
-        
-        exceptions.add(new IllegalStateException(errmsg, e));
-        onErrorImpl(errmsg, e);
-    }
-
-    @Override
-    public void onRebindPolicyFailed(Policy policy, Exception e) {
+    public void onRebindFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
         Exceptions.propagateIfFatal(e);
-        String errmsg = "problem rebinding plicy "+policy.getId()+" ("+policy+")";
+        String errmsg = "problem rebinding "+type+" "+instance.getId()+" ("+instance+")";
         
-        switch (addPolicyFailureMode) {
-        case FAIL_FAST:
-            throw new IllegalStateException("Rebind: aborting due to "+errmsg, e);
-        case FAIL_AT_END:
-            addPolicyFailures.add(new IllegalStateException(errmsg, e));
-            break;
-        case CONTINUE:
-            LOG.warn(errmsg+"; continuing", e);
-            creationFailedPolicies.add(policy.getId());
+        switch (type) {
+        case ENRICHER:
+        case POLICY:
+            switch (addPolicyFailureMode) {
+            case FAIL_FAST:
+                throw new IllegalStateException("Rebind: aborting due to "+errmsg, e);
+            case FAIL_AT_END:
+                addPolicyFailures.add(new IllegalStateException(errmsg, e));
+                break;
+            case CONTINUE:
+                LOG.warn(errmsg+"; continuing", e);
+                creationFailedIds.add(instance.getId());
+                break;
+            default:
+                throw new IllegalStateException("Unexpected state '"+addPolicyFailureMode+"' for addPolicyFailureMode");
+            }
             break;
         default:
-            throw new IllegalStateException("Unexpected state '"+addPolicyFailureMode+"' for addPolicyFailureMode");
-        }
-    }
-
-    @Override
-    public void onRebindEnricherFailed(Enricher enricher, Exception e) {
-        Exceptions.propagateIfFatal(e);
-        String errmsg = "problem rebinding enricher "+enricher.getId()+" ("+enricher+")";
-        
-        switch (addPolicyFailureMode) {
-        case FAIL_FAST:
-            throw new IllegalStateException("Rebind: aborting due to "+errmsg, e);
-        case FAIL_AT_END:
-            addPolicyFailures.add(new IllegalStateException(errmsg, e));
+            exceptions.add(new IllegalStateException(errmsg, e));
+            onErrorImpl(errmsg, e);
             break;
-        case CONTINUE:
-            LOG.warn(errmsg+"; continuing", e);
-            creationFailedEnrichers.add(enricher.getId());
-            break;
-        default:
-            throw new IllegalStateException("Unexpected state '"+addPolicyFailureMode+"' for addPolicyFailureMode");
         }
     }
 
@@ -390,23 +255,14 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler {
     }
 
     @Override
-    public void onManageLocationFailed(Location location, Exception e) {
+    public void onManageFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
         Exceptions.propagateIfFatal(e);
-        String errmsg = "problem managing location "+location.getId()+" ("+location+")";
+        String errmsg = "problem managing "+type+" "+instance.getId()+" ("+instance+")";
         
         exceptions.add(new IllegalStateException(errmsg, e));
         onErrorImpl(errmsg, e);
     }
 
-    @Override
-    public void onManageEntityFailed(Entity entity, Exception e) {
-        Exceptions.propagateIfFatal(e);
-        String errmsg = "problem managing entity "+entity.getId()+" ("+entity+")";
-        
-        exceptions.add(new IllegalStateException(errmsg, e));
-        onErrorImpl(errmsg, e);
-    }
-    
     protected void onErrorImpl(String errmsg) {
         onErrorImpl(errmsg, null);
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
index 34a529e..2bd121c 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -23,7 +23,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -40,7 +39,6 @@ import brooklyn.entity.basic.AbstractEntity;
 import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityInternal;
-import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.proxying.InternalEntityFactory;
 import brooklyn.entity.proxying.InternalFactory;
 import brooklyn.entity.proxying.InternalLocationFactory;
@@ -316,7 +314,7 @@ public class RebindManagerImpl implements RebindManager {
                     locations.put(locId, location);
                     rebindContext.registerLocation(locId, location);
                 } catch (Exception e) {
-                    exceptionHandler.onCreateLocationFailed(locId, locType, e);
+                    exceptionHandler.onCreateFailed(BrooklynObjectType.LOCATION, locId, locType, e);
                 }
             }
             
@@ -332,7 +330,7 @@ public class RebindManagerImpl implements RebindManager {
                     entities.put(entityId, entity);
                     rebindContext.registerEntity(entityId, entity);
                 } catch (Exception e) {
-                    exceptionHandler.onCreateEntityFailed(entityId, entityType, e);
+                    exceptionHandler.onCreateFailed(BrooklynObjectType.ENTITY, entityId, entityType, e);
                 }
             }
             
@@ -349,7 +347,7 @@ public class RebindManagerImpl implements RebindManager {
                         policies.put(policyMemento.getId(), policy);
                         rebindContext.registerPolicy(policyMemento.getId(), policy);
                     } catch (Exception e) {
-                        exceptionHandler.onCreatePolicyFailed(policyMemento.getId(), policyMemento.getType(), e);
+                        exceptionHandler.onCreateFailed(BrooklynObjectType.POLICY, policyMemento.getId(), policyMemento.getType(), e);
                     }
                 }
             } else {
@@ -367,7 +365,7 @@ public class RebindManagerImpl implements RebindManager {
                         enrichers.put(enricherMemento.getId(), enricher);
                         rebindContext.registerEnricher(enricherMemento.getId(), enricher);
                     } catch (Exception e) {
-                        exceptionHandler.onCreateEnricherFailed(enricherMemento.getId(), enricherMemento.getType(), e);
+                        exceptionHandler.onCreateFailed(BrooklynObjectType.ENRICHER, enricherMemento.getId(), enricherMemento.getType(), e);
                     }
                 }
             } else {
@@ -385,12 +383,12 @@ public class RebindManagerImpl implements RebindManager {
                 if (LOG.isDebugEnabled()) LOG.debug("RebindManager reconstructing location {}", locMemento);
                 if (location == null) {
                     // usually because of creation-failure, when not using fail-fast
-                    exceptionHandler.onLocationNotFound(locMemento.getId());
+                    exceptionHandler.onNotFound(BrooklynObjectType.LOCATION, locMemento.getId());
                 } else {
                     try {
                         ((LocationInternal)location).getRebindSupport().reconstruct(rebindContext, locMemento);
                     } catch (Exception e) {
-                        exceptionHandler.onRebindLocationFailed(location, e);
+                        exceptionHandler.onRebindFailed(BrooklynObjectType.LOCATION, location, e);
                     }
                 }
             }
@@ -404,12 +402,12 @@ public class RebindManagerImpl implements RebindManager {
     
                     if (policy == null) {
                         // usually because of creation-failure, when not using fail-fast
-                        exceptionHandler.onPolicyNotFound(policyMemento.getId());
+                        exceptionHandler.onNotFound(BrooklynObjectType.POLICY, policyMemento.getId());
                     } else {
                         try {
                             policy.getRebindSupport().reconstruct(rebindContext, policyMemento);
                         } catch (Exception e) {
-                            exceptionHandler.onRebindPolicyFailed(policy, e);
+                            exceptionHandler.onRebindFailed(BrooklynObjectType.POLICY, policy, e);
                             rebindContext.unregisterPolicy(policy);
                         }
                     }
@@ -425,12 +423,12 @@ public class RebindManagerImpl implements RebindManager {
         
                     if (enricher == null) {
                         // usually because of creation-failure, when not using fail-fast
-                        exceptionHandler.onEnricherNotFound(enricherMemento.getId());
+                        exceptionHandler.onNotFound(BrooklynObjectType.ENRICHER, enricherMemento.getId());
                     } else {
                         try {
                             enricher.getRebindSupport().reconstruct(rebindContext, enricherMemento);
                         } catch (Exception e) {
-                            exceptionHandler.onRebindEnricherFailed(enricher, e);
+                            exceptionHandler.onRebindFailed(BrooklynObjectType.ENRICHER, enricher, e);
                             rebindContext.unregisterEnricher(enricher);
                         }
                     }
@@ -446,13 +444,13 @@ public class RebindManagerImpl implements RebindManager {
     
                 if (entity == null) {
                     // usually because of creation-failure, when not using fail-fast
-                    exceptionHandler.onEntityNotFound(entityMemento.getId());
+                    exceptionHandler.onNotFound(BrooklynObjectType.ENTITY, entityMemento.getId());
                 } else {
                     try {
                         entityMemento.injectTypeClass(entity.getClass());
                         ((EntityInternal)entity).getRebindSupport().reconstruct(rebindContext, entityMemento);
                     } catch (Exception e) {
-                        exceptionHandler.onRebindEntityFailed(entity, e);
+                        exceptionHandler.onRebindFailed(BrooklynObjectType.ENTITY, entity, e);
                     }
                 }
             }
@@ -469,14 +467,14 @@ public class RebindManagerImpl implements RebindManager {
     
                 if (entity == null) {
                     // usually because of creation-failure, when not using fail-fast
-                    exceptionHandler.onEntityNotFound(entityMemento.getId());
+                    exceptionHandler.onNotFound(BrooklynObjectType.ENTITY, entityMemento.getId());
                 } else {
                     try {
                         entityMemento.injectTypeClass(entity.getClass());
                         ((EntityInternal)entity).getRebindSupport().addPolicies(rebindContext, entityMemento);
                         ((EntityInternal)entity).getRebindSupport().addEnrichers(rebindContext, entityMemento);
                     } catch (Exception e) {
-                        exceptionHandler.onRebindEntityFailed(entity, e);
+                        exceptionHandler.onRebindFailed(BrooklynObjectType.ENTITY, entity, e);
                     }
                 }
             }
@@ -493,7 +491,7 @@ public class RebindManagerImpl implements RebindManager {
                     try {
                         managementContext.getLocationManager().manage(location);
                     } catch (Exception e) {
-                        exceptionHandler.onManageLocationFailed(location, e);
+                        exceptionHandler.onManageFailed(BrooklynObjectType.LOCATION, location, e);
                     }
                 }
             }
@@ -505,12 +503,12 @@ public class RebindManagerImpl implements RebindManager {
                 Entity entity = rebindContext.getEntity(appId);
                 if (entity == null) {
                     // usually because of creation-failure, when not using fail-fast
-                    exceptionHandler.onEntityNotFound(appId);
+                    exceptionHandler.onNotFound(BrooklynObjectType.ENTITY, appId);
                 } else {
                     try {
                         Entities.startManagement((Application)entity, managementContext);
                     } catch (Exception e) {
-                        exceptionHandler.onManageEntityFailed(entity, e);
+                        exceptionHandler.onManageFailed(BrooklynObjectType.ENTITY, entity, e);
                     }
                     apps.add((Application)entity);
                 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java
index 87e18a0..732b7ce 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java
@@ -29,6 +29,7 @@ import brooklyn.mementos.BrooklynMemento;
 import brooklyn.mementos.EnricherMemento;
 import brooklyn.mementos.EntityMemento;
 import brooklyn.mementos.LocationMemento;
+import brooklyn.mementos.Memento;
 import brooklyn.mementos.PolicyMemento;
 
 import com.google.common.collect.ImmutableList;
@@ -64,6 +65,19 @@ public class BrooklynMementoImpl implements BrooklynMemento, Serializable {
         public Builder topLevelLocationIds(List<String> vals) {
             topLevelLocationIds.addAll(vals); return this;
         }
+        public void memento(Memento memento) {
+            if (memento instanceof EntityMemento) {
+                entity((EntityMemento)memento);
+            } else if (memento instanceof LocationMemento) {
+                location((LocationMemento)memento);
+            } else if (memento instanceof PolicyMemento) {
+                policy((PolicyMemento)memento);
+            } else if (memento instanceof EnricherMemento) {
+                enricher((EnricherMemento)memento);
+            } else {
+                throw new IllegalStateException("Unexpected memento type :"+memento);
+            }
+        }
         public Builder entities(Map<String, EntityMemento> vals) {
             entities.putAll(vals); return this;
         }
@@ -77,7 +91,11 @@ public class BrooklynMementoImpl implements BrooklynMemento, Serializable {
             enrichers.put(val.getId(), val); return this;
         }
         public Builder entity(EntityMemento val) {
-            entities.put(val.getId(), val); return this;
+            entities.put(val.getId(), val);
+            if (val.isTopLevelApp()) {
+                applicationId(val.getId());
+            }
+            return this;
         }
         public Builder location(LocationMemento val) {
             locations.put(val.getId(), val); return this;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToFile.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToFile.java
index 5761215..68dd6eb 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToFile.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToFile.java
@@ -42,6 +42,7 @@ import com.google.common.io.Files;
  * @deprecated since 0.7.0 use BrooklynMementoPersisterToMultiFile instead; the single-file version
  *             has not been tested recently or kept up-to-date. 
  */
+@Deprecated
 public class BrooklynMementoPersisterToFile extends AbstractBrooklynMementoPersister {
 
     // FIXME This is no longer used (instead we use ToMultiFile).

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
index 935d52d..e587964 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
@@ -32,6 +32,7 @@ import java.util.concurrent.TimeoutException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.entity.rebind.BrooklynObjectType;
 import brooklyn.entity.rebind.PersistenceExceptionHandler;
 import brooklyn.entity.rebind.RebindExceptionHandler;
 import brooklyn.entity.rebind.dto.BrooklynMementoImpl;
@@ -60,6 +61,7 @@ import com.google.common.util.concurrent.MoreExecutors;
  * it has a multi-file filesystem backend for equivalent functionality, but is pluggable
  * to support other storage backends 
  */
+@Deprecated
 public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersister {
 
     private static final Logger LOG = LoggerFactory.getLogger(BrooklynMementoPersisterToMultiFile.class);
@@ -158,7 +160,7 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
             enricherFiles = enrichersDir.listFiles(fileFilter);
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
-            exceptionHandler.onLoadBrooklynMementoFailed("Failed to list files", e);
+            exceptionHandler.onLoadMementoFailed(BrooklynObjectType.UNKNOWN, "Failed to list files", e);
             throw new IllegalStateException("Failed to list memento files in "+dir, e);
         }
         
@@ -175,7 +177,7 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
                     String type = (String) XmlUtil.xpath(contents, "/entity/type");
                     builder.entity(id, type);
                 } catch (Exception e) {
-                    exceptionHandler.onLoadEntityMementoFailed("File "+file, e);
+                    exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENTITY, "File "+file, e);
                 }
             }
             for (File file : locationFiles) {
@@ -185,7 +187,7 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
                     String type = (String) XmlUtil.xpath(contents, "/location/type");
                     builder.location(id, type);
                 } catch (Exception e) {
-                    exceptionHandler.onLoadLocationMementoFailed("File "+file, e);
+                    exceptionHandler.onLoadMementoFailed(BrooklynObjectType.LOCATION, "File "+file, e);
                 }
             }
             for (File file : policyFiles) {
@@ -195,7 +197,7 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
                     String type = (String) XmlUtil.xpath(contents, "/policy/type");
                     builder.policy(id, type);
                 } catch (Exception e) {
-                    exceptionHandler.onLoadPolicyMementoFailed("File "+file, e);
+                    exceptionHandler.onLoadMementoFailed(BrooklynObjectType.POLICY, "File "+file, e);
                 }
             }
             for (File file : enricherFiles) {
@@ -205,7 +207,7 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
                     String type = (String) XmlUtil.xpath(contents, "/enricher/type");
                     builder.enricher(id, type);
                 } catch (Exception e) {
-                    exceptionHandler.onLoadEnricherMementoFailed("File "+file, e);
+                    exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENRICHER, "File "+file, e);
                 }
             }
             
@@ -241,7 +243,7 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
             enricherFiles = enrichersDir.listFiles(fileFilter);
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
-            exceptionHandler.onLoadBrooklynMementoFailed("Failed to list files", e);
+            exceptionHandler.onLoadMementoFailed(BrooklynObjectType.UNKNOWN, "Failed to list files", e);
             throw new IllegalStateException("Failed to list memento files in "+dir, e);
         }
 
@@ -264,7 +266,7 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
                         }
                     }
                 } catch (Exception e) {
-                    exceptionHandler.onLoadEntityMementoFailed("File "+file, e);
+                    exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENTITY, "File "+file, e);
                 }
             }
             for (File file : locationFiles) {
@@ -276,7 +278,7 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
                         builder.location(memento);
                     }
                 } catch (Exception e) {
-                    exceptionHandler.onLoadLocationMementoFailed("File "+file, e);
+                    exceptionHandler.onLoadMementoFailed(BrooklynObjectType.LOCATION, "File "+file, e);
                 }
             }
             for (File file : policyFiles) {
@@ -288,7 +290,7 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
                         builder.policy(memento);
                     }
                 } catch (Exception e) {
-                    exceptionHandler.onLoadPolicyMementoFailed("File "+file, e);
+                    exceptionHandler.onLoadMementoFailed(BrooklynObjectType.POLICY, "File "+file, e);
                 }
             }
             for (File file : enricherFiles) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
index 749ae8f..838f252 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
@@ -38,6 +38,7 @@ import org.slf4j.LoggerFactory;
 import brooklyn.config.BrooklynProperties;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.ConfigKeys;
+import brooklyn.entity.rebind.BrooklynObjectType;
 import brooklyn.entity.rebind.PeriodicDeltaChangeListener;
 import brooklyn.entity.rebind.PersistenceExceptionHandler;
 import brooklyn.entity.rebind.PersisterDeltaImpl;
@@ -179,7 +180,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
             enricherSubPathList = objectStore.listContentsWithSubPath("enrichers");
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
-            exceptionHandler.onLoadBrooklynMementoFailed("Failed to list files", e);
+            exceptionHandler.onLoadMementoFailed(BrooklynObjectType.UNKNOWN, "Failed to list files", e);
             throw new IllegalStateException("Failed to list memento files in "+objectStore, e);
         }
 
@@ -203,7 +204,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
                         builder.entity(id, type);
                     } catch (Exception e) {
                         Exceptions.propagateIfFatal(e);
-                        exceptionHandler.onLoadEntityMementoFailed("Memento "+subPath, e);
+                        exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENTITY, "Memento "+subPath, e);
                     }
                 }}));
         }
@@ -217,7 +218,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
                         builder.location(id, type);
                     } catch (Exception e) {
                         Exceptions.propagateIfFatal(e);
-                        exceptionHandler.onLoadLocationMementoFailed("Memento "+subPath, e);
+                        exceptionHandler.onLoadMementoFailed(BrooklynObjectType.LOCATION, "Memento "+subPath, e);
                     }
                 }}));
         }
@@ -231,7 +232,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
                         builder.policy(id, type);
                     } catch (Exception e) {
                         Exceptions.propagateIfFatal(e);
-                        exceptionHandler.onLoadPolicyMementoFailed("Memento "+subPath, e);
+                        exceptionHandler.onLoadMementoFailed(BrooklynObjectType.POLICY, "Memento "+subPath, e);
                     }
                 }}));
         }
@@ -245,7 +246,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
                         builder.enricher(id, type);
                     } catch (Exception e) {
                         Exceptions.propagateIfFatal(e);
-                        exceptionHandler.onLoadEnricherMementoFailed("Memento "+subPath, e);
+                        exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENRICHER, "Memento "+subPath, e);
                     }
                 }}));
         }
@@ -313,7 +314,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
             enricherSubPathList = objectStore.listContentsWithSubPath("enrichers");
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
-            exceptionHandler.onLoadBrooklynMementoFailed("Failed to list files", e);
+            exceptionHandler.onLoadMementoFailed(BrooklynObjectType.UNKNOWN, "Failed to list files", e);
             throw new IllegalStateException("Failed to list memento files in "+objectStore+": "+e, e);
         }
         
@@ -325,72 +326,40 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
         serializer.setLookupContext(lookupContext);
         
         List<ListenableFuture<?>> futures = Lists.newArrayList();
-        
+
+        class MementoLoader implements Runnable {
+            private final String subPath;
+            private final BrooklynObjectType type;
+            public MementoLoader(String subPath, BrooklynObjectType type) {
+                this.subPath = subPath;
+                this.type = type;
+            }
+            public void run() {
+                try {
+                    Memento memento = (Memento) serializer.fromString(read(subPath));
+                    if (memento == null) {
+                        LOG.warn("No "+type.toString().toLowerCase()+"-memento deserialized from " + subPath + "; ignoring and continuing");
+                    } else {
+                        builder.memento(memento);
+                    }
+                } catch (Exception e) {
+                    exceptionHandler.onLoadMementoFailed(type, "Memento "+subPath, e);
+                }
+            }
+        }
+
         try {
             for (final String subPath : entitySubPathList) {
-                futures.add(executor.submit(new Runnable() {
-                    public void run() {
-                        try {
-                            EntityMemento memento = (EntityMemento) serializer.fromString(read(subPath));
-                            if (memento == null) {
-                                LOG.warn("No entity-memento deserialized from " + subPath + "; ignoring and continuing");
-                            } else {
-                                builder.entity(memento);
-                                if (memento.isTopLevelApp()) {
-                                    builder.applicationId(memento.getId());
-                                }
-                            }
-                        } catch (Exception e) {
-                            exceptionHandler.onLoadEntityMementoFailed("Memento "+subPath, e);
-                        }
-                    }}));
+                futures.add(executor.submit(new MementoLoader(subPath, BrooklynObjectType.ENTITY)));
             }
             for (final String subPath : locationSubPathList) {
-                futures.add(executor.submit(new Runnable() {
-                    public void run() {
-                        try {
-                            LocationMemento memento = (LocationMemento) serializer.fromString(read(subPath));
-                            if (memento == null) {
-                                LOG.warn("No location-memento deserialized from " + subPath + "; ignoring and continuing");
-                            } else {
-                                builder.location(memento);
-                            }
-                        } catch (Exception e) {
-                            exceptionHandler.onLoadLocationMementoFailed("Memento "+subPath, e);
-                        }
-                    }}));
+                futures.add(executor.submit(new MementoLoader(subPath, BrooklynObjectType.LOCATION)));
             }
             for (final String subPath : policySubPathList) {
-                futures.add(executor.submit(new Runnable() {
-                    public void run() {
-                        try {
-                            StoreObjectAccessor objectAccessor = objectStore.newAccessor(subPath);
-                            PolicyMemento memento = (PolicyMemento) serializer.fromString(objectAccessor.get());
-                            if (memento == null) {
-                                LOG.warn("No policy-memento deserialized from " + subPath + "; ignoring and continuing");
-                            } else {
-                                builder.policy(memento);
-                            }
-                        } catch (Exception e) {
-                            exceptionHandler.onLoadPolicyMementoFailed("Memento "+subPath, e);
-                        }
-                    }}));
+                futures.add(executor.submit(new MementoLoader(subPath, BrooklynObjectType.POLICY)));
             }
             for (final String subPath : enricherSubPathList) {
-                futures.add(executor.submit(new Runnable() {
-                    public void run() {
-                        try {
-                            StoreObjectAccessor objectAccessor = objectStore.newAccessor(subPath);
-                            EnricherMemento memento = (EnricherMemento) serializer.fromString(objectAccessor.get());
-                            if (memento == null) {
-                                LOG.warn("No enricher-memento deserialized from " + subPath + "; ignoring and continuing");
-                            } else {
-                                builder.enricher(memento);
-                            }
-                        } catch (Exception e) {
-                            exceptionHandler.onLoadEnricherMementoFailed("Memento "+subPath, e);
-                        }
-                    }}));
+                futures.add(executor.submit(new MementoLoader(subPath, BrooklynObjectType.ENRICHER)));
             }
             
             try {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java b/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java
index 4ab5f00..1fe4007 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RebindFailuresTest.java
@@ -40,6 +40,7 @@ import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.rebind.RebindEntityTest.MyEntity;
 import brooklyn.entity.rebind.RebindEntityTest.MyEntityImpl;
 import brooklyn.entity.rebind.RebindManager.RebindFailureMode;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.event.AttributeSensor;
 import brooklyn.management.EntityManager;
 import brooklyn.management.internal.LocalManagementContext;
@@ -101,10 +102,10 @@ public class RebindFailuresTest extends RebindTestFixtureWithApp {
         }
 
         // exception handler should have been told about failure
-        assertEquals(toEntityIds(exceptionHandler.rebindEntityFailures.keySet()), ImmutableSet.of(origFailingE.getId()));
+        assertEquals(toIds(exceptionHandler.rebindFailures.keySet()), ImmutableSet.of(origFailingE.getId()));
 
         // Expect that on failure will have continued with rebind, and then report all problems
-        assertEquals(toEntityIds(newEntityManager.getEntities()), ImmutableSet.of(origApp.getId(), origFailingE.getId()));
+        assertEquals(toIds(newEntityManager.getEntities()), ImmutableSet.of(origApp.getId(), origFailingE.getId()));
     }
     
     @Test
@@ -127,10 +128,10 @@ public class RebindFailuresTest extends RebindTestFixtureWithApp {
         }
 
         // exception handler should have been told about failure
-        assertEquals(toEntityIds(exceptionHandler.rebindEntityFailures.keySet()), ImmutableSet.of(origFailingE.getId()));
+        assertEquals(toIds(exceptionHandler.rebindFailures.keySet()), ImmutableSet.of(origFailingE.getId()));
         
         // entities will not have been managed
-        assertEquals(toEntityIds(newEntityManager.getEntities()), ImmutableSet.of());
+        assertEquals(toIds(newEntityManager.getEntities()), ImmutableSet.of());
     }
     
     @Test
@@ -148,10 +149,10 @@ public class RebindFailuresTest extends RebindTestFixtureWithApp {
         newApp = rebind(newManagementContext, exceptionHandler);
 
         // exception handler should have been told about failure
-        assertEquals(toEntityIds(exceptionHandler.rebindEntityFailures.keySet()), ImmutableSet.of(origFailingE.getId()));
+        assertEquals(toIds(exceptionHandler.rebindFailures.keySet()), ImmutableSet.of(origFailingE.getId()));
         
         // TODO How should brooklyn indicate that this entity's rebind failed? What can we assert?
-        assertEquals(toEntityIds(newEntityManager.getEntities()), ImmutableSet.of(origApp.getId(), origFailingE.getId()));
+        assertEquals(toIds(newEntityManager.getEntities()), ImmutableSet.of(origApp.getId(), origFailingE.getId()));
     }
     
     @Test
@@ -203,8 +204,8 @@ public class RebindFailuresTest extends RebindTestFixtureWithApp {
         assertFalse(newEnricher.isPresent(), "enricher="+newEnricher);
     }
 
-    private Set<String> toEntityIds(Iterable<? extends Entity> entities) {
-        return ImmutableSet.copyOf(Iterables.transform(entities, EntityFunctions.id()));
+    private Set<String> toIds(Iterable<? extends Identifiable> instances) {
+        return ImmutableSet.copyOf(Iterables.transform(instances, EntityFunctions.id()));
     }
     
     public static class MyPolicyFailingImpl extends AbstractPolicy {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cbb6e40c/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java b/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
index 378c39d..f9dbe78 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RecordingRebindExceptionHandler.java
@@ -22,8 +22,8 @@ import java.util.List;
 import java.util.Map;
 
 import brooklyn.entity.Entity;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.location.Location;
-import brooklyn.policy.Policy;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -31,17 +31,10 @@ import com.google.common.collect.Maps;
 public class RecordingRebindExceptionHandler extends RebindExceptionHandlerImpl {
 
     protected final List<Exception> loadMementoFailures = Lists.newArrayList();
-    protected final Map<String, Exception> createLocationFailures = Maps.newLinkedHashMap();
-    protected final Map<String, Exception> createEntityFailures = Maps.newLinkedHashMap();
-    protected final Map<String, Exception> createPolicyFailures = Maps.newLinkedHashMap();
-    protected final Map<Location, Exception> rebindLocationFailures = Maps.newLinkedHashMap();
-    protected final Map<Entity, Exception> rebindEntityFailures = Maps.newLinkedHashMap();
-    protected final Map<Policy, Exception> rebindPolicyFailures = Maps.newLinkedHashMap();
-    protected final Map<Location, Exception> manageLocationFailures = Maps.newLinkedHashMap();
-    protected final Map<Entity, Exception> manageEntityFailures = Maps.newLinkedHashMap();
-    protected final Map<String, Exception> locationNotFoundFailures = Maps.newLinkedHashMap();
-    protected final Map<String, Exception> entityNotFoundFailures = Maps.newLinkedHashMap();
-    protected final Map<String, Exception> policyNotFoundFailures = Maps.newLinkedHashMap();
+    protected final Map<String, Exception> createFailures = Maps.newLinkedHashMap();
+    protected final Map<Identifiable, Exception> rebindFailures = Maps.newLinkedHashMap();
+    protected final Map<Identifiable, Exception> manageFailures = Maps.newLinkedHashMap();
+    protected final Map<String, Exception> notFoundFailures = Maps.newLinkedHashMap();
     protected Exception failed;
     
     public RecordingRebindExceptionHandler(RebindManager.RebindFailureMode danglingRefFailureMode, RebindManager.RebindFailureMode rebindFailureMode) {
@@ -49,33 +42,9 @@ public class RecordingRebindExceptionHandler extends RebindExceptionHandlerImpl
     }
 
     @Override
-    public void onLoadBrooklynMementoFailed(String msg, Exception e) {
-        loadMementoFailures.add(new IllegalStateException("problem loading mementos: "+msg, e));
-        super.onLoadBrooklynMementoFailed(msg, e);
-    }
-    
-    @Override
-    public void onLoadLocationMementoFailed(String msg, Exception e) {
-        loadMementoFailures.add(new IllegalStateException("problem loading mementos: "+msg, e));
-        super.onLoadLocationMementoFailed(msg, e);
-    }
-    
-    @Override
-    public void onLoadEntityMementoFailed(String msg, Exception e) {
-        loadMementoFailures.add(new IllegalStateException("problem loading mementos: "+msg, e));
-        super.onLoadEntityMementoFailed(msg, e);
-    }
-    
-    @Override
-    public void onLoadPolicyMementoFailed(String msg, Exception e) {
-        loadMementoFailures.add(new IllegalStateException("problem loading mementos: "+msg, e));
-        super.onLoadPolicyMementoFailed(msg, e);
-    }
-
-    @Override
-    public void onLoadEnricherMementoFailed(String msg, Exception e) {
-        loadMementoFailures.add(new IllegalStateException("problem loading mementos: "+msg, e));
-        super.onLoadPolicyMementoFailed(msg, e);
+    public void onLoadMementoFailed(BrooklynObjectType type, String msg, Exception e) {
+        loadMementoFailures.add(new IllegalStateException("problem loading "+type+" memento: "+msg, e));
+        super.onLoadMementoFailed(type, msg, e);
     }
     
     @Override
@@ -89,72 +58,30 @@ public class RecordingRebindExceptionHandler extends RebindExceptionHandlerImpl
     }
 
     @Override
-    public void onCreateLocationFailed(String id, String type, Exception e) {
-        createLocationFailures.put(id, new IllegalStateException("problem creating location "+id+" of type "+type, e));
-        super.onCreateLocationFailed(id, type, e);
-    }
-
-    @Override
-    public void onCreateEntityFailed(String id, String type, Exception e) {
-        createEntityFailures.put(id, new IllegalStateException("problem creating entity "+id+" of type "+type, e));
-        super.onCreateEntityFailed(id, type, e);
+    public void onCreateFailed(BrooklynObjectType type, String id, String instanceType, Exception e) {
+        createFailures.put(id, new IllegalStateException("problem creating location "+id+" of type "+instanceType, e));
+        super.onCreateFailed(type, id, instanceType, e);
     }
 
     @Override
-    public void onCreatePolicyFailed(String id, String type, Exception e) {
-        createPolicyFailures.put(id, new IllegalStateException("problem creating policy "+id+" of type "+type, e));
-        super.onCreatePolicyFailed(id, type, e);
-    }
-
-    @Override
-    public void onLocationNotFound(String id) {
-        locationNotFoundFailures.put(id, new IllegalStateException("location '"+id+"' not found"));
-        super.onLocationNotFound(id);
-    }
-    
-    @Override
-    public void onEntityNotFound(String id) {
-        entityNotFoundFailures.put(id, new IllegalStateException("entity '"+id+"' not found"));
-        super.onEntityNotFound(id);
+    public void onNotFound(BrooklynObjectType type, String id) {
+        notFoundFailures.put(id, new IllegalStateException(type+" '"+id+"' not found"));
+        super.onNotFound(type, id);
     }
     
     @Override
-    public void onPolicyNotFound(String id) {
-        locationNotFoundFailures.put(id, new IllegalStateException("policy'"+id+"' not found"));
-        super.onPolicyNotFound(id);
-    }
-
-    @Override
-    public void onRebindLocationFailed(Location location, Exception e) {
-        rebindLocationFailures.put(location, new IllegalStateException("problem rebinding location "+location.getId()+" ("+location+")", e));
-        super.onRebindLocationFailed(location, e);
-    }
-
-    @Override
-    public void onRebindEntityFailed(Entity entity, Exception e) {
-        rebindEntityFailures.put(entity, new IllegalStateException("problem rebinding entity "+entity.getId()+" ("+entity+")", e));
-        super.onRebindEntityFailed(entity, e);
-    }
-
-    @Override
-    public void onRebindPolicyFailed(Policy policy, Exception e) {
-        rebindPolicyFailures.put(policy, new IllegalStateException("problem rebinding plicy "+policy.getId()+" ("+policy+")", e));
-        super.onRebindPolicyFailed(policy, e);
+    public void onRebindFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
+        rebindFailures.put(instance, new IllegalStateException("problem rebinding "+type+" "+instance.getId()+" ("+instance+")", e));
+        super.onRebindFailed(type, instance, e);
     }
 
     @Override
-    public void onManageLocationFailed(Location location, Exception e) {
-        manageLocationFailures.put(location, new IllegalStateException("problem managing location "+location.getId()+" ("+location+")", e));
-        super.onManageLocationFailed(location, e);
+    public void onManageFailed(BrooklynObjectType type, Identifiable instance, Exception e) {
+        manageFailures.put(instance, new IllegalStateException("problem managing "+type+" "+instance.getId()+" ("+instance+")", e));
+        super.onManageFailed(type, instance, e);
     }
 
     @Override
-    public void onManageEntityFailed(Entity entity, Exception e) {
-        manageEntityFailures.put(entity, new IllegalStateException("problem managing entity "+entity.getId()+" ("+entity+")", e));
-        super.onManageEntityFailed(entity, e);
-    }
-    
-    @Override
     public void onDone() {
         super.onDone();
     }


[8/8] git commit: rat should ignore .repository (which is used by jenkins-mvn for instance)

Posted by he...@apache.org.
rat should ignore .repository (which is used by jenkins-mvn for instance)


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/8b5d48ac
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/8b5d48ac
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/8b5d48ac

Branch: refs/heads/master
Commit: 8b5d48ac225029d794de745b51b068937bb53055
Parents: 491eb60
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Aug 1 16:08:55 2014 -0400
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Aug 1 16:12:17 2014 -0400

----------------------------------------------------------------------
 pom.xml | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/8b5d48ac/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ec3b713..75c8581 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1033,6 +1033,7 @@
                   <!-- see https://issues.apache.org/jira/browse/RAT-107 -->
                   <exclude>**/.git/**</exclude>
                   <exclude>**/.gitignore</exclude>
+                  <exclude>**/.repository/**</exclude>
                   <exclude>**/.idea/**</exclude>
                   <exclude>**/*.iml</exclude>
                   <exclude>**/.classpath/**</exclude>


[6/8] git commit: Remove duplication from InternalEntityFactory etc

Posted by he...@apache.org.
Remove duplication from InternalEntityFactory etc


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/519bc9a8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/519bc9a8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/519bc9a8

Branch: refs/heads/master
Commit: 519bc9a8de5443f48472bfff597c41d543c95dd6
Parents: c0bd46d
Author: Aled Sage <al...@gmail.com>
Authored: Wed Jul 2 09:34:08 2014 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Jul 14 23:45:19 2014 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/basic/AbstractEntity.java   |   4 +-
 .../entity/proxying/InternalEntityFactory.java  |  89 ++----------
 .../entity/proxying/InternalFactory.java        | 137 +++++++++++++++++++
 .../proxying/InternalLocationFactory.java       |  85 +++---------
 .../entity/proxying/InternalPolicyFactory.java  | 119 ++++------------
 .../location/basic/AbstractLocation.java        |   4 +-
 .../policy/basic/AbstractEntityAdjunct.java     |   4 +-
 7 files changed, 193 insertions(+), 249 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/519bc9a8/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
index 0f291bf..081e0a6 100644
--- a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
+++ b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
@@ -38,7 +38,7 @@ import brooklyn.entity.Entity;
 import brooklyn.entity.EntityType;
 import brooklyn.entity.Group;
 import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.proxying.InternalEntityFactory;
+import brooklyn.entity.proxying.InternalFactory;
 import brooklyn.entity.rebind.BasicEntityRebindSupport;
 import brooklyn.entity.rebind.RebindManagerImpl;
 import brooklyn.entity.rebind.RebindSupport;
@@ -268,7 +268,7 @@ public abstract class AbstractEntity implements EntityLocal, EntityInternal {
         // TODO Don't let `this` reference escape during construction
         entityType = new EntityDynamicType(this);
         
-        _legacyConstruction = !InternalEntityFactory.FactoryConstructionTracker.isConstructing();
+        _legacyConstruction = !InternalFactory.FactoryConstructionTracker.isConstructing();
         
         if (_legacyConstruction) {
             LOG.warn("Deprecated use of old-style entity construction for "+getClass().getName()+"; instead use EntityManager().createEntity(spec)");

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/519bc9a8/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
index df73423..e572ce9 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
@@ -49,7 +49,6 @@ import brooklyn.util.javalang.AggregateClassLoader;
 import brooklyn.util.javalang.Reflections;
 import brooklyn.util.task.Tasks;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableMap;
 
 /**
@@ -60,67 +59,29 @@ import com.google.common.collect.ImmutableMap;
  * 
  * @author aled
  */
-public class InternalEntityFactory {
+public class InternalEntityFactory extends InternalFactory {
 
     private static final Logger log = LoggerFactory.getLogger(InternalEntityFactory.class);
     
-    private final ManagementContextInternal managementContext;
     private final EntityTypeRegistry entityTypeRegistry;
     private final InternalPolicyFactory policyFactory;
     
     /**
-     * For tracking if AbstractEntity constructor has been called by framework, or in legacy way (i.e. directly).
-     * 
-     * To be deleted once we delete support for constructing entities directly (and expecting configure() to be
-     * called inside the constructor, etc).
-     * 
-     * @author aled
-     */
-    public static class FactoryConstructionTracker {
-        private static ThreadLocal<Boolean> constructing = new ThreadLocal<Boolean>();
-        
-        public static boolean isConstructing() {
-            return (constructing.get() == Boolean.TRUE);
-        }
-        
-        static void reset() {
-            constructing.set(Boolean.FALSE);
-        }
-        
-        static void setConstructing() {
-            constructing.set(Boolean.TRUE);
-        }
-    }
-
-    /**
      * Returns true if this is a "new-style" entity (i.e. where not expected to call the constructor to instantiate it).
      * That means it is an entity with a no-arg constructor.
      * @param managementContext
      * @param clazz
      */
     public static boolean isNewStyleEntity(ManagementContext managementContext, Class<?> clazz) {
-        try {
-            return isNewStyleEntity(clazz);
-        } catch (IllegalArgumentException e) {
-            return false;
-        }
+        return InternalFactory.isNewStyle(managementContext, clazz);
     }
     
     public static boolean isNewStyleEntity(Class<?> clazz) {
-        if (!Entity.class.isAssignableFrom(clazz)) {
-            throw new IllegalArgumentException("Class "+clazz+" is not an entity");
-        }
-        
-        try {
-            clazz.getConstructor(new Class[0]);
-            return true;
-        } catch (NoSuchMethodException e) {
-            return false;
-        }
+        return InternalFactory.isNewStyle(clazz);
     }
     
     public InternalEntityFactory(ManagementContextInternal managementContext, EntityTypeRegistry entityTypeRegistry, InternalPolicyFactory policyFactory) {
-        this.managementContext = checkNotNull(managementContext, "managementContext");
+        super(managementContext);
         this.entityTypeRegistry = checkNotNull(entityTypeRegistry, "entityTypeRegistry");
         this.policyFactory = checkNotNull(policyFactory, "policyFactory");
     }
@@ -322,52 +283,22 @@ public class InternalEntityFactory {
      * Constructs an entity (if new-style, calls no-arg constructor; if old-style, uses spec to pass in config).
      */
     public <T extends Entity> T constructEntity(Class<? extends T> clazz, EntitySpec<T> spec) {
-        try {
-            FactoryConstructionTracker.setConstructing();
-            try {
-                if (isNewStyleEntity(clazz)) {
-                    return clazz.newInstance();
-                } else {
-                    return constructOldStyle(clazz, MutableMap.copyOf(spec.getFlags()));
-                }
-            } finally {
-                FactoryConstructionTracker.reset();
-            }
-        } catch (Exception e) {
-            throw Exceptions.propagate(e);
-         }
-     }
+        return super.construct(clazz, spec.getFlags());
+    }
 
     /**
      * Constructs a new-style entity (fails if no no-arg constructor).
      */
     public <T extends Entity> T constructEntity(Class<T> clazz) {
-        try {
-            FactoryConstructionTracker.setConstructing();
-            try {
-                if (isNewStyleEntity(clazz)) {
-                    return clazz.newInstance();
-                } else {
-                    throw new IllegalStateException("Entity class "+clazz+" must have a no-arg constructor");
-                }
-            } finally {
-                FactoryConstructionTracker.reset();
-            }
-        } catch (Exception e) {
-            throw Exceptions.propagate(e);
-        }
+        return super.constructNewStyle(clazz);
     }
     
-    private <T extends Entity> T constructOldStyle(Class<? extends T> clazz, Map<String,?> flags) throws InstantiationException, IllegalAccessException, InvocationTargetException {
+    @Override
+    protected <T> T constructOldStyle(Class<T> clazz, Map<String,?> flags) throws InstantiationException, IllegalAccessException, InvocationTargetException {
         if (flags.containsKey("parent") || flags.containsKey("owner")) {
             throw new IllegalArgumentException("Spec's flags must not contain parent or owner; use spec.parent() instead for "+clazz);
         }
-        Optional<? extends T> v = Reflections.invokeConstructorWithArgs(clazz, new Object[] {MutableMap.copyOf(flags)}, true);
-        if (v.isPresent()) {
-            return v.get();
-        } else {
-            throw new IllegalStateException("No valid constructor defined for "+clazz+" (expected no-arg or single java.util.Map argument)");
-        }
+        return super.constructOldStyle(clazz, flags);
     }
     
     private <T extends Entity> Class<? extends T> getImplementedBy(EntitySpec<T> spec) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/519bc9a8/core/src/main/java/brooklyn/entity/proxying/InternalFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalFactory.java
new file mode 100644
index 0000000..e024872
--- /dev/null
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalFactory.java
@@ -0,0 +1,137 @@
+/*
+ * 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 brooklyn.entity.proxying;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+
+import brooklyn.management.ManagementContext;
+import brooklyn.management.internal.ManagementContextInternal;
+import brooklyn.util.collections.MutableMap;
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.javalang.Reflections;
+
+import com.google.common.base.Optional;
+
+/**
+ */
+public class InternalFactory {
+
+    protected final ManagementContextInternal managementContext;
+
+    /**
+     * For tracking if constructor has been called by framework, or in legacy way (i.e. directly).
+     * 
+     * To be deleted once we delete support for constructing directly (and expecting configure() to be
+     * called inside the constructor, etc).
+     * 
+     * @author aled
+     */
+    public static class FactoryConstructionTracker {
+        private static ThreadLocal<Boolean> constructing = new ThreadLocal<Boolean>();
+        
+        public static boolean isConstructing() {
+            return (constructing.get() == Boolean.TRUE);
+        }
+        
+        static void reset() {
+            constructing.set(Boolean.FALSE);
+        }
+        
+        static void setConstructing() {
+            constructing.set(Boolean.TRUE);
+        }
+    }
+
+    /**
+     * Returns true if this is a "new-style" policy (i.e. where not expected to call the constructor to instantiate it).
+     * 
+     * @param managementContext
+     * @param clazz
+     */
+    public static boolean isNewStyle(ManagementContext managementContext, Class<?> clazz) {
+        try {
+            return isNewStyle(clazz);
+        } catch (IllegalArgumentException e) {
+            return false;
+        }
+    }
+    
+    public static boolean isNewStyle(Class<?> clazz) {
+        try {
+            clazz.getConstructor(new Class[0]);
+            return true;
+        } catch (NoSuchMethodException e) {
+            return false;
+        }
+    }
+    
+    public InternalFactory(ManagementContextInternal managementContext) {
+        this.managementContext = checkNotNull(managementContext, "managementContext");
+    }
+
+    protected <T> T construct(Class<? extends T> clazz, Map<String, ?> constructorFlags) {
+        try {
+            if (isNewStyle(clazz)) {
+                return constructNewStyle(clazz);
+            } else {
+                return constructOldStyle(clazz, MutableMap.copyOf(constructorFlags));
+            }
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+         }
+     }
+
+    /**
+     * Constructs a new instance (fails if no no-arg constructor).
+     */
+    protected <T> T constructNewStyle(Class<T> clazz) {
+        if (!isNewStyle(clazz)) {
+            throw new IllegalStateException("Class "+clazz+" must have a no-arg constructor");
+        }
+        
+        try {
+            FactoryConstructionTracker.setConstructing();
+            try {
+                return clazz.newInstance();
+            } finally {
+                FactoryConstructionTracker.reset();
+            }
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+    
+    protected <T> T constructOldStyle(Class<T> clazz, Map<String,?> flags) throws InstantiationException, IllegalAccessException, InvocationTargetException {
+        FactoryConstructionTracker.setConstructing();
+        Optional<T> v;
+        try {
+            v = Reflections.invokeConstructorWithArgs(clazz, new Object[] {MutableMap.copyOf(flags)}, true);
+        } finally {
+            FactoryConstructionTracker.reset();
+        }
+        if (v.isPresent()) {
+            return v.get();
+        } else {
+            throw new IllegalStateException("No valid constructor defined for "+clazz+" (expected no-arg or single java.util.Map argument)");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/519bc9a8/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
index 61715e7..ffcfac2 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
@@ -18,8 +18,6 @@
  */
 package brooklyn.entity.proxying;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
 import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -32,13 +30,10 @@ import brooklyn.location.basic.LocationInternal;
 import brooklyn.management.ManagementContext;
 import brooklyn.management.internal.LocalLocationManager;
 import brooklyn.management.internal.ManagementContextInternal;
-import brooklyn.util.collections.MutableMap;
 import brooklyn.util.config.ConfigBag;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.flags.FlagUtils;
-import brooklyn.util.javalang.Reflections;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableMap;
 
 /**
@@ -49,33 +44,7 @@ import com.google.common.collect.ImmutableMap;
  * 
  * @author aled
  */
-public class InternalLocationFactory {
-
-    private final ManagementContextInternal managementContext;
-
-    /**
-     * For tracking if AbstractLocation constructor has been called by framework, or in legacy way (i.e. directly).
-     * 
-     * To be deleted once we delete support for constructing locations directly (and expecting configure() to be
-     * called inside the constructor, etc).
-     * 
-     * @author aled
-     */
-    public static class FactoryConstructionTracker {
-        private static ThreadLocal<Boolean> constructing = new ThreadLocal<Boolean>();
-        
-        public static boolean isConstructing() {
-            return (constructing.get() == Boolean.TRUE);
-        }
-        
-        static void reset() {
-            constructing.set(Boolean.FALSE);
-        }
-        
-        static void setConstructing() {
-            constructing.set(Boolean.TRUE);
-        }
-    }
+public class InternalLocationFactory extends InternalFactory {
 
     /**
      * Returns true if this is a "new-style" location (i.e. where not expected to call the constructor to instantiate it).
@@ -96,16 +65,11 @@ public class InternalLocationFactory {
             throw new IllegalArgumentException("Class "+clazz+" is not an location");
         }
         
-        try {
-            clazz.getConstructor(new Class[0]);
-            return true;
-        } catch (NoSuchMethodException e) {
-            return false;
-        }
+        return InternalFactory.isNewStyle(clazz);
     }
     
     public InternalLocationFactory(ManagementContextInternal managementContext) {
-        this.managementContext = checkNotNull(managementContext, "managementContext");
+        super(managementContext);
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
@@ -123,12 +87,7 @@ public class InternalLocationFactory {
         try {
             Class<? extends T> clazz = spec.getType();
             
-            T loc;
-            if (isNewStyleLocation(clazz)) {
-                loc = constructLocation(clazz);
-            } else {
-                loc = constructOldStyle(clazz, MutableMap.copyOf(spec.getFlags()));
-            }
+            T loc = constructLocation(clazz, spec);
 
             if (spec.getId() != null) {
                 FlagUtils.setFieldsFromFlags(ImmutableMap.of("id", spec.getId()), loc);
@@ -163,34 +122,24 @@ public class InternalLocationFactory {
     }
     
     /**
-     * Constructs a new-style location (fails if no no-arg constructor).
+     * Constructs an entity (if new-style, calls no-arg constructor; if old-style, uses spec to pass in config).
+     */
+    public <T extends Location> T constructLocation(Class<? extends T> clazz, LocationSpec<T> spec) {
+        return super.construct(clazz, spec.getFlags());
+    }
+
+    /**
+     * Constructs a new-style entity (fails if no no-arg constructor).
      */
     public <T extends Location> T constructLocation(Class<T> clazz) {
-        try {
-            FactoryConstructionTracker.setConstructing();
-            try {
-                if (isNewStyleLocation(clazz)) {
-                    return clazz.newInstance();
-                } else {
-                    throw new IllegalStateException("Location class "+clazz+" must have a no-arg constructor");
-                }
-            } finally {
-                FactoryConstructionTracker.reset();
-            }
-        } catch (Exception e) {
-            throw Exceptions.propagate(e);
-        }
+        return super.constructNewStyle(clazz);
     }
     
-    private <T extends Location> T constructOldStyle(Class<? extends T> clazz, Map<String,?> flags) throws InstantiationException, IllegalAccessException, InvocationTargetException {
-        if (flags.containsKey("parentLocation")) {
+    @Override
+    protected <T> T constructOldStyle(Class<T> clazz, Map<String,?> flags) throws InstantiationException, IllegalAccessException, InvocationTargetException {
+        if (flags.containsKey("parent") || flags.containsKey("owner")) {
             throw new IllegalArgumentException("Spec's flags must not contain parent or owner; use spec.parent() instead for "+clazz);
         }
-        Optional<? extends T> v = Reflections.invokeConstructorWithArgs(clazz, new Object[] {MutableMap.copyOf(flags)}, true);
-        if (v.isPresent()) {
-            return v.get();
-        } else {
-            throw new IllegalStateException("No valid constructor defined for "+clazz+" (expected no-arg or single java.util.Map argument)");
-        }
+        return super.constructOldStyle(clazz, flags);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/519bc9a8/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
index 378d161..5480823 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
@@ -18,9 +18,6 @@
  */
 package brooklyn.entity.proxying;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
 
 import brooklyn.config.ConfigKey;
@@ -35,9 +32,6 @@ import brooklyn.policy.basic.AbstractPolicy;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.config.ConfigBag;
 import brooklyn.util.exceptions.Exceptions;
-import brooklyn.util.javalang.Reflections;
-
-import com.google.common.base.Optional;
 
 /**
  * Creates policies of required types.
@@ -50,33 +44,7 @@ import com.google.common.base.Optional;
  * 
  * @author aled
  */
-public class InternalPolicyFactory {
-
-    private final ManagementContextInternal managementContext;
-
-    /**
-     * For tracking if AbstractPolicy constructor has been called by framework, or in legacy way (i.e. directly).
-     * 
-     * To be deleted once we delete support for constructing policies directly (and expecting configure() to be
-     * called inside the constructor, etc).
-     * 
-     * @author aled
-     */
-    public static class FactoryConstructionTracker {
-        private static ThreadLocal<Boolean> constructing = new ThreadLocal<Boolean>();
-        
-        public static boolean isConstructing() {
-            return (constructing.get() == Boolean.TRUE);
-        }
-        
-        static void reset() {
-            constructing.set(Boolean.FALSE);
-        }
-        
-        static void setConstructing() {
-            constructing.set(Boolean.TRUE);
-        }
-    }
+public class InternalPolicyFactory extends InternalFactory {
 
     /**
      * Returns true if this is a "new-style" policy (i.e. where not expected to call the constructor to instantiate it).
@@ -96,13 +64,8 @@ public class InternalPolicyFactory {
         if (!Policy.class.isAssignableFrom(clazz)) {
             throw new IllegalArgumentException("Class "+clazz+" is not a policy");
         }
-        
-        try {
-            clazz.getConstructor(new Class[0]);
-            return true;
-        } catch (NoSuchMethodException e) {
-            return false;
-        }
+
+        return InternalFactory.isNewStyle(clazz);
     }
     
     public static boolean isNewStyleEnricher(Class<?> clazz) {
@@ -110,16 +73,11 @@ public class InternalPolicyFactory {
             throw new IllegalArgumentException("Class "+clazz+" is not an enricher");
         }
         
-        try {
-            clazz.getConstructor(new Class[0]);
-            return true;
-        } catch (NoSuchMethodException e) {
-            return false;
-        }
+        return InternalFactory.isNewStyle(clazz);
     }
     
     public InternalPolicyFactory(ManagementContextInternal managementContext) {
-        this.managementContext = checkNotNull(managementContext, "managementContext");
+        super(managementContext);
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
@@ -131,12 +89,7 @@ public class InternalPolicyFactory {
         try {
             Class<? extends T> clazz = spec.getType();
             
-            T pol;
-            if (isNewStylePolicy(clazz)) {
-                pol = constructPolicy(clazz);
-            } else {
-                pol = constructOldStyle(clazz, MutableMap.copyOf(spec.getFlags()));
-            }
+            T pol = constructPolicy(clazz, spec);
 
             if (spec.getDisplayName()!=null)
                 ((AbstractPolicy)pol).setName(spec.getDisplayName());
@@ -171,12 +124,7 @@ public class InternalPolicyFactory {
         try {
             Class<? extends T> clazz = spec.getType();
             
-            T enricher;
-            if (isNewStyleEnricher(clazz)) {
-                enricher = constructEnricher(clazz);
-            } else {
-                enricher = constructOldStyle(clazz, MutableMap.copyOf(spec.getFlags()));
-            }
+            T enricher = constructEnricher(clazz, spec);
             
             if (spec.getDisplayName()!=null)
                 ((AbstractEnricher)enricher).setName(spec.getDisplayName());
@@ -203,51 +151,30 @@ public class InternalPolicyFactory {
     }
     
     /**
+     * Constructs a policy (if new-style, calls no-arg constructor; if old-style, uses spec to pass in config).
+     */
+    public <T extends Policy> T constructPolicy(Class<? extends T> clazz, PolicySpec<T> spec) {
+        return super.construct(clazz, spec.getFlags());
+    }
+
+    /**
+     * Constructs an enricher (if new-style, calls no-arg constructor; if old-style, uses spec to pass in config).
+     */
+    public <T extends Enricher> T constructEnricher(Class<? extends T> clazz, EnricherSpec<T> spec) {
+        return super.construct(clazz, spec.getFlags());
+    }
+
+    /**
      * Constructs a new-style policy (fails if no no-arg constructor).
      */
     public <T extends Policy> T constructPolicy(Class<T> clazz) {
-        try {
-            FactoryConstructionTracker.setConstructing();
-            try {
-                if (isNewStylePolicy(clazz)) {
-                    return clazz.newInstance();
-                } else {
-                    throw new IllegalStateException("Policy class "+clazz+" must have a no-arg constructor");
-                }
-            } finally {
-                FactoryConstructionTracker.reset();
-            }
-        } catch (Exception e) {
-            throw Exceptions.propagate(e);
-        }
+        return super.constructNewStyle(clazz);
     }
     
     /**
      * Constructs a new-style enricher (fails if no no-arg constructor).
      */
     public <T extends Enricher> T constructEnricher(Class<T> clazz) {
-        try {
-            FactoryConstructionTracker.setConstructing();
-            try {
-                if (isNewStyleEnricher(clazz)) {
-                    return clazz.newInstance();
-                } else {
-                    throw new IllegalStateException("Enricher class "+clazz+" must have a no-arg constructor");
-                }
-            } finally {
-                FactoryConstructionTracker.reset();
-            }
-        } catch (Exception e) {
-            throw Exceptions.propagate(e);
-        }
-    }
-    
-    private <T> T constructOldStyle(Class<T> clazz, Map<String,?> flags) throws InstantiationException, IllegalAccessException, InvocationTargetException {
-        Optional<T> v = Reflections.invokeConstructorWithArgs(clazz, new Object[] {MutableMap.copyOf(flags)}, true);
-        if (v.isPresent()) {
-            return v.get();
-        } else {
-            throw new IllegalStateException("No valid constructor defined for "+clazz+" (expected no-arg or single java.util.Map argument)");
-        }
+        return super.constructNewStyle(clazz);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/519bc9a8/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/AbstractLocation.java b/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
index d468622..ebb5909 100644
--- a/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
@@ -35,7 +35,7 @@ import org.slf4j.LoggerFactory;
 import brooklyn.config.ConfigKey;
 import brooklyn.config.ConfigKey.HasConfigKey;
 import brooklyn.entity.basic.EntityDynamicType;
-import brooklyn.entity.proxying.InternalLocationFactory;
+import brooklyn.entity.proxying.InternalFactory;
 import brooklyn.entity.rebind.BasicLocationRebindSupport;
 import brooklyn.entity.rebind.RebindManagerImpl;
 import brooklyn.entity.rebind.RebindSupport;
@@ -144,7 +144,7 @@ public abstract class AbstractLocation implements LocationInternal, HasHostGeoIn
      */
     public AbstractLocation(Map properties) {
         inConstruction = true;
-        _legacyConstruction = !InternalLocationFactory.FactoryConstructionTracker.isConstructing();
+        _legacyConstruction = !InternalFactory.FactoryConstructionTracker.isConstructing();
         if (!_legacyConstruction && properties!=null && !properties.isEmpty()) {
             LOG.warn("Forcing use of deprecated old-style location construction for "+getClass().getName()+" because properties were specified ("+properties+")");
             _legacyConstruction = true;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/519bc9a8/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
index a5d324f..3760933 100644
--- a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
+++ b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
@@ -37,7 +37,7 @@ import brooklyn.entity.Entity;
 import brooklyn.entity.Group;
 import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.proxying.InternalPolicyFactory;
+import brooklyn.entity.proxying.InternalFactory;
 import brooklyn.entity.rebind.RebindManagerImpl;
 import brooklyn.entity.trait.Configurable;
 import brooklyn.event.AttributeSensor;
@@ -106,7 +106,7 @@ public abstract class AbstractEntityAdjunct implements EntityAdjunct, Configurab
     
     public AbstractEntityAdjunct(@SuppressWarnings("rawtypes") Map flags) {
         inConstruction = true;
-        _legacyConstruction = !InternalPolicyFactory.FactoryConstructionTracker.isConstructing();
+        _legacyConstruction = !InternalFactory.FactoryConstructionTracker.isConstructing();
         _legacyNoConstructionInit = (flags != null) && Boolean.TRUE.equals(flags.get("noConstructionInit"));
         
         if (!_legacyConstruction && flags!=null && !flags.isEmpty()) {


[4/8] git commit: Change EntityAdjunct.getName() to getDisplayName()

Posted by he...@apache.org.
Change EntityAdjunct.getName() to getDisplayName()


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/5ca049eb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/5ca049eb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/5ca049eb

Branch: refs/heads/master
Commit: 5ca049eb6497e5698c8e493f928741bb201fa949
Parents: cbb6e40
Author: Aled Sage <al...@gmail.com>
Authored: Mon Jul 14 16:09:59 2014 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Jul 14 23:45:19 2014 +0100

----------------------------------------------------------------------
 api/src/main/java/brooklyn/policy/Enricher.java |  3 +++
 .../java/brooklyn/policy/EntityAdjunct.java     |  6 ++++++
 api/src/main/java/brooklyn/policy/Policy.java   |  3 +++
 .../brooklyn/entity/basic/PolicyDescriptor.java |  2 +-
 .../entity/proxying/InternalPolicyFactory.java  |  4 ++--
 .../rebind/BasicEnricherRebindSupport.java      |  2 +-
 .../entity/rebind/BasicPolicyRebindSupport.java |  2 +-
 .../entity/rebind/dto/MementosGenerators.java   |  4 ++--
 .../policy/basic/AbstractEntityAdjunct.java     | 20 +++++++++++++++++---
 .../brooklyn/entity/basic/EntitySpecTest.java   |  4 ++--
 .../loadbalancing/LoadBalancingPolicy.java      |  2 +-
 .../autoscaling/AutoScalerPolicyRebindTest.java |  2 +-
 .../rest/transform/PolicyTransformer.java       |  2 +-
 .../rest/util/BrooklynRestResourceUtils.java    |  2 +-
 .../util/BrooklynRestResourceUtilsTest.java     |  2 +-
 15 files changed, 43 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/api/src/main/java/brooklyn/policy/Enricher.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/Enricher.java b/api/src/main/java/brooklyn/policy/Enricher.java
index c0e6168..53f2603 100644
--- a/api/src/main/java/brooklyn/policy/Enricher.java
+++ b/api/src/main/java/brooklyn/policy/Enricher.java
@@ -43,7 +43,10 @@ public interface Enricher extends EntityAdjunct, Rebindable, Configurable {
 
     /**
      * Get the name assigned to this enricher.
+     * 
+     * @deprecated since 0.7; use {@link #getDisplayName()}
      */
+    @Deprecated
     @Override
     String getName();
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/api/src/main/java/brooklyn/policy/EntityAdjunct.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/EntityAdjunct.java b/api/src/main/java/brooklyn/policy/EntityAdjunct.java
index e50c400..d0d0d37 100644
--- a/api/src/main/java/brooklyn/policy/EntityAdjunct.java
+++ b/api/src/main/java/brooklyn/policy/EntityAdjunct.java
@@ -36,6 +36,12 @@ public interface EntityAdjunct extends Identifiable {
      *
      * @return the name assigned to the adjunct
      */
+    String getDisplayName();
+    
+    /**
+     * @deprecated since 0.7; use {@link #getDisplayName()}
+     */
+    @Deprecated
     String getName();
     
     /**

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/api/src/main/java/brooklyn/policy/Policy.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/Policy.java b/api/src/main/java/brooklyn/policy/Policy.java
index cd2d2a6..3e275cf 100644
--- a/api/src/main/java/brooklyn/policy/Policy.java
+++ b/api/src/main/java/brooklyn/policy/Policy.java
@@ -43,7 +43,10 @@ public interface Policy extends EntityAdjunct, Rebindable, Configurable {
      * Get the name assigned to this policy.
      *
      * @return the name assigned to the policy.
+     * 
+     * @deprecated since 0.7; use {@link #getDisplayName()}
      */
+    @Deprecated
     @Override
     String getName();
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/core/src/main/java/brooklyn/entity/basic/PolicyDescriptor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/PolicyDescriptor.java b/core/src/main/java/brooklyn/entity/basic/PolicyDescriptor.java
index 3910d1e..3bba292 100644
--- a/core/src/main/java/brooklyn/entity/basic/PolicyDescriptor.java
+++ b/core/src/main/java/brooklyn/entity/basic/PolicyDescriptor.java
@@ -31,7 +31,7 @@ public class PolicyDescriptor {
     public PolicyDescriptor(Policy policy) {
         this.id = policy.getId();
         this.type = policy.getPolicyType().getName();
-        this.name = policy.getName();
+        this.name = policy.getDisplayName();
     }
     public String getId() {
         return id;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
index 3839ce1..ebf13dd 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
@@ -92,7 +92,7 @@ public class InternalPolicyFactory extends InternalFactory {
             T pol = construct(clazz, spec.getFlags());
 
             if (spec.getDisplayName()!=null)
-                ((AbstractPolicy)pol).setName(spec.getDisplayName());
+                ((AbstractPolicy)pol).setDisplayName(spec.getDisplayName());
             
             if (isNewStylePolicy(clazz)) {
                 ((AbstractPolicy)pol).setManagementContext(managementContext);
@@ -127,7 +127,7 @@ public class InternalPolicyFactory extends InternalFactory {
             T enricher = construct(clazz, spec.getFlags());
             
             if (spec.getDisplayName()!=null)
-                ((AbstractEnricher)enricher).setName(spec.getDisplayName());
+                ((AbstractEnricher)enricher).setDisplayName(spec.getDisplayName());
             
             if (isNewStyleEnricher(clazz)) {
                 ((AbstractEnricher)enricher).setManagementContext(managementContext);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/core/src/main/java/brooklyn/entity/rebind/BasicEnricherRebindSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/BasicEnricherRebindSupport.java b/core/src/main/java/brooklyn/entity/rebind/BasicEnricherRebindSupport.java
index ffbd447..0fc1584 100644
--- a/core/src/main/java/brooklyn/entity/rebind/BasicEnricherRebindSupport.java
+++ b/core/src/main/java/brooklyn/entity/rebind/BasicEnricherRebindSupport.java
@@ -48,7 +48,7 @@ public class BasicEnricherRebindSupport implements RebindSupport<EnricherMemento
     public void reconstruct(RebindContext rebindContext, EnricherMemento memento) {
         if (LOG.isTraceEnabled()) LOG.trace("Reconstructing enricher: {}", memento.toVerboseString());
 
-        enricher.setName(memento.getDisplayName());
+        enricher.setDisplayName(memento.getDisplayName());
         
         // TODO entity does config-lookup differently; the memento contains the config keys.
         // BasicEntityMemento.postDeserialize uses the injectTypeClass to call EntityTypes.getDefinedConfigKeys(clazz)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/core/src/main/java/brooklyn/entity/rebind/BasicPolicyRebindSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/BasicPolicyRebindSupport.java b/core/src/main/java/brooklyn/entity/rebind/BasicPolicyRebindSupport.java
index e97dedd..cac7996 100644
--- a/core/src/main/java/brooklyn/entity/rebind/BasicPolicyRebindSupport.java
+++ b/core/src/main/java/brooklyn/entity/rebind/BasicPolicyRebindSupport.java
@@ -48,7 +48,7 @@ public class BasicPolicyRebindSupport implements RebindSupport<PolicyMemento> {
     public void reconstruct(RebindContext rebindContext, PolicyMemento memento) {
         if (LOG.isTraceEnabled()) LOG.trace("Reconstructing policy: {}", memento.toVerboseString());
 
-        policy.setName(memento.getDisplayName());
+        policy.setDisplayName(memento.getDisplayName());
 
         // TODO entity does config-lookup differently; the memento contains the config keys.
         // BasicEntityMemento.postDeserialize uses the injectTypeClass to call EntityTypes.getDefinedConfigKeys(clazz)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/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 241ece4..be1f27d 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java
@@ -251,7 +251,7 @@ public class MementosGenerators {
         builder.type = policy.getClass().getName();
         builder.typeClass = policy.getClass();
         builder.id = policy.getId();
-        builder.displayName = policy.getName();
+        builder.displayName = policy.getDisplayName();
 
         // TODO persist config keys as well? Or only support those defined on policy class;
         // current code will lose the ConfigKey type on rebind for anything not defined on class.
@@ -297,7 +297,7 @@ public class MementosGenerators {
         builder.type = enricher.getClass().getName();
         builder.typeClass = enricher.getClass();
         builder.id = enricher.getId();
-        builder.displayName = enricher.getName();
+        builder.displayName = enricher.getDisplayName();
 
         // TODO persist config keys as well? Or only support those defined on policy class;
         // current code will lose the ConfigKey type on rebind for anything not defined on class.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
index 3760933..b6dd15f 100644
--- a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
+++ b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
@@ -173,7 +173,7 @@ public abstract class AbstractEntityAdjunct implements EntityAdjunct, Configurab
             //TODO inconsistent with entity and location, where name is legacy and displayName is encouraged!
             //'displayName' is a legacy way to refer to a policy's name
             Preconditions.checkArgument(flags.get("displayName") instanceof CharSequence, "'displayName' property should be a string");
-            setName(flags.remove("displayName").toString());
+            setDisplayName(flags.remove("displayName").toString());
         }
     }
     
@@ -271,12 +271,26 @@ public abstract class AbstractEntityAdjunct implements EntityAdjunct, Configurab
     }
     
     @Override
-    public String getName() { 
+    public String getDisplayName() {
         if (name!=null && name.length()>0) return name;
         return getClass().getCanonicalName();
     }
     
-    public void setName(String name) { this.name = name; }
+    @Override
+    @Deprecated
+    public String getName() {
+        return getDisplayName();
+    }
+    
+    public void setDisplayName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @deprecated since 0.7.0; see {@link #setDisplayName(String)}
+     */
+    @Deprecated
+    public void setName(String name) { setDisplayName(name); }
 
     @Override
     public String getId() { return id; }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java b/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java
index 8550231..621ffcd 100644
--- a/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java
+++ b/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java
@@ -87,7 +87,7 @@ public class EntitySpecTest extends BrooklynAppUnitTestSupport {
         
         Policy policy = Iterables.getOnlyElement(entity.getPolicies());
         assertTrue(policy instanceof MyPolicy, "policy="+policy);
-        assertEquals(policy.getName(), "mypolicyname");
+        assertEquals(policy.getDisplayName(), "mypolicyname");
         assertEquals(policy.getConfig(MyPolicy.CONF1), "myconf1val");
     }
     
@@ -110,7 +110,7 @@ public class EntitySpecTest extends BrooklynAppUnitTestSupport {
         
         Enricher enricher = Iterables.getOnlyElement(entity.getEnrichers());
         assertTrue(enricher instanceof MyEnricher, "enricher="+enricher);
-        assertEquals(enricher.getName(), "myenrichername");
+        assertEquals(enricher.getDisplayName(), "myenrichername");
         assertEquals(enricher.getConfig(MyEnricher.CONF1), "myconf1val");
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java b/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
index c9a6875..83ff569 100644
--- a/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
+++ b/policy/src/main/java/brooklyn/policy/loadbalancing/LoadBalancingPolicy.java
@@ -127,7 +127,7 @@ public class LoadBalancingPolicy<NodeType extends Entity, ItemType extends Movab
         this.lowThresholdConfigKeyName = metric.getName()+".threshold.low";
         this.highThresholdConfigKeyName = metric.getName()+".threshold.high";
         this.model = model;
-        this.strategy = new BalancingStrategy(getName(), model); // TODO: extract interface, inject impl
+        this.strategy = new BalancingStrategy(getDisplayName(), model); // TODO: extract interface, inject impl
         
         // TODO Should re-use the execution manager's thread pool, somehow
         executor = Executors.newSingleThreadScheduledExecutor(newThreadFactory());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyRebindTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyRebindTest.java b/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyRebindTest.java
index 2d4e9f8..61e2974 100644
--- a/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyRebindTest.java
+++ b/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyRebindTest.java
@@ -91,7 +91,7 @@ public class AutoScalerPolicyRebindTest extends RebindTestFixtureWithApp {
         DynamicCluster newCluster = (DynamicCluster) Iterables.getOnlyElement(newApp.getChildren());
         AutoScalerPolicy newPolicy = (AutoScalerPolicy) Iterables.getOnlyElement(newCluster.getPolicies());
 
-        assertEquals(newPolicy.getName(), "myname");
+        assertEquals(newPolicy.getDisplayName(), "myname");
         assertEquals(newPolicy.getConfig(AutoScalerPolicy.METRIC), METRIC_SENSOR);
         assertEquals(newPolicy.getConfig(AutoScalerPolicy.ENTITY_WITH_METRIC), newCluster);
         assertEquals(newPolicy.getConfig(AutoScalerPolicy.METRIC_UPPER_BOUND), 1);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java b/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java
index f5ef35d..e15c97f 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/transform/PolicyTransformer.java
@@ -54,7 +54,7 @@ public class PolicyTransformer {
                 .put("entity", URI.create(entityUri))
                 .build();
 
-        return new PolicySummary(policy.getId(), policy.getName(), ApplicationTransformer.statusFromLifecycle(Policies.getPolicyStatus(policy)), links);
+        return new PolicySummary(policy.getId(), policy.getDisplayName(), ApplicationTransformer.statusFromLifecycle(Policies.getPolicyStatus(policy)), links);
     }
 
     public static PolicyConfigSummary policyConfigSummary(BrooklynRestResourceUtils utils, ApplicationSummary application, EntityLocal entity, Policy policy, ConfigKey<?> config) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java b/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java
index 9db3f10..724cd45 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java
@@ -118,7 +118,7 @@ public class BrooklynRestResourceUtils {
             if (policy.equals(p.getId())) return p;
         }
         for (Policy p: entity.getPolicies()) {
-            if (policy.equals(p.getName())) return p;
+            if (policy.equals(p.getDisplayName())) return p;
         }
         
         throw WebResourceUtils.notFound("Cannot find policy '%s' in entity '%s'", policy, entity);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5ca049eb/usage/rest-server/src/test/java/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java b/usage/rest-server/src/test/java/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java
index 2ba7483..58419bb 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java
@@ -100,7 +100,7 @@ public class BrooklynRestResourceUtilsTest {
         assertEquals(subentityRetrieved.getDisplayName(), "subentity");
         
         Policy subappPolicy = util.getPolicy(app.getId(), subentity.getId(), "mypolicy");
-        assertEquals(subappPolicy.getName(), "mypolicy");
+        assertEquals(subappPolicy.getDisplayName(), "mypolicy");
     }
 
     public interface MyInterface {


[2/8] git commit: Internal*Factory: remove duplication

Posted by he...@apache.org.
Internal*Factory: remove duplication

- Remove duplication across InternalEntityFactory, InternalPolicyFactory
  and InternalLocationFactory
- Remove duplication in callers of InternalEntityFactory.createEntity


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/e07155ad
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/e07155ad
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/e07155ad

Branch: refs/heads/master
Commit: e07155ad3fafa6bd6f3bc0ac2060ceaa95426c72
Parents: 9138317
Author: Aled Sage <al...@gmail.com>
Authored: Mon Jul 14 12:48:46 2014 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Jul 14 23:45:19 2014 +0100

----------------------------------------------------------------------
 .../entity/proxying/InternalEntityFactory.java  | 107 +++++++++++--------
 .../entity/proxying/InternalFactory.java        |  16 +--
 .../proxying/InternalLocationFactory.java       |   9 +-
 .../entity/proxying/InternalPolicyFactory.java  |  18 +---
 .../entity/rebind/RebindManagerImpl.java        |  40 ++-----
 .../BrooklynComponentTemplateResolver.java      |  13 ---
 6 files changed, 79 insertions(+), 124 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e07155ad/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
index e572ce9..7abf68f 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
@@ -19,6 +19,7 @@
 package brooklyn.entity.proxying;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
@@ -29,11 +30,11 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Entity;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.AbstractEntity;
 import brooklyn.entity.basic.BrooklynTaskTags;
 import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.EntityLocal;
-import brooklyn.management.ManagementContext;
 import brooklyn.management.internal.LocalEntityManager;
 import brooklyn.management.internal.ManagementContextInternal;
 import brooklyn.policy.Enricher;
@@ -46,10 +47,11 @@ import brooklyn.util.collections.MutableSet;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.flags.FlagUtils;
 import brooklyn.util.javalang.AggregateClassLoader;
-import brooklyn.util.javalang.Reflections;
 import brooklyn.util.task.Tasks;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
 
 /**
  * Creates entities (and proxies) of required types, given the 
@@ -57,6 +59,13 @@ import com.google.common.collect.ImmutableMap;
  * This is an internal class for use by core-brooklyn. End-users are strongly discouraged from
  * using this class directly.
  * 
+ * Used in three situations:
+ * <ul>
+ *   <li>Normal entity creation (through entityManager.createEntity)
+ *   <li>rebind (i.e. Brooklyn restart, or promotion of HA standby manager node)
+ *   <li>yaml parsing
+ * </ul>
+ * 
  * @author aled
  */
 public class InternalEntityFactory extends InternalFactory {
@@ -66,41 +75,33 @@ public class InternalEntityFactory extends InternalFactory {
     private final EntityTypeRegistry entityTypeRegistry;
     private final InternalPolicyFactory policyFactory;
     
-    /**
-     * Returns true if this is a "new-style" entity (i.e. where not expected to call the constructor to instantiate it).
-     * That means it is an entity with a no-arg constructor.
-     * @param managementContext
-     * @param clazz
-     */
-    public static boolean isNewStyleEntity(ManagementContext managementContext, Class<?> clazz) {
-        return InternalFactory.isNewStyle(managementContext, clazz);
-    }
-    
-    public static boolean isNewStyleEntity(Class<?> clazz) {
-        return InternalFactory.isNewStyle(clazz);
-    }
-    
     public InternalEntityFactory(ManagementContextInternal managementContext, EntityTypeRegistry entityTypeRegistry, InternalPolicyFactory policyFactory) {
         super(managementContext);
         this.entityTypeRegistry = checkNotNull(entityTypeRegistry, "entityTypeRegistry");
         this.policyFactory = checkNotNull(policyFactory, "policyFactory");
     }
 
-    @SuppressWarnings("unchecked")
     public <T extends Entity> T createEntityProxy(EntitySpec<T> spec, T entity) {
-        // TODO Don't want the proxy to have to implement EntityLocal, but required by how 
-        // AbstractEntity.parent is used (e.g. parent.getAllConfig)
-        ClassLoader classloader = (spec.getImplementation() != null ? spec.getImplementation() : spec.getType()).getClassLoader();
-        MutableSet.Builder<Class<?>> builder = MutableSet.<Class<?>>builder()
-                .add(EntityProxy.class, Entity.class, EntityLocal.class, EntityInternal.class);
+        Set<Class<?>> interfaces = Sets.newLinkedHashSet();
         if (spec.getType().isInterface()) {
-            builder.add(spec.getType());
+            interfaces.add(spec.getType());
         } else {
             log.warn("EntitySpec declared in terms of concrete type "+spec.getType()+"; should be supplied in terms of interface");
         }
-        builder.addAll(spec.getAdditionalInterfaces());
-        Set<Class<?>> interfaces = builder.build();
+        interfaces.addAll(spec.getAdditionalInterfaces());
         
+        return createEntityProxy(interfaces, entity);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends Entity> T createEntityProxy(Iterable<Class<?>> interfaces, T entity) {
+        // TODO Don't want the proxy to have to implement EntityLocal, but required by how 
+        // AbstractEntity.parent is used (e.g. parent.getAllConfig)
+        Set<Class<?>> allInterfaces = MutableSet.<Class<?>>builder()
+                .add(EntityProxy.class, Entity.class, EntityLocal.class, EntityInternal.class)
+                .addAll(interfaces)
+                .build();
+
         // TODO OSGi strangeness! The classloader obtained from the type should be enough.
         // If an OSGi class loader, it should delegate to find things like Entity.class etc.
         // However, we get errors such as:
@@ -108,18 +109,17 @@ public class InternalEntityFactory extends InternalFactory {
         // Building our own aggregating class loader gets around this.
         // But we really should not have to do this! What are the consequences?
         AggregateClassLoader aggregateClassLoader =  AggregateClassLoader.newInstanceWithNoLoaders();
-        aggregateClassLoader.addFirst(classloader);
         aggregateClassLoader.addFirst(entity.getClass().getClassLoader());
-        for(Class<?> iface : interfaces) {
+        for(Class<?> iface : allInterfaces) {
             aggregateClassLoader.addLast(iface.getClassLoader());
         }
 
         return (T) java.lang.reflect.Proxy.newProxyInstance(
                 aggregateClassLoader,
-                interfaces.toArray(new Class[interfaces.size()]),
+                allInterfaces.toArray(new Class[allInterfaces.size()]),
                 new EntityProxyImpl(entity));
     }
-
+    
     public <T extends Entity> T createEntity(EntitySpec<T> spec) {
         /* Order is important here. Changed Jul 2014 when supporting children in spec.
          * (Previously was much simpler, and parent was set right after running initializers; and there were no children.)
@@ -147,8 +147,11 @@ public class InternalEntityFactory extends InternalFactory {
         if (spec.getFlags().containsKey("id")) {
             throw new IllegalArgumentException("Spec's flags must not contain id; use spec.id() instead for "+spec);
         }
-        if (spec.getId() != null && ((LocalEntityManager)managementContext.getEntityManager()).isKnownEntityId(spec.getId())) {
-            throw new IllegalArgumentException("Entity with id "+spec.getId()+" already exists; cannot create new entity with this explicit id from spec "+spec);
+        if (spec.getId() != null) {
+            log.warn("Use of deprecated EntitySpec.id ({}); instead let management context pick the random+unique id", spec);
+            if (((LocalEntityManager)managementContext.getEntityManager()).isKnownEntityId(spec.getId())) {
+                throw new IllegalArgumentException("Entity with id "+spec.getId()+" already exists; cannot create new entity with this explicit id from spec "+spec);
+            }
         }
         
         try {
@@ -156,13 +159,6 @@ public class InternalEntityFactory extends InternalFactory {
             
             T entity = constructEntity(clazz, spec);
             
-            // TODO Could move setManagementContext call into constructEntity; would that break rebind?
-            if (spec.getId() != null) {
-                FlagUtils.setFieldsFromFlags(ImmutableMap.of("id", spec.getId()), entity);
-            }
-            ((AbstractEntity)entity).setManagementContext(managementContext);
-            managementContext.prePreManage(entity);
-
             loadUnitializedEntity(entity, spec);
 
             entitiesByEntityId.put(entity.getId(), entity);
@@ -194,7 +190,6 @@ public class InternalEntityFactory extends InternalFactory {
             if (spec.getDisplayName()!=null)
                 ((AbstractEntity)entity).setDisplayName(spec.getDisplayName());
             
-            if (((AbstractEntity)entity).getProxy() == null) ((AbstractEntity)entity).setProxy(createEntityProxy(spec, entity));
             ((AbstractEntity)entity).configure(MutableMap.copyOf(spec.getFlags()));
             
             for (Map.Entry<ConfigKey<?>, Object> entry : spec.getConfig().entrySet()) {
@@ -281,18 +276,46 @@ public class InternalEntityFactory extends InternalFactory {
     
     /**
      * Constructs an entity (if new-style, calls no-arg constructor; if old-style, uses spec to pass in config).
+     * Sets the entity's proxy. If {@link EntitySpec#id(String)} was set then uses that to override the entity's id, 
+     * but that behaviour is deprecated.
      */
     public <T extends Entity> T constructEntity(Class<? extends T> clazz, EntitySpec<T> spec) {
-        return super.construct(clazz, spec.getFlags());
+        T entity = constructEntityImpl(clazz, spec.getFlags(), spec.getId());
+        if (((AbstractEntity)entity).getProxy() == null) ((AbstractEntity)entity).setProxy(createEntityProxy(spec, entity));
+        return entity;
     }
 
     /**
      * Constructs a new-style entity (fails if no no-arg constructor).
+     * Sets the entity's id and proxy.
      */
-    public <T extends Entity> T constructEntity(Class<T> clazz) {
-        return super.constructNewStyle(clazz);
+    public <T extends Entity> T constructEntity(Class<T> clazz, Iterable<Class<?>> interfaces, String entityId) {
+        if (!isNewStyle(clazz)) {
+            throw new IllegalStateException("Cannot construct old-style entity "+clazz);
+        }
+        checkNotNull(entityId, "entityId");
+        checkState(interfaces != null && !Iterables.isEmpty(interfaces), "must have at least one interface for entity %s:%s", clazz, entityId);
+        
+        T entity = constructEntityImpl(clazz, ImmutableMap.<String, Object>of(), entityId);
+        if (((AbstractEntity)entity).getProxy() == null) ((AbstractEntity)entity).setProxy(createEntityProxy(interfaces, entity));
+        return entity;
     }
     
+    protected <T extends Entity> T constructEntityImpl(Class<? extends T> clazz, Map<String, ?> constructionFlags, String entityId) {
+        T entity = super.construct(clazz, constructionFlags);
+        
+        if (entityId != null) {
+            FlagUtils.setFieldsFromFlags(ImmutableMap.of("id", entityId), entity);
+        }
+        if (entity instanceof AbstractApplication) {
+            FlagUtils.setFieldsFromFlags(ImmutableMap.of("mgmt", managementContext), entity);
+        }
+        managementContext.prePreManage(entity);
+        ((AbstractEntity)entity).setManagementContext(managementContext);
+
+        return entity;
+    }
+
     @Override
     protected <T> T constructOldStyle(Class<T> clazz, Map<String,?> flags) throws InstantiationException, IllegalAccessException, InvocationTargetException {
         if (flags.containsKey("parent") || flags.containsKey("owner")) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e07155ad/core/src/main/java/brooklyn/entity/proxying/InternalFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalFactory.java
index e024872..3b77526 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalFactory.java
@@ -23,7 +23,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
 
-import brooklyn.management.ManagementContext;
 import brooklyn.management.internal.ManagementContextInternal;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.exceptions.Exceptions;
@@ -62,19 +61,10 @@ public class InternalFactory {
     }
 
     /**
-     * Returns true if this is a "new-style" policy (i.e. where not expected to call the constructor to instantiate it).
+     * Returns true if this is a "new-style" policy (i.e. where not expected callers to use the constructor directly to instantiate it).
      * 
-     * @param managementContext
      * @param clazz
      */
-    public static boolean isNewStyle(ManagementContext managementContext, Class<?> clazz) {
-        try {
-            return isNewStyle(clazz);
-        } catch (IllegalArgumentException e) {
-            return false;
-        }
-    }
-    
     public static boolean isNewStyle(Class<?> clazz) {
         try {
             clazz.getConstructor(new Class[0]);
@@ -88,6 +78,10 @@ public class InternalFactory {
         this.managementContext = checkNotNull(managementContext, "managementContext");
     }
 
+    /**
+     * Constructs an instance (e.g. of entity, location, enricher or policy.
+     * If new-style, calls no-arg constructor; if old-style, uses spec to pass in config.
+     */
     protected <T> T construct(Class<? extends T> clazz, Map<String, ?> constructorFlags) {
         try {
             if (isNewStyle(clazz)) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e07155ad/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
index ffcfac2..804b5d5 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
@@ -87,7 +87,7 @@ public class InternalLocationFactory extends InternalFactory {
         try {
             Class<? extends T> clazz = spec.getType();
             
-            T loc = constructLocation(clazz, spec);
+            T loc = construct(clazz, spec.getFlags());
 
             if (spec.getId() != null) {
                 FlagUtils.setFieldsFromFlags(ImmutableMap.of("id", spec.getId()), loc);
@@ -122,13 +122,6 @@ public class InternalLocationFactory extends InternalFactory {
     }
     
     /**
-     * Constructs an entity (if new-style, calls no-arg constructor; if old-style, uses spec to pass in config).
-     */
-    public <T extends Location> T constructLocation(Class<? extends T> clazz, LocationSpec<T> spec) {
-        return super.construct(clazz, spec.getFlags());
-    }
-
-    /**
      * Constructs a new-style entity (fails if no no-arg constructor).
      */
     public <T extends Location> T constructLocation(Class<T> clazz) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e07155ad/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
index 5480823..3839ce1 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
@@ -89,7 +89,7 @@ public class InternalPolicyFactory extends InternalFactory {
         try {
             Class<? extends T> clazz = spec.getType();
             
-            T pol = constructPolicy(clazz, spec);
+            T pol = construct(clazz, spec.getFlags());
 
             if (spec.getDisplayName()!=null)
                 ((AbstractPolicy)pol).setName(spec.getDisplayName());
@@ -124,7 +124,7 @@ public class InternalPolicyFactory extends InternalFactory {
         try {
             Class<? extends T> clazz = spec.getType();
             
-            T enricher = constructEnricher(clazz, spec);
+            T enricher = construct(clazz, spec.getFlags());
             
             if (spec.getDisplayName()!=null)
                 ((AbstractEnricher)enricher).setName(spec.getDisplayName());
@@ -151,20 +151,6 @@ public class InternalPolicyFactory extends InternalFactory {
     }
     
     /**
-     * Constructs a policy (if new-style, calls no-arg constructor; if old-style, uses spec to pass in config).
-     */
-    public <T extends Policy> T constructPolicy(Class<? extends T> clazz, PolicySpec<T> spec) {
-        return super.construct(clazz, spec.getFlags());
-    }
-
-    /**
-     * Constructs an enricher (if new-style, calls no-arg constructor; if old-style, uses spec to pass in config).
-     */
-    public <T extends Enricher> T constructEnricher(Class<? extends T> clazz, EnricherSpec<T> spec) {
-        return super.construct(clazz, spec.getFlags());
-    }
-
-    /**
      * Constructs a new-style policy (fails if no no-arg constructor).
      */
     public <T extends Policy> T constructPolicy(Class<T> clazz) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e07155ad/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
index 8814aa1..34a529e 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -41,6 +42,7 @@ import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.proxying.InternalEntityFactory;
+import brooklyn.entity.proxying.InternalFactory;
 import brooklyn.entity.proxying.InternalLocationFactory;
 import brooklyn.entity.proxying.InternalPolicyFactory;
 import brooklyn.internal.BrooklynFeatureEnablement;
@@ -566,41 +568,11 @@ public class RebindManagerImpl implements RebindManager {
     private Entity newEntity(String entityId, String entityType, Reflections reflections) {
         Class<? extends Entity> entityClazz = (Class<? extends Entity>) reflections.loadClass(entityType);
         
-        if (InternalEntityFactory.isNewStyleEntity(managementContext, entityClazz)) {
-            // Not using entityManager.createEntity(EntitySpec) because don't want init() to be called
-            // TODO Need to rationalise this to move code into methods of InternalEntityFactory.
-            //      The InternalEntityFactory.constructEntity is used in three places:
-            //       1. normal entity creation (through entityManager.createEntity)
-            //       2. rebind (i.e. here)
-            //       3. yaml parsing
-            //      Purpose is to create a new (unconfigured/uninitialised) entity, but that is
-            //      known about by the managementContext and that has things like the right id and 
-            //      a proxy for if another entity needs to reference it during the init phase.
+        if (InternalFactory.isNewStyle(entityClazz)) {
+            // Not using entityManager.createEntity(EntitySpec) because don't want init() to be called.
+            // Creates an uninitialized entity, but that has correct id + proxy.
             InternalEntityFactory entityFactory = managementContext.getEntityFactory();
-            Entity entity = entityFactory.constructEntity(entityClazz);
-            FlagUtils.setFieldsFromFlags(ImmutableMap.of("id", entityId), entity);
-            if (entity instanceof AbstractApplication) {
-                FlagUtils.setFieldsFromFlags(ImmutableMap.of("mgmt", managementContext), entity);
-            }
-            managementContext.prePreManage(entity);
-            ((AbstractEntity)entity).setManagementContext(managementContext);
-            
-            Class<?> entityInterface;
-            List<Class<?>> additionalInterfaces;
-            try {
-                entityInterface = managementContext.getEntityManager().getEntityTypeRegistry().getEntityTypeOf((Class)entityClazz);
-                additionalInterfaces = Reflections.getAllInterfaces(entityClazz);
-            } catch (IllegalArgumentException e) {
-                // TODO this can happen if it's an app with no annotation, for example; not nice catching exception
-                entityInterface = Entity.class;
-                additionalInterfaces = Reflections.getAllInterfaces(entityClazz);
-            }
-            EntitySpec<Entity> entitySpec = EntitySpec.create((Class)entityInterface)
-                    .additionalInterfaces(additionalInterfaces)
-                    .impl((Class)entityClazz)
-                    .id(entityId);
-
-            ((AbstractEntity)entity).setProxy(entityFactory.createEntityProxy(entitySpec, entity));
+            Entity entity = entityFactory.constructEntity(entityClazz, Reflections.getAllInterfaces(entityClazz), entityId);
             
             return entity;
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e07155ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index 2f000e8..c8112ee 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -36,7 +36,6 @@ import brooklyn.catalog.CatalogItem;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Application;
 import brooklyn.entity.Entity;
-import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.AbstractEntity;
 import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.basic.EntityInternal;
@@ -61,7 +60,6 @@ import brooklyn.util.javalang.Reflections;
 import brooklyn.util.text.Strings;
 
 import com.google.common.base.Function;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 
@@ -282,22 +280,11 @@ public class BrooklynComponentTemplateResolver {
         Class<? extends T> entityImpl = (spec.getImplementation() != null) ? spec.getImplementation() : mgmt.getEntityManager().getEntityTypeRegistry().getImplementedBy(spec.getType());
         InternalEntityFactory entityFactory = ((ManagementContextInternal)mgmt).getEntityFactory();
         T entity = entityFactory.constructEntity(entityImpl, spec);
-        if (entity instanceof AbstractApplication) {
-            FlagUtils.setFieldsFromFlags(ImmutableMap.of("mgmt", mgmt), entity);
-        }
 
-        // TODO Some of the code below could go into constructEntity?
-        if (spec.getId() != null) {
-            FlagUtils.setFieldsFromFlags(ImmutableMap.of("id", spec.getId()), entity);
-        }
         String planId = (String)spec.getConfig().get(BrooklynCampConstants.PLAN_ID.getConfigKey());
         if (planId != null) {
             ((EntityInternal)entity).setConfig(BrooklynCampConstants.PLAN_ID, planId);
         }
-        ((ManagementContextInternal)mgmt).prePreManage(entity);
-        ((AbstractEntity)entity).setManagementContext((ManagementContextInternal)mgmt);
-        
-        ((AbstractEntity)entity).setProxy(entityFactory.createEntityProxy(spec, entity));
         
         if (spec.getLocations().size() > 0) {
             ((AbstractEntity)entity).addLocations(spec.getLocations());


[3/8] git commit: Deprecate EntitySpec.id and LocationSpec.id

Posted by he...@apache.org.
Deprecate EntitySpec.id and LocationSpec.id

- Just let the management context decide what the id should be.
- Rebind goes through a different path.


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/91383179
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/91383179
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/91383179

Branch: refs/heads/master
Commit: 91383179bff219989c0f4a4f90d5f3d7e0360e94
Parents: 519bc9a
Author: Aled Sage <al...@gmail.com>
Authored: Mon Jul 14 12:47:25 2014 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Jul 14 23:45:19 2014 +0100

----------------------------------------------------------------------
 api/src/main/java/brooklyn/entity/proxying/EntitySpec.java    | 7 +++++++
 api/src/main/java/brooklyn/location/LocationSpec.java         | 7 +++++++
 .../src/test/java/brooklyn/entity/basic/DynamicGroupTest.java | 2 +-
 3 files changed, 15 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/91383179/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java b/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
index 1ea5fb6..2f67dbd 100644
--- a/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
+++ b/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
@@ -158,7 +158,10 @@ public class EntitySpec<T extends Entity> implements Serializable {
     
     /**
      * @return The id to use when creating the entity, or null if allow brooklyn to generate a unique id.
+    /**
+     * @deprecated since 0.7.0; instead let the management context pick a random+unique id
      */
+    @Deprecated
     public String getId() {
         return id;
     }
@@ -240,6 +243,10 @@ public class EntitySpec<T extends Entity> implements Serializable {
         return locations;
     }
 
+    /**
+     * @deprecated since 0.7.0; instead let the management context pick a random+unique id
+     */
+    @Deprecated
     public EntitySpec<T> id(String val) {
         checkMutable();
         id = val;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/91383179/api/src/main/java/brooklyn/location/LocationSpec.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/location/LocationSpec.java b/api/src/main/java/brooklyn/location/LocationSpec.java
index d9027b5..6f767c2 100644
--- a/api/src/main/java/brooklyn/location/LocationSpec.java
+++ b/api/src/main/java/brooklyn/location/LocationSpec.java
@@ -90,6 +90,10 @@ public class LocationSpec<T extends Location> implements Serializable {
         this.type = type;
     }
 
+    /**
+     * @deprecated since 0.7.0; instead let the management context pick a random+unique id
+     */
+    @Deprecated
     public LocationSpec<T> id(String val) {
         id = val;
         return this;
@@ -164,7 +168,10 @@ public class LocationSpec<T extends Location> implements Serializable {
     
     /**
      * @return The id of the location to be created, or null if brooklyn can auto-generate an id
+     * 
+     * @deprecated since 0.7.0; instead let the management context pick a random+unique id
      */
+    @Deprecated
     public String getId() {
         return id;
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/91383179/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java b/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java
index 1491210..00ed47a 100644
--- a/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java
+++ b/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java
@@ -293,7 +293,7 @@ public class DynamicGroupTest {
         });
 
         for (int i = 0; i < NUM_CYCLES; i++) {
-            final TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class).id("entity-" + i));
+            final TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
             LOG.debug("Created: entity {}", i);
             Asserts.succeedsEventually(new Runnable() {
                 public void run() {


[7/8] git commit: This closes #69

Posted by he...@apache.org.
This closes #69

Conflicts:
	core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java - imports


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/491eb609
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/491eb609
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/491eb609

Branch: refs/heads/master
Commit: 491eb609c01f6a285f226f043f6ee1512cfca820
Parents: d67444a 0194580
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Aug 1 16:11:53 2014 -0400
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Aug 1 16:11:53 2014 -0400

----------------------------------------------------------------------
 .../java/brooklyn/basic/BrooklynObject.java     |  31 +++
 api/src/main/java/brooklyn/entity/Entity.java   |  10 +-
 .../brooklyn/entity/proxying/EntitySpec.java    |   7 +
 .../entity/rebind/BrooklynObjectType.java       |  30 +++
 .../rebind/PersistenceExceptionHandler.java     |  13 +-
 .../entity/rebind/RebindExceptionHandler.java   |  43 +---
 .../main/java/brooklyn/location/Location.java   |   5 +-
 .../java/brooklyn/location/LocationSpec.java    |   7 +
 api/src/main/java/brooklyn/policy/Enricher.java |   3 +
 .../java/brooklyn/policy/EntityAdjunct.java     |   9 +-
 api/src/main/java/brooklyn/policy/Policy.java   |   3 +
 .../brooklyn/basic/AbstractBrooklynObject.java  |  33 +++
 .../brooklyn/basic/BrooklynObjectInternal.java  |  24 ++
 .../brooklyn/entity/basic/AbstractEntity.java   |  61 ++---
 .../brooklyn/entity/basic/EntityFunctions.java  |   7 +-
 .../brooklyn/entity/basic/EntityInternal.java   |   3 +-
 .../brooklyn/entity/basic/PolicyDescriptor.java |   2 +-
 .../entity/proxying/InternalEntityFactory.java  | 186 ++++++--------
 .../entity/proxying/InternalFactory.java        | 131 ++++++++++
 .../proxying/InternalLocationFactory.java       |  78 +-----
 .../entity/proxying/InternalPolicyFactory.java  | 109 +--------
 .../rebind/BasicEnricherRebindSupport.java      |   2 +-
 .../entity/rebind/BasicPolicyRebindSupport.java |   2 +-
 .../rebind/PeriodicDeltaChangeListener.java     |   8 +-
 .../rebind/PersistenceExceptionHandlerImpl.java |  29 +--
 .../rebind/RebindExceptionHandlerImpl.java      | 244 ++++---------------
 .../entity/rebind/RebindManagerImpl.java        |  74 ++----
 .../entity/rebind/dto/BrooklynMementoImpl.java  |  20 +-
 .../entity/rebind/dto/MementosGenerators.java   |   4 +-
 .../BrooklynMementoPersisterToFile.java         |   1 +
 .../BrooklynMementoPersisterToMultiFile.java    |  20 +-
 .../BrooklynMementoPersisterToObjectStore.java  |  97 +++-----
 .../location/basic/AbstractLocation.java        |  49 ++--
 .../location/basic/LocationInternal.java        |   3 +-
 .../policy/basic/AbstractEntityAdjunct.java     |  35 +--
 .../brooklyn/entity/basic/DynamicGroupTest.java |   2 +-
 .../brooklyn/entity/basic/EntitySpecTest.java   |   4 +-
 .../entity/rebind/RebindFailuresTest.java       |  17 +-
 .../rebind/RecordingRebindExceptionHandler.java | 113 ++-------
 .../loadbalancing/LoadBalancingPolicy.java      |   2 +-
 .../autoscaling/AutoScalerPolicyRebindTest.java |   2 +-
 .../BrooklynComponentTemplateResolver.java      |  13 -
 .../rest/transform/PolicyTransformer.java       |   2 +-
 .../rest/util/BrooklynRestResourceUtils.java    |   2 +-
 .../util/BrooklynRestResourceUtilsTest.java     |   2 +-
 45 files changed, 641 insertions(+), 901 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/491eb609/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/491eb609/api/src/main/java/brooklyn/location/LocationSpec.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/491eb609/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/491eb609/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
----------------------------------------------------------------------
diff --cc core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
index d6a31fb,7abf68f..4d53fbb
--- a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
@@@ -29,7 -30,7 +30,8 @@@ import org.slf4j.LoggerFactory
  
  import brooklyn.config.ConfigKey;
  import brooklyn.entity.Entity;
 +import brooklyn.entity.Group;
+ import brooklyn.entity.basic.AbstractApplication;
  import brooklyn.entity.basic.AbstractEntity;
  import brooklyn.entity.basic.BrooklynTaskTags;
  import brooklyn.entity.basic.EntityInternal;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/491eb609/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/491eb609/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/491eb609/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/491eb609/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/491eb609/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java
----------------------------------------------------------------------