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; + } +}
