public BrooklynMementoRawData transform()

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();
    }