in core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java [260:406]
public BrooklynMementoRawData transform(BrooklynMementoRawData rawData) throws Exception {
Map<String, String> entities = MutableMap.copyOf(rawData.getEntities());
Map<String, String> locations = MutableMap.copyOf(rawData.getLocations());
Map<String, String> policies = MutableMap.copyOf(rawData.getPolicies());
Map<String, String> enrichers = MutableMap.copyOf(rawData.getEnrichers());
Map<String, String> feeds = MutableMap.copyOf(rawData.getFeeds());
Map<String, String> catalogItems = MutableMap.copyOf(rawData.getCatalogItems());
Map<String, String> bundles = MutableMap.copyOf(rawData.getBundles());
Map<String, ByteSource> bundleJars = MutableMap.copyOf(rawData.getBundleJars());
// TODO @neykov asks whether transformers should be run in registration order,
// rather than in type order. TBD. (would be an easy change.)
// (they're all strings so it shouldn't matter!)
for (BrooklynObjectType type : BrooklynObjectType.values()) {
Set<String> itemsToDelete = ImmutableSet.copyOf(deletions.get(type));
Set<String> missing;
switch (type) {
case ENTITY:
missing = Sets.difference(itemsToDelete, entities.keySet());
if (missing.size() > 0) {
LOG.warn("Unable to delete " + type + " id"+Strings.s(missing.size())+" ("+missing+"), "
+ "because not found in persisted state (continuing)");
}
entities.keySet().removeAll(itemsToDelete);
break;
case LOCATION:
missing = Sets.difference(itemsToDelete, locations.keySet());
if (missing.size() > 0) {
LOG.warn("Unable to delete " + type + " id"+Strings.s(missing.size())+" ("+missing+"), "
+ "because not found in persisted state (continuing)");
}
locations.keySet().removeAll(itemsToDelete);
break;
case POLICY:
missing = Sets.difference(itemsToDelete, policies.keySet());
if (missing.size() > 0) {
LOG.warn("Unable to delete " + type + " id"+Strings.s(missing.size())+" ("+missing+"), "
+ "because not found in persisted state (continuing)");
}
policies.keySet().removeAll(itemsToDelete);
break;
case ENRICHER:
missing = Sets.difference(itemsToDelete, enrichers.keySet());
if (missing.size() > 0) {
LOG.warn("Unable to delete " + type + " id"+Strings.s(missing.size())+" ("+missing+"), "
+ "because not found in persisted state (continuing)");
}
enrichers.keySet().removeAll(itemsToDelete);
break;
case FEED:
missing = Sets.difference(itemsToDelete, feeds.keySet());
if (missing.size() > 0) {
LOG.warn("Unable to delete " + type + " id"+Strings.s(missing.size())+" ("+missing+"), "
+ "because not found in persisted state (continuing)");
}
feeds.keySet().removeAll(itemsToDelete);
break;
case CATALOG_ITEM:
missing = Sets.difference(itemsToDelete, catalogItems.keySet());
if (missing.size() > 0) {
LOG.warn("Unable to delete " + type + " id"+Strings.s(missing.size())+" ("+missing+"), "
+ "because not found in persisted state (continuing)");
}
catalogItems.keySet().removeAll(itemsToDelete);
break;
case MANAGED_BUNDLE:
missing = Sets.difference(itemsToDelete, bundles.keySet());
if (missing.size() > 0) {
LOG.warn("Unable to delete " + type + " id"+Strings.s(missing.size())+" ("+missing+"), "
+ "because not found in persisted state (continuing)");
}
// bundles have to be supplied by ID, but if so they can be deleted along with the jars
bundles.keySet().removeAll(itemsToDelete);
for (String item: itemsToDelete) {
bundleJars.remove(item+".jar");
}
break;
case UNKNOWN:
break; // no-op
default:
throw new IllegalStateException("Unexpected brooklyn object type "+type);
}
}
for (BrooklynObjectType type : BrooklynObjectType.values()) {
Collection<RawDataTransformer> transformers = rawDataTransformers.get(type);
for (RawDataTransformer transformer : transformers) {
switch (type) {
case ENTITY:
for (Map.Entry<String, String> entry : entities.entrySet()) {
entry.setValue(transformer.transform(entry.getValue()));
}
break;
case LOCATION:
for (Map.Entry<String, String> entry : locations.entrySet()) {
entry.setValue(transformer.transform(entry.getValue()));
}
break;
case POLICY:
for (Map.Entry<String, String> entry : policies.entrySet()) {
entry.setValue(transformer.transform(entry.getValue()));
}
break;
case ENRICHER:
for (Map.Entry<String, String> entry : enrichers.entrySet()) {
entry.setValue(transformer.transform(entry.getValue()));
}
break;
case FEED:
for (Map.Entry<String, String> entry : feeds.entrySet()) {
entry.setValue(transformer.transform(entry.getValue()));
}
break;
case CATALOG_ITEM:
for (Map.Entry<String, String> entry : catalogItems.entrySet()) {
entry.setValue(transformer.transform(entry.getValue()));
}
break;
case MANAGED_BUNDLE:
// transform of bundles and JARs not supported - you can delete, that's all
// TODO we should support a better way of adding/removing bundles,
// e.g. start in management mode where you can edit brooklyn-managed bundles
// for (Map.Entry<String, String> entry : bundles.entrySet()) {
// entry.setValue(transformer.transform(entry.getValue()));
// }
break;
case UNKNOWN:
break; // no-op
default:
throw new IllegalStateException("Unexpected brooklyn object type "+type);
}
}
}
return BrooklynMementoRawData.builder()
.planeId(rawData.getPlaneId())
.entities(entities)
.locations(locations)
.policies(policies)
.enrichers(enrichers)
.feeds(feeds)
.catalogItems(catalogItems)
.bundles(bundles)
.bundleJars(bundleJars)
.build();
}