Transformations of BrooklynMemento (persisted state)

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

Branch: refs/heads/master
Commit: d911997ecb0c67f037552bd8859bbf2d1d5455d9
Parents: 9dd50da
Author: Aled Sage <[email protected]>
Authored: Mon Sep 15 18:16:06 2014 +0100
Committer: Aled Sage <[email protected]>
Committed: Thu Sep 18 10:23:14 2014 +0100

----------------------------------------------------------------------
 .../transformer/BrooklynMementoTransformer.java |  14 +++
 .../DeleteOrphanedLocationsTransformer.java     | 106 +++++++++++++++++++
 2 files changed, 120 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d911997e/core/src/main/java/brooklyn/entity/rebind/transformer/BrooklynMementoTransformer.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/entity/rebind/transformer/BrooklynMementoTransformer.java
 
b/core/src/main/java/brooklyn/entity/rebind/transformer/BrooklynMementoTransformer.java
new file mode 100644
index 0000000..0a6fbb8
--- /dev/null
+++ 
b/core/src/main/java/brooklyn/entity/rebind/transformer/BrooklynMementoTransformer.java
@@ -0,0 +1,14 @@
+package brooklyn.entity.rebind.transformer;
+
+import brooklyn.mementos.BrooklynMemento;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Transforms the raw data of persisted state (e.g. of an entity).
+ */
+@Beta
+public interface BrooklynMementoTransformer {
+
+    public BrooklynMemento transform(BrooklynMemento input) throws Exception;
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d911997e/core/src/main/java/brooklyn/entity/rebind/transformer/impl/DeleteOrphanedLocationsTransformer.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/entity/rebind/transformer/impl/DeleteOrphanedLocationsTransformer.java
 
b/core/src/main/java/brooklyn/entity/rebind/transformer/impl/DeleteOrphanedLocationsTransformer.java
new file mode 100644
index 0000000..41b2065
--- /dev/null
+++ 
b/core/src/main/java/brooklyn/entity/rebind/transformer/impl/DeleteOrphanedLocationsTransformer.java
@@ -0,0 +1,106 @@
+package brooklyn.entity.rebind.transformer.impl;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import brooklyn.entity.rebind.dto.BrooklynMementoImpl;
+import brooklyn.entity.rebind.transformer.BrooklynMementoTransformer;
+import brooklyn.mementos.BrooklynMemento;
+import brooklyn.mementos.EntityMemento;
+import brooklyn.mementos.LocationMemento;
+import brooklyn.util.collections.MutableList;
+import brooklyn.util.collections.MutableMap;
+import brooklyn.util.collections.MutableSet;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+@Beta
+public class DeleteOrphanedLocationsTransformer implements 
BrooklynMementoTransformer {
+
+    // TODO Work in progress; untested code!
+    
+    public BrooklynMemento transform(BrooklynMemento input) throws Exception {
+        Set<String> referencedLocationIds = findReferencedLocationIds(input);
+        Set<String> unreferencedLocationIds = Sets.newLinkedHashSet();
+        List<String> toCheck = Lists.newLinkedList(input.getLocationIds());
+        
+        while (!toCheck.isEmpty()) {
+            String locationId = toCheck.remove(0);
+            List<String> locationsInHierarchy = MutableList.<String>builder()
+                    .add(locationId)
+                    .addAll(findLocationAncestors(input, locationId))
+                    .addAll(findLocationDescendents(input, locationId))
+                    .build();
+            
+            if (containsAny(referencedLocationIds, locationsInHierarchy)) {
+                // keep them all
+            } else {
+                unreferencedLocationIds.addAll(locationsInHierarchy);
+            }
+            toCheck.removeAll(locationsInHierarchy);
+        }
+        
+        // TODO What about brooklyn version?
+        return BrooklynMementoImpl.builder()
+                .applicationIds(input.getApplicationIds())
+                .topLevelLocationIds(MutableSet.<String>builder()
+                        .addAll(input.getTopLevelLocationIds())
+                        .removeAll(unreferencedLocationIds)
+                        .build())
+                .entities(input.getEntityMementos())
+                .locations(MutableMap.<String, LocationMemento>builder()
+                        .putAll(input.getLocationMementos())
+                        .removeAll(unreferencedLocationIds)
+                        .build())
+                .policies(input.getPolicyMementos())
+                .enricheres(input.getEnricherMementos())
+                .build();
+    }
+    
+    public boolean containsAny(Collection<?> container, Iterable<?> 
contenders) {
+        for (Object contender : contenders) {
+            if (container.contains(contender)) return true;
+        }
+        return false;
+    }
+    
+    public Set<String> findReferencedLocationIds(BrooklynMemento input) {
+        Set<String> result = Sets.newLinkedHashSet();
+        
+        for (EntityMemento entity : input.getEntityMementos().values()) {
+            result.addAll(entity.getLocations());
+        }
+        return result;
+    }
+    
+    public Set<String> findLocationAncestors(BrooklynMemento input, String 
locationId) {
+        Set<String> result = Sets.newLinkedHashSet();
+        
+        String parentId = null;
+        do {
+            LocationMemento memento = input.getLocationMemento(locationId);
+            parentId = memento.getParent();
+            if (parentId != null) result.add(parentId);
+        } while (parentId != null);
+
+        return result;
+    }
+    
+    public Set<String> findLocationDescendents(BrooklynMemento input, String 
locationId) {
+        Set<String> result = Sets.newLinkedHashSet();
+        List<String> tovisit = Lists.newLinkedList();
+        
+        tovisit.add(locationId);
+        while (!tovisit.isEmpty()) {
+            LocationMemento memento = 
input.getLocationMemento(tovisit.remove(0));
+            List<String> children = memento.getChildren();
+            result.addAll(children);
+            tovisit.addAll(children);
+        };
+
+        return result;
+    }
+}

Reply via email to