http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
 
b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
deleted file mode 100644
index 931c2e7..0000000
--- 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * 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 org.apache.brooklyn.camp.brooklyn.spi.creation;
-
-import java.util.List;
-import java.util.Set;
-
-import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.camp.CampPlatform;
-import org.apache.brooklyn.camp.brooklyn.api.AssemblyTemplateSpecInstantiator;
-import org.apache.brooklyn.camp.spi.Assembly;
-import org.apache.brooklyn.camp.spi.AssemblyTemplate;
-import org.apache.brooklyn.camp.spi.PlatformComponentTemplate;
-import org.apache.brooklyn.camp.spi.collection.ResolvableLink;
-import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
-import org.apache.brooklyn.core.mgmt.EntityManagementUtils.CreationResult;
-import org.apache.brooklyn.core.mgmt.HasBrooklynManagementContext;
-import 
org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContext;
-import org.apache.brooklyn.util.collections.MutableSet;
-import org.apache.brooklyn.util.core.flags.TypeCoercions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.Lists;
-
-public class BrooklynAssemblyTemplateInstantiator implements 
AssemblyTemplateSpecInstantiator {
-
-    private static final Logger log = 
LoggerFactory.getLogger(BrooklynAssemblyTemplateInstantiator.class);
-
-    public static final String NEVER_UNWRAP_APPS_PROPERTY = "wrappedApp";
-
-    @Override
-    public Assembly instantiate(AssemblyTemplate template, CampPlatform 
platform) {
-        Application app = create(template, platform);
-        CreationResult<Application, Void> start = 
EntityManagementUtils.start(app);
-        log.debug("CAMP created "+app+"; starting in "+start.task());
-        return platform.assemblies().get(app.getApplicationId());
-    }
-
-    private Application create(AssemblyTemplate template, CampPlatform 
platform) {
-        ManagementContext mgmt = getManagementContext(platform);
-        BrooklynClassLoadingContext loader = 
JavaBrooklynClassLoadingContext.create(mgmt);
-        EntitySpec<? extends Application> spec = 
createApplicationSpec(template, platform, loader, MutableSet.<String>of());
-        Application instance = mgmt.getEntityManager().createEntity(spec);
-        log.info("CAMP created '{}'", instance);
-        return instance;
-    }
-
-    @Override
-    public List<EntitySpec<?>> createServiceSpecs(
-            AssemblyTemplate template,
-            CampPlatform platform, BrooklynClassLoadingContext itemLoader,
-            Set<String> encounteredRegisteredTypeIds) {
-        return buildTemplateServicesAsSpecs(itemLoader, template, platform, 
encounteredRegisteredTypeIds);
-    }
-
-    @Override
-    public EntitySpec<? extends Application> createApplicationSpec(
-            AssemblyTemplate template,
-            CampPlatform platform,
-            BrooklynClassLoadingContext loader,
-            Set<String> encounteredTypeSymbolicNames) {
-        log.debug("CAMP creating application instance for {} ({})", 
template.getId(), template);
-
-        // AssemblyTemplates created via PDP, _specifying_ then entities to 
put in
-
-        EntitySpec<? extends Application> app = 
CampInternalUtils.createWrapperApp(template, loader);
-        app.configure(EntityManagementUtils.WRAPPER_APP_MARKER, Boolean.TRUE);
-
-        // first build the children into an empty shell app
-        List<EntitySpec<?>> childSpecs = createServiceSpecs(template, 
platform, loader, encounteredTypeSymbolicNames);
-        for (EntitySpec<?> childSpec : childSpecs) {
-            // children get parsed and unwrapped irrespective of the 
NEVER_UNWRAP_APPS setting;
-            // we could support a NEVER_UNWRAP_NESTED_ENTITIES item but i 
don't know if there's a use case
-            app.child(EntityManagementUtils.unwrapEntity(childSpec));
-        }
-
-        if (allowedToUnwrap(template, app)) {
-            app = EntityManagementUtils.unwrapApplication(app);
-        }
-
-        return app;
-    }
-
-    private boolean allowedToUnwrap(AssemblyTemplate template, EntitySpec<? 
extends Application> app) {
-        return 
!(Boolean.TRUE.equals(TypeCoercions.coerce(template.getCustomAttributes().get(NEVER_UNWRAP_APPS_PROPERTY),
 Boolean.class)));
-    }
-
-    private List<EntitySpec<?>> 
buildTemplateServicesAsSpecs(BrooklynClassLoadingContext loader, 
AssemblyTemplate template, CampPlatform platform, Set<String> 
encounteredRegisteredTypeIds) {
-        List<EntitySpec<?>> result = Lists.newArrayList();
-
-        for (ResolvableLink<PlatformComponentTemplate> ctl: 
template.getPlatformComponentTemplates().links()) {
-            PlatformComponentTemplate appChildComponentTemplate = 
ctl.resolve();
-            BrooklynComponentTemplateResolver entityResolver = 
BrooklynComponentTemplateResolver.Factory.newInstance(loader, 
appChildComponentTemplate);
-            EntitySpec<?> spec = 
entityResolver.resolveSpec(encounteredRegisteredTypeIds);
-            result.add(spec);
-        }
-        return result;
-    }
-
-    private static ManagementContext getManagementContext(CampPlatform 
platform) {
-        return 
((HasBrooklynManagementContext)platform).getBrooklynManagementContext();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
 
b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
deleted file mode 100644
index fdc2559..0000000
--- 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * 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 org.apache.brooklyn.camp.brooklyn.spi.creation;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.ServiceLoader;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.annotation.Nullable;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.api.typereg.RegisteredType;
-import org.apache.brooklyn.camp.brooklyn.BrooklynCampConstants;
-import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
-import 
org.apache.brooklyn.camp.brooklyn.spi.creation.service.CampServiceSpecResolver;
-import 
org.apache.brooklyn.camp.brooklyn.spi.creation.service.ServiceTypeResolver;
-import 
org.apache.brooklyn.camp.brooklyn.spi.creation.service.ServiceTypeResolverAdaptor;
-import org.apache.brooklyn.camp.spi.AbstractResource;
-import org.apache.brooklyn.camp.spi.ApplicationComponentTemplate;
-import org.apache.brooklyn.camp.spi.AssemblyTemplate;
-import org.apache.brooklyn.camp.spi.PlatformComponentTemplate;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.mgmt.BrooklynTags;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
-import org.apache.brooklyn.core.mgmt.ManagementContextInjectable;
-import 
org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContext;
-import org.apache.brooklyn.core.resolve.entity.EntitySpecResolver;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.collections.MutableSet;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.core.flags.FlagUtils;
-import 
org.apache.brooklyn.util.core.flags.FlagUtils.FlagConfigKeyAndValueRecord;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.guava.Maybe;
-import org.apache.brooklyn.util.net.Urls;
-import org.apache.brooklyn.util.text.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-
-/**
- * This generates instances of a template resolver that use a {@link 
ServiceTypeResolver}
- * to parse the {@code serviceType} line in the template.
- */
-@SuppressWarnings("deprecation")  // Because of ServiceTypeResolver
-public class BrooklynComponentTemplateResolver {
-
-    private static final Logger log = 
LoggerFactory.getLogger(BrooklynComponentTemplateResolver.class);
-
-    private final BrooklynClassLoadingContext loader;
-    private final ManagementContext mgmt;
-    private final ConfigBag attrs;
-    private final Maybe<AbstractResource> template;
-    private final BrooklynYamlTypeInstantiator.Factory yamlLoader;
-    private final String type;
-    private final AtomicBoolean alreadyBuilt = new AtomicBoolean(false);
-    private final EntitySpecResolver serviceSpecResolver;
-
-    private BrooklynComponentTemplateResolver(BrooklynClassLoadingContext 
loader, ConfigBag attrs, AbstractResource optionalTemplate, String type) {
-        this.loader = loader;
-        this.mgmt = loader.getManagementContext();
-        this.attrs = ConfigBag.newInstanceCopying(attrs);
-        this.template = Maybe.fromNullable(optionalTemplate);
-        this.yamlLoader = new BrooklynYamlTypeInstantiator.Factory(loader, 
this);
-        this.type = type;
-        this.serviceSpecResolver = new CampServiceSpecResolver(mgmt, 
getServiceTypeResolverOverrides());
-    }
-
-    // Deprecated because want to keep as much of the state private as possible
-    // Can't remove them because used by ServiceTypeResolver implementations
-    /** @deprecated since 0.9.0 */
-    @Deprecated public ManagementContext getManagementContext() { return mgmt; 
}
-    @Deprecated public ConfigBag getAttrs() { return attrs; }
-    @Deprecated public BrooklynYamlTypeInstantiator.Factory getYamlLoader() { 
return yamlLoader; }
-    @Deprecated public String getDeclaredType() { return type; }
-
-    public static class Factory {
-
-        public static BrooklynComponentTemplateResolver 
newInstance(BrooklynClassLoadingContext context, Map<String, ?> childAttrs) {
-            return newInstance(context, ConfigBag.newInstance(childAttrs), 
null);
-        }
-
-        public static BrooklynComponentTemplateResolver 
newInstance(BrooklynClassLoadingContext context, AbstractResource template) {
-            return newInstance(context, 
ConfigBag.newInstance(template.getCustomAttributes()), template);
-        }
-
-        public static BrooklynComponentTemplateResolver 
newInstance(BrooklynClassLoadingContext context, String serviceType) {
-            return newInstance(context, 
ConfigBag.newInstance().configureStringKey("serviceType", serviceType), null);
-        }
-
-        private static BrooklynComponentTemplateResolver 
newInstance(BrooklynClassLoadingContext context, ConfigBag attrs, 
AbstractResource optionalTemplate) {
-            String type = getDeclaredType(null, optionalTemplate, attrs);
-            return new BrooklynComponentTemplateResolver(context, attrs, 
optionalTemplate, type);
-        }
-
-        private static String getDeclaredType(String knownServiceType, 
AbstractResource optionalTemplate, @Nullable ConfigBag attrs) {
-            String type = knownServiceType;
-            if (type==null && optionalTemplate!=null) {
-                type = optionalTemplate.getType();
-                if (type.equals(AssemblyTemplate.CAMP_TYPE) || 
type.equals(PlatformComponentTemplate.CAMP_TYPE) || 
type.equals(ApplicationComponentTemplate.CAMP_TYPE))
-                    // ignore these values for the type; only subclasses are 
interesting
-                    type = null;
-            }
-            if (type==null) type = extractServiceTypeAttribute(attrs);
-            return type;
-        }
-
-        private static String extractServiceTypeAttribute(@Nullable ConfigBag 
attrs) {
-            return 
BrooklynYamlTypeInstantiator.InstantiatorFromKey.extractTypeName("service", 
attrs).orNull();
-        }
-    }
-
-    public boolean canResolve() {
-        return serviceSpecResolver.accepts(type, loader);
-    }
-
-    public <T extends Entity> EntitySpec<T> resolveSpec(Set<String> 
encounteredRegisteredTypeSymbolicNames) {
-        if (alreadyBuilt.getAndSet(true))
-            throw new IllegalStateException("Spec can only be used once: 
"+this);
-
-        EntitySpec<?> spec = serviceSpecResolver.resolve(type, loader, 
encounteredRegisteredTypeSymbolicNames);
-
-        if (spec == null) {
-            // Try to provide some troubleshooting details
-            final String msgDetails;
-            RegisteredType item = 
mgmt.getTypeRegistry().get(Strings.removeFromStart(type, "catalog:"));
-            String proto = Urls.getProtocol(type);
-            if (item != null && 
encounteredRegisteredTypeSymbolicNames.contains(item.getSymbolicName())) {
-                msgDetails = "Cycle between catalog items detected, starting 
from " + type +
-                        ". Other catalog items being resolved up the stack are 
" + encounteredRegisteredTypeSymbolicNames +
-                        ". Tried loading it as a Java class instead but 
failed.";
-            } else if (proto != null) {
-                msgDetails = "The reference " + type + " looks like a URL 
(running the CAMP Brooklyn assembly-template instantiator) but the protocol " +
-                        proto + " isn't white listed (" + 
BrooklynCampConstants.YAML_URL_PROTOCOL_WHITELIST + "). " +
-                        "It's also neither a catalog item nor a java type.";
-            } else {
-                msgDetails = "No resolver knew how to handle it. Using 
resolvers: " + serviceSpecResolver;
-            }
-            throw new IllegalStateException("Unable to create spec for type " 
+ type + ". " + msgDetails);
-        }
-        spec = EntityManagementUtils.unwrapEntity(spec);
-
-        populateSpec(spec, encounteredRegisteredTypeSymbolicNames);
-
-        @SuppressWarnings("unchecked")
-        EntitySpec<T> typedSpec = (EntitySpec<T>) spec;
-        return typedSpec;
-    }
-
-    private List<EntitySpecResolver> getServiceTypeResolverOverrides() {
-        List<EntitySpecResolver> overrides = new ArrayList<>();
-        ServiceLoader<ServiceTypeResolver> loader = 
ServiceLoader.load(ServiceTypeResolver.class, mgmt.getCatalogClassLoader());
-        for (ServiceTypeResolver resolver : loader) {
-           overrides.add(new ServiceTypeResolverAdaptor(this, resolver));
-        }
-        return overrides;
-    }
-
-    @SuppressWarnings("unchecked")
-    private <T extends Entity> void populateSpec(EntitySpec<T> spec, 
Set<String> encounteredRegisteredTypeIds) {
-        String name, source=null, templateId=null, planId=null;
-        if (template.isPresent()) {
-            name = template.get().getName();
-            templateId = template.get().getId();
-            source = template.get().getSourceCode();
-        } else {
-            name = (String)attrs.getStringKey("name");
-        }
-        planId = (String)attrs.getStringKey("id");
-        if (planId==null)
-            planId = (String) 
attrs.getStringKey(BrooklynCampConstants.PLAN_ID_FLAG);
-
-        Object childrenObj = 
attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_CHILDREN);
-        if (childrenObj != null) {
-            Iterable<Map<String,?>> children = 
(Iterable<Map<String,?>>)childrenObj;
-            for (Map<String,?> childAttrs : children) {
-                BrooklynComponentTemplateResolver entityResolver = 
BrooklynComponentTemplateResolver.Factory.newInstance(loader, childAttrs);
-                // encounteredRegisteredTypeIds must contain the items 
currently being loaded (the dependency chain),
-                // but not parent items in this type already resolved.
-                EntitySpec<? extends Entity> childSpec = 
entityResolver.resolveSpec(encounteredRegisteredTypeIds);
-                spec.child(EntityManagementUtils.unwrapEntity(childSpec));
-            }
-        }
-
-        if (source!=null) {
-            spec.tag(BrooklynTags.newYamlSpecTag(source));
-        }
-
-        if (!Strings.isBlank(name))
-            spec.displayName(name);
-        if (templateId != null)
-            spec.configure(BrooklynCampConstants.TEMPLATE_ID, templateId);
-        if (planId != null)
-            spec.configure(BrooklynCampConstants.PLAN_ID, planId);
-
-        List<Location> locations = new 
BrooklynYamlLocationResolver(mgmt).resolveLocations(attrs.getAllConfig(), true);
-        if (locations != null) {
-            // override locations defined in the type if locations are 
specified here
-            // empty list can be used by caller to clear, so they are inherited
-            spec.clearLocations();
-            spec.locations(locations);
-        }
-
-        decorateSpec(spec, encounteredRegisteredTypeIds);
-    }
-
-    private <T extends Entity> void decorateSpec(EntitySpec<T> spec, 
Set<String> encounteredRegisteredTypeIds) {
-        new 
BrooklynEntityDecorationResolver.PolicySpecResolver(yamlLoader).decorate(spec, 
attrs);
-        new 
BrooklynEntityDecorationResolver.EnricherSpecResolver(yamlLoader).decorate(spec,
 attrs);
-        new 
BrooklynEntityDecorationResolver.InitializerResolver(yamlLoader).decorate(spec, 
attrs);
-        new 
BrooklynEntityDecorationResolver.SpecParameterResolver(yamlLoader).decorate(spec,
 attrs);
-
-        configureEntityConfig(spec, encounteredRegisteredTypeIds);
-    }
-
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    private void configureEntityConfig(EntitySpec<?> spec, Set<String> 
encounteredRegisteredTypeIds) {
-        // first take *recognised* flags and config keys from the top-level, 
and put them in the bag (of brooklyn.config)
-        // attrs will contain only brooklyn.xxx properties when coming from 
BrooklynEntityMatcher.
-        // Any top-level flags will go into "brooklyn.flags". When resolving a 
spec from $brooklyn:entitySpec
-        // top level flags remain in place. Have to support both cases.
-
-        ConfigBag bag = ConfigBag.newInstance((Map<Object, Object>) 
attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_CONFIG));
-        ConfigBag bagFlags = ConfigBag.newInstanceCopying(attrs);
-        if (attrs.containsKey(BrooklynCampReservedKeys.BROOKLYN_FLAGS)) {
-            bagFlags.putAll((Map<String, Object>) 
attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_FLAGS));
-        }
-
-        Collection<FlagConfigKeyAndValueRecord> topLevelApparentConfig = 
findAllFlagsAndConfigKeys(spec, bagFlags);
-        for (FlagConfigKeyAndValueRecord r: topLevelApparentConfig) {
-            if (r.getConfigKeyMaybeValue().isPresent())
-                bag.putIfAbsent((ConfigKey)r.getConfigKey(), 
r.getConfigKeyMaybeValue().get());
-            if (r.getFlagMaybeValue().isPresent())
-                bag.putAsStringKeyIfAbsent(r.getFlagName(), 
r.getFlagMaybeValue().get());
-        }
-
-        // now set configuration for all the items in the bag
-        Collection<FlagConfigKeyAndValueRecord> records = 
findAllFlagsAndConfigKeys(spec, bag);
-        Set<String> keyNamesUsed = new LinkedHashSet<String>();
-        for (FlagConfigKeyAndValueRecord r: records) {
-            if (r.getFlagMaybeValue().isPresent()) {
-                Object transformed = new SpecialFlagsTransformer(loader, 
encounteredRegisteredTypeIds).apply(r.getFlagMaybeValue().get());
-                spec.configure(r.getFlagName(), transformed);
-                keyNamesUsed.add(r.getFlagName());
-            }
-            if (r.getConfigKeyMaybeValue().isPresent()) {
-                Object transformed = new SpecialFlagsTransformer(loader, 
encounteredRegisteredTypeIds).apply(r.getConfigKeyMaybeValue().get());
-                spec.configure((ConfigKey<Object>)r.getConfigKey(), 
transformed);
-                keyNamesUsed.add(r.getConfigKey().getName());
-            }
-        }
-
-        // set unused keys as anonymous config keys -
-        // they aren't flags or known config keys, so must be passed as config 
keys in order for
-        // EntitySpec to know what to do with them (as they are passed to the 
spec as flags)
-        for (String key: MutableSet.copyOf(bag.getUnusedConfig().keySet())) {
-            // we don't let a flag with the same name as a config key override 
the config key
-            // (that's why we check whether it is used)
-            if (!keyNamesUsed.contains(key)) {
-                Object transformed = new SpecialFlagsTransformer(loader, 
encounteredRegisteredTypeIds).apply(bag.getStringKey(key));
-                spec.configure(ConfigKeys.newConfigKey(Object.class, 
key.toString()), transformed);
-            }
-        }
-    }
-
-    /**
-     * Searches for config keys in the type, additional interfaces and the 
implementation (if specified)
-     */
-    private Collection<FlagConfigKeyAndValueRecord> 
findAllFlagsAndConfigKeys(EntitySpec<?> spec, ConfigBag bagFlags) {
-        Set<FlagConfigKeyAndValueRecord> allKeys = MutableSet.of();
-        allKeys.addAll(FlagUtils.findAllFlagsAndConfigKeys(null, 
spec.getType(), bagFlags));
-        if (spec.getImplementation() != null) {
-            allKeys.addAll(FlagUtils.findAllFlagsAndConfigKeys(null, 
spec.getImplementation(), bagFlags));
-        }
-        for (Class<?> iface : spec.getAdditionalInterfaces()) {
-            allKeys.addAll(FlagUtils.findAllFlagsAndConfigKeys(null, iface, 
bagFlags));
-        }
-        
allKeys.addAll(FlagUtils.findAllParameterConfigKeys(spec.getParameters(), 
bagFlags));
-        return allKeys;
-    }
-
-    private static class SpecialFlagsTransformer implements Function<Object, 
Object> {
-        protected final ManagementContext mgmt;
-        /* TODO find a way to make do without loader here?
-         * it is not very nice having to serialize it; but serialization of 
BLCL is now relatively clean.
-         *
-         * it is only used to instantiate classes, and now most types should 
be registered;
-         * the notable exception is when one entity in a bundle is creating 
another in the same bundle,
-         * it wants to use his bundle CLC to do that.  but we can set up some 
unique reference to the entity
-         * which can be used to find it from mgmt, rather than pass the loader.
-         */
-        private BrooklynClassLoadingContext loader = null;
-        private Set<String> encounteredRegisteredTypeIds;
-
-        public SpecialFlagsTransformer(BrooklynClassLoadingContext loader, 
Set<String> encounteredRegisteredTypeIds) {
-            this.loader = loader;
-            mgmt = loader.getManagementContext();
-            this.encounteredRegisteredTypeIds = encounteredRegisteredTypeIds;
-        }
-        @Override
-        public Object apply(Object input) {
-            if (input instanceof Map)
-                return transformSpecialFlags((Map<?, ?>)input);
-            else if (input instanceof Set<?>)
-                return 
MutableSet.copyOf(transformSpecialFlags((Iterable<?>)input));
-            else if (input instanceof List<?>)
-                return 
MutableList.copyOf(transformSpecialFlags((Iterable<?>)input));
-            else if (input instanceof Iterable<?>)
-                return transformSpecialFlags((Iterable<?>)input);
-            else
-                return transformSpecialFlags((Object)input);
-        }
-
-        protected Map<?, ?> transformSpecialFlags(Map<?, ?> flag) {
-            return Maps.transformValues(flag, this);
-        }
-
-        protected Iterable<?> transformSpecialFlags(Iterable<?> flag) {
-            return Iterables.transform(flag, this);
-        }
-
-        protected BrooklynClassLoadingContext getLoader() {
-            if (loader!=null) return loader;
-            // TODO currently loader will non-null unless someone has messed 
with the rebind files,
-            // but we'd like to get rid of it; ideally we'd have a reference 
to the entity.
-            // for now, this is a slightly naff way to do it, if we have to 
set loader=null as a workaround
-            Entity entity = 
BrooklynTaskTags.getTargetOrContextEntity(Tasks.current());
-            if (entity!=null) return 
CatalogUtils.getClassLoadingContext(entity);
-            return JavaBrooklynClassLoadingContext.create(mgmt);
-        }
-
-        /**
-         * Makes additional transformations to the given flag with the extra 
knowledge of the flag's management context.
-         * @return The modified flag, or the flag unchanged.
-         */
-        protected Object transformSpecialFlags(Object flag) {
-            if (flag instanceof EntitySpecConfiguration) {
-                EntitySpecConfiguration specConfig = (EntitySpecConfiguration) 
flag;
-                // TODO: This should called from 
BrooklynAssemblyTemplateInstantiator.configureEntityConfig
-                // And have transformSpecialFlags(Object flag, 
ManagementContext mgmt) drill into the Object flag if it's a map or iterable?
-                @SuppressWarnings("unchecked")
-                Map<String, Object> resolvedConfig = (Map<String, 
Object>)transformSpecialFlags(specConfig.getSpecConfiguration());
-                specConfig.setSpecConfiguration(resolvedConfig);
-                EntitySpec<?> entitySpec = Factory.newInstance(getLoader(), 
specConfig.getSpecConfiguration()).resolveSpec(encounteredRegisteredTypeIds);
-                
-                return EntityManagementUtils.unwrapEntity(entitySpec);
-            }
-            if (flag instanceof ManagementContextInjectable) {
-                log.debug("Injecting Brooklyn management context info object: 
{}", flag);
-                ((ManagementContextInjectable) 
flag).setManagementContext(loader.getManagementContext());
-            }
-
-            return flag;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
 
b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
deleted file mode 100644
index 4913cb1..0000000
--- 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * 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 org.apache.brooklyn.camp.brooklyn.spi.creation;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.EntityInitializer;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.objs.SpecParameter;
-import org.apache.brooklyn.api.policy.Policy;
-import org.apache.brooklyn.api.policy.PolicySpec;
-import org.apache.brooklyn.api.sensor.Enricher;
-import org.apache.brooklyn.api.sensor.EnricherSpec;
-import org.apache.brooklyn.api.typereg.RegisteredType;
-import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
-import 
org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynYamlTypeInstantiator.InstantiatorFromKey;
-import org.apache.brooklyn.core.objs.BasicSpecParameter;
-import org.apache.brooklyn.core.typereg.RegisteredTypeLoadingContexts;
-import org.apache.brooklyn.core.typereg.RegisteredTypes;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.guava.Maybe;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-
-/**
- * Pattern for resolving "decorations" on service specs / entity specs, such 
as policies, enrichers, etc.
- * @since 0.7.0
- */
-@Beta
-public abstract class BrooklynEntityDecorationResolver<DT> {
-
-    public final BrooklynYamlTypeInstantiator.Factory instantiator;
-    
-    protected 
BrooklynEntityDecorationResolver(BrooklynYamlTypeInstantiator.Factory 
instantiator) {
-        this.instantiator = instantiator;
-    }
-    
-    public abstract void decorate(EntitySpec<?> entitySpec, ConfigBag attrs);
-
-    protected List<? extends DT> 
buildListOfTheseDecorationsFromEntityAttributes(ConfigBag attrs) {
-        Object value = getDecorationAttributeJsonValue(attrs); 
-        if (value==null) return MutableList.of();
-        if (value instanceof Iterable) {
-            return buildListOfTheseDecorationsFromIterable((Iterable<?>)value);
-        } else {
-            // in future may support types other than iterables here, 
-            // e.g. a map short form where the key is the type
-            throw new IllegalArgumentException(getDecorationKind()+" body 
should be iterable, not " + value.getClass());
-        }
-    }
-
-    protected Map<?,?> checkIsMap(Object decorationJson) {
-        if (!(decorationJson instanceof Map))
-            throw new IllegalArgumentException(getDecorationKind()+" value 
must be a Map, not " + 
-                (decorationJson==null ? null : decorationJson.getClass()) );
-        return (Map<?,?>) decorationJson;
-    }
-
-    protected List<DT> buildListOfTheseDecorationsFromIterable(Iterable<?> 
value) {
-        List<DT> decorations = MutableList.of();
-        for (Object decorationJson: value)
-            addDecorationFromJsonMap(checkIsMap(decorationJson), decorations);
-        return decorations;
-    }
-
-    protected abstract String getDecorationKind();
-    protected abstract Object getDecorationAttributeJsonValue(ConfigBag attrs);
-    
-    /** creates and adds decorations from the given json to the given 
collection; 
-     * default impl requires a map and calls {@link 
#addDecorationFromJsonMap(Map, List)} */
-    protected void addDecorationFromJson(Object decorationJson, List<DT> 
decorations) {
-        addDecorationFromJsonMap(checkIsMap(decorationJson), decorations);
-    }
-    protected abstract void addDecorationFromJsonMap(Map<?,?> decorationJson, 
List<DT> decorations);
-    
-
-    public static class PolicySpecResolver extends 
BrooklynEntityDecorationResolver<PolicySpec<?>> {
-        
-        public PolicySpecResolver(BrooklynYamlTypeInstantiator.Factory loader) 
{ super(loader); }
-        @Override protected String getDecorationKind() { return "Policy"; }
-
-        @Override
-        public void decorate(EntitySpec<?> entitySpec, ConfigBag attrs) {
-            
entitySpec.policySpecs(buildListOfTheseDecorationsFromEntityAttributes(attrs));
-        }
-        
-        @Override
-        protected Object getDecorationAttributeJsonValue(ConfigBag attrs) {
-            return 
attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_POLICIES);
-        }
-
-        @Override
-        protected void addDecorationFromJsonMap(Map<?, ?> decorationJson, 
List<PolicySpec<?>> decorations) {
-            InstantiatorFromKey decoLoader = 
instantiator.from(decorationJson).prefix("policy");
-
-            String policyType = decoLoader.getTypeName().get();
-            ManagementContext mgmt = 
instantiator.loader.getManagementContext();
-            
-            Maybe<RegisteredType> item = 
RegisteredTypes.tryValidate(mgmt.getTypeRegistry().get(policyType), 
RegisteredTypeLoadingContexts.spec(Policy.class));
-            PolicySpec<?> spec;
-            if (!item.isNull()) {
-                // throw error if absent for any reason other than null
-                spec = mgmt.getTypeRegistry().createSpec(item.get(), null, 
PolicySpec.class);
-            } else {
-                Class<? extends Policy> type = 
decoLoader.getType(Policy.class);
-                spec = PolicySpec.create(type)
-                        .parameters(BasicSpecParameter.fromClass(mgmt, type));
-            }
-            spec.configure( decoLoader.getConfigMap() );
-            decorations.add(spec);
-        }
-    }
-
-    public static class EnricherSpecResolver extends 
BrooklynEntityDecorationResolver<EnricherSpec<?>> {
-        
-        public EnricherSpecResolver(BrooklynYamlTypeInstantiator.Factory 
loader) { super(loader); }
-        @Override protected String getDecorationKind() { return "Enricher"; }
-
-        @Override
-        public void decorate(EntitySpec<?> entitySpec, ConfigBag attrs) {
-            
entitySpec.enricherSpecs(buildListOfTheseDecorationsFromEntityAttributes(attrs));
-        }
-        
-        @Override
-        protected Object getDecorationAttributeJsonValue(ConfigBag attrs) {
-            return 
attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_ENRICHERS);
-        }
-
-        @Override
-        protected void addDecorationFromJsonMap(Map<?, ?> decorationJson, 
List<EnricherSpec<?>> decorations) {
-            InstantiatorFromKey decoLoader = 
instantiator.from(decorationJson).prefix("enricher");
-            Class<? extends Enricher> type = 
decoLoader.getType(Enricher.class);
-            decorations.add(EnricherSpec.create(type)
-                .configure(decoLoader.getConfigMap())
-                
.parameters(BasicSpecParameter.fromClass(instantiator.loader.getManagementContext(),
 type)));
-        }
-    }
-    
-    public static class InitializerResolver extends 
BrooklynEntityDecorationResolver<EntityInitializer> {
-        
-        public InitializerResolver(BrooklynYamlTypeInstantiator.Factory 
loader) { super(loader); }
-        @Override protected String getDecorationKind() { return "Entity 
initializer"; }
-
-        @Override
-        public void decorate(EntitySpec<?> entitySpec, ConfigBag attrs) {
-            
entitySpec.addInitializers(buildListOfTheseDecorationsFromEntityAttributes(attrs));
-        }
-        
-        @Override
-        protected Object getDecorationAttributeJsonValue(ConfigBag attrs) {
-            return 
attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_INITIALIZERS);
-        }
-
-        @Override
-        protected void addDecorationFromJsonMap(Map<?, ?> decorationJson, 
List<EntityInitializer> decorations) {
-            
decorations.add(instantiator.from(decorationJson).prefix("initializer").newInstance(EntityInitializer.class));
-        }
-    }
-
-    // Not much value from extending from BrooklynEntityDecorationResolver, 
but let's not break the convention
-    public static class SpecParameterResolver extends 
BrooklynEntityDecorationResolver<SpecParameter<?>> {
-
-        protected SpecParameterResolver(BrooklynYamlTypeInstantiator.Factory 
instantiator) { super(instantiator); }
-        @Override protected String getDecorationKind() { return "Spec 
Parameter initializer"; }
-
-        @Override
-        public void decorate(EntitySpec<?> entitySpec, ConfigBag attrs) {
-            List<? extends SpecParameter<?>> explicitParams = 
buildListOfTheseDecorationsFromEntityAttributes(attrs);
-            // TODO see discussion at EntitySpec.parameters; 
-            // maybe we should instead inherit always, or 
-            // inherit except where it is set as config and then add the new 
explicit ones
-            if (!explicitParams.isEmpty()) {
-                entitySpec.parameters(explicitParams);
-            }
-            if (entitySpec.getParameters().isEmpty()) {
-                
entitySpec.parameters(BasicSpecParameter.fromSpec(instantiator.loader.getManagementContext(),
 entitySpec));
-            }
-        }
-
-        @Override
-        protected List<SpecParameter<?>> 
buildListOfTheseDecorationsFromIterable(Iterable<?> value) {
-            return 
BasicSpecParameter.fromConfigList(ImmutableList.copyOf(value), 
instantiator.loader);
-        }
-
-        @Override
-        protected Object getDecorationAttributeJsonValue(ConfigBag attrs) {
-            return 
attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_PARAMETERS);
-        }
-
-        @Override
-        protected void addDecorationFromJsonMap(Map<?, ?> decorationJson, 
List<SpecParameter<?>> decorations) {
-            throw new IllegalStateException("Not called");
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
 
b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
deleted file mode 100644
index 91a490a..0000000
--- 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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 org.apache.brooklyn.camp.brooklyn.spi.creation;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
-import org.apache.brooklyn.camp.spi.PlatformComponentTemplate;
-import org.apache.brooklyn.camp.spi.PlatformComponentTemplate.Builder;
-import org.apache.brooklyn.camp.spi.pdp.AssemblyTemplateConstructor;
-import org.apache.brooklyn.camp.spi.pdp.Service;
-import org.apache.brooklyn.camp.spi.resolve.PdpMatcher;
-import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
-import 
org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContext;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.text.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-public class BrooklynEntityMatcher implements PdpMatcher {
-
-    private static final Logger log = 
LoggerFactory.getLogger(BrooklynEntityMatcher.class);
-    
-    protected final ManagementContext mgmt;
-
-    public BrooklynEntityMatcher(ManagementContext bmc) {
-        this.mgmt = bmc;
-    }
-
-    @Override
-    public boolean accepts(Object deploymentPlanItem) {
-        return lookupType(deploymentPlanItem) != null;
-    }
-
-    /** returns the type of the given plan item, 
-     * typically whether a Service can be matched to a Brooklyn entity,
-     * or null if not supported */
-    protected String lookupType(Object deploymentPlanItem) {
-        if (deploymentPlanItem instanceof Service) {
-            Service service = (Service)deploymentPlanItem;
-
-            String serviceType = service.getServiceType();
-            if (serviceType==null) throw new NullPointerException("Service 
must declare a type ("+service+")");
-            BrooklynClassLoadingContext loader = 
BasicBrooklynCatalog.BrooklynLoaderTracker.getLoader();
-            if (loader == null) loader = 
JavaBrooklynClassLoadingContext.create(mgmt);
-            if (BrooklynComponentTemplateResolver.Factory.newInstance(loader, 
serviceType).canResolve())
-                return serviceType;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean apply(Object deploymentPlanItem, 
AssemblyTemplateConstructor atc) {
-        if (!(deploymentPlanItem instanceof Service)) return false;
-        
-        String type = lookupType(deploymentPlanItem);
-        if (type==null) return false;
-
-        log.debug("Item "+deploymentPlanItem+" being instantiated with "+type);
-
-        Object old = atc.getInstantiator();
-        if (old!=null && 
!old.equals(BrooklynAssemblyTemplateInstantiator.class)) {
-            log.warn("Can't mix Brooklyn entities with non-Brooklyn entities 
(at present): "+old);
-            return false;
-        }
-
-        // TODO should we build up a new type, BrooklynEntityComponentTemplate 
here
-        // complete w EntitySpec -- ie merge w 
BrooklynComponentTemplateResolver ?
-        
-        Builder<? extends PlatformComponentTemplate> builder = 
PlatformComponentTemplate.builder();
-        builder.type( type.indexOf(':')==-1 ? "brooklyn:"+type : type );
-        
-        // currently instantiator must be brooklyn at the ATC level
-        // optionally would be nice to support multiple/mixed instantiators, 
-        // ie at the component level, perhaps with the first one responsible 
for building the app
-        atc.instantiator(BrooklynAssemblyTemplateInstantiator.class);
-
-        String name = ((Service)deploymentPlanItem).getName();
-        if (!Strings.isBlank(name)) builder.name(name);
-        
-        // configuration
-        Map<String, Object> attrs = MutableMap.copyOf( 
((Service)deploymentPlanItem).getCustomAttributes() );
-
-        if (attrs.containsKey("id"))
-            builder.customAttribute("planId", attrs.remove("id"));
-
-        Object location = attrs.remove("location");
-        if (location!=null)
-            builder.customAttribute("location", location);
-        Object locations = attrs.remove("locations");
-        if (locations!=null)
-            builder.customAttribute("locations", locations);
-
-        MutableMap<Object, Object> brooklynFlags = MutableMap.of();
-        Object origBrooklynFlags = 
attrs.remove(BrooklynCampReservedKeys.BROOKLYN_FLAGS);
-        if (origBrooklynFlags!=null) {
-            if (!(origBrooklynFlags instanceof Map))
-                throw new IllegalArgumentException("brooklyn.flags must be a 
map of brooklyn flags");
-            brooklynFlags.putAll((Map<?,?>)origBrooklynFlags);
-        }
-
-        addCustomMapAttributeIfNonNull(builder, attrs, 
BrooklynCampReservedKeys.BROOKLYN_CONFIG);
-        addCustomListAttributeIfNonNull(builder, attrs, 
BrooklynCampReservedKeys.BROOKLYN_POLICIES);
-        addCustomListAttributeIfNonNull(builder, attrs, 
BrooklynCampReservedKeys.BROOKLYN_ENRICHERS);
-        addCustomListAttributeIfNonNull(builder, attrs, 
BrooklynCampReservedKeys.BROOKLYN_INITIALIZERS);
-        addCustomListAttributeIfNonNull(builder, attrs, 
BrooklynCampReservedKeys.BROOKLYN_CHILDREN);
-        addCustomListAttributeIfNonNull(builder, attrs, 
BrooklynCampReservedKeys.BROOKLYN_PARAMETERS);
-        addCustomMapAttributeIfNonNull(builder, attrs, 
BrooklynCampReservedKeys.BROOKLYN_CATALOG);
-
-        brooklynFlags.putAll(attrs);
-        if (!brooklynFlags.isEmpty()) {
-            builder.customAttribute(BrooklynCampReservedKeys.BROOKLYN_FLAGS, 
brooklynFlags);
-        }
-
-        atc.add(builder.build());
-
-        return true;
-    }
-
-    /**
-     * Looks for the given key in the map of attributes and adds it to the 
given builder
-     * as a custom attribute with type List.
-     * @throws java.lang.IllegalArgumentException if map[key] is not an 
instance of List
-     */
-    private void addCustomListAttributeIfNonNull(Builder<? extends 
PlatformComponentTemplate> builder, Map<?,?> attrs, String key) {
-        Object items = attrs.remove(key);
-        if (items != null) {
-            if (items instanceof List) {
-                List<?> itemList = (List<?>) items;
-                if (!itemList.isEmpty()) {
-                    builder.customAttribute(key, Lists.newArrayList(itemList));
-                }
-            } else {
-                throw new IllegalArgumentException(key + " must be a list, is: 
" + items.getClass().getName());
-            }
-        }
-    }
-
-    /**
-     * Looks for the given key in the map of attributes and adds it to the 
given builder
-     * as a custom attribute with type Map.
-     * @throws java.lang.IllegalArgumentException if map[key] is not an 
instance of Map
-     */
-    private void addCustomMapAttributeIfNonNull(Builder<? extends 
PlatformComponentTemplate> builder, Map<?,?> attrs, String key) {
-        Object items = attrs.remove(key);
-        if (items != null) {
-            if (items instanceof Map) {
-                Map<?, ?> itemMap = (Map<?, ?>) items;
-                if (!itemMap.isEmpty()) {
-                    builder.customAttribute(key, Maps.newHashMap(itemMap));
-                }
-            } else {
-                throw new IllegalArgumentException(key + " must be a map, is: 
" + items.getClass().getName());
-            }
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlLocationResolver.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlLocationResolver.java
 
b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlLocationResolver.java
deleted file mode 100644
index 2f8dd99..0000000
--- 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlLocationResolver.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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 org.apache.brooklyn.camp.brooklyn.spi.creation;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationDefinition;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.guava.Maybe;
-import org.apache.brooklyn.util.guava.Maybe.Absent;
-import org.apache.brooklyn.util.text.Strings;
-
-import com.google.common.collect.Iterables;
-
-public class BrooklynYamlLocationResolver {
-
-    protected final ManagementContext mgmt;
-
-    public BrooklynYamlLocationResolver(ManagementContext bmc) {
-        this.mgmt = bmc;
-    }
-
-    /** returns list of locations, if any were supplied, or null if none 
indicated */
-    @SuppressWarnings("unchecked")
-    public List<Location> resolveLocations(Map<? super String,?> attrs, 
boolean removeUsedAttributes) {
-        Object location = attrs.get("location");
-        Object locations = attrs.get("locations");
-
-        if (location==null && locations==null)
-            return null;
-        
-        Location locationFromString = null;
-        List<Location> locationsFromList = null;
-        
-        if (location!=null) {
-            if (location instanceof String) {
-                locationFromString = 
resolveLocationFromString((String)location);
-            } else if (location instanceof Map) {
-                locationFromString = 
resolveLocationFromMap((Map<?,?>)location);
-            } else {
-                throw new IllegalStateException("Illegal parameter for 
'location'; must be a string or map (but got "+location+")");
-            }
-        }
-        
-        if (locations!=null) {
-            if (!(locations instanceof Iterable))
-                throw new IllegalStateException("Illegal parameter for 
'locations'; must be an iterable (but got "+locations+")");
-            locationsFromList = resolveLocations( (Iterable<Object>)locations 
);
-        }
-        
-        if (locationFromString!=null && locationsFromList!=null) {
-            if (locationsFromList.size() != 1)
-                throw new IllegalStateException("Conflicting 'location' and 
'locations' ("+location+" and "+locations+"); "
-                    + "if both are supplied the list must have exactly one 
element being the same");
-            if (!locationFromString.equals( 
Iterables.getOnlyElement(locationsFromList) ))
-                throw new IllegalStateException("Conflicting 'location' and 
'locations' ("+location+" and "+locations+"); "
-                    + "different location specified in each");
-        } else if (locationFromString!=null) {
-            locationsFromList = Arrays.asList(locationFromString);
-        }
-        
-        return locationsFromList;
-    }
-
-    public List<Location> resolveLocations(Iterable<Object> locations) {
-        List<Location> result = MutableList.of();
-        for (Object l: locations) {
-            Location ll = resolveLocation(l);
-            if (ll!=null) result.add(ll);
-        }
-        return result;
-    }
-
-    public Location resolveLocation(Object location) {
-        if (location instanceof String) {
-            return resolveLocationFromString((String)location);
-        } else if (location instanceof Map) {
-            return resolveLocationFromMap((Map<?,?>)location);
-        }
-        // could support e.g. location definition
-        throw new IllegalStateException("Illegal parameter for 'location' 
("+location+"); must be a string or map");
-    }
-    
-    /** resolves the location from the given spec string, either "Named 
Location", or "named:Named Location" format;
-     * returns null if input is blank (or null); otherwise guaranteed to 
resolve or throw error */
-    public Location resolveLocationFromString(String location) {
-        if (Strings.isBlank(location)) return null;
-        return resolveLocation(location, MutableMap.of());
-    }
-
-    public Location resolveLocationFromMap(Map<?,?> location) {
-        if (location.size() > 1) {
-            throw new IllegalStateException("Illegal parameter for 'location'; 
expected a single entry in map ("+location+")");
-        }
-        Object key = Iterables.getOnlyElement(location.keySet());
-        Object value = location.get(key);
-        
-        if (!(key instanceof String)) {
-            throw new IllegalStateException("Illegal parameter for 'location'; 
expected String key ("+location+")");
-        }
-        if (!(value instanceof Map)) {
-            throw new IllegalStateException("Illegal parameter for 'location'; 
expected config map ("+location+")");
-        }
-        return resolveLocation((String)key, (Map<?,?>)value);
-    }
-    
-    protected Location resolveLocation(String spec, Map<?,?> flags) {
-        LocationDefinition ldef = 
mgmt.getLocationRegistry().getDefinedLocationByName((String)spec);
-        if (ldef!=null)
-            // found it as a named location
-            return mgmt.getLocationRegistry().resolve(ldef, null, flags).get();
-        
-        Maybe<Location> l = mgmt.getLocationRegistry().resolve(spec, null, 
flags);
-        if (l.isPresent()) return l.get();
-        
-        RuntimeException exception = ((Absent<?>)l).getException();
-        throw new IllegalStateException("Illegal parameter for 'location' 
("+spec+"); not resolvable: "+
-            Exceptions.collapseText( exception ), exception);
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
 
b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
deleted file mode 100644
index 01bfaa2..0000000
--- 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * 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 org.apache.brooklyn.camp.brooklyn.spi.creation;
-
-import java.util.Map;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.guava.Maybe;
-import org.apache.brooklyn.util.javalang.Reflections;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-/** Assists in loading types referenced from YAML;
- * mainly as a way to share logic used in very different contexts. */
-public abstract class BrooklynYamlTypeInstantiator {
-
-    private static final Logger log = 
LoggerFactory.getLogger(BrooklynYamlTypeInstantiator.class);
-    
-    protected final Factory factory;
-
-    @Beta
-    public static class Factory {
-        final BrooklynClassLoadingContext loader;
-        final Object contextForLogging;
-        
-        public Factory(BrooklynClassLoadingContext loader, Object 
contextForLogging) {
-            this.loader = loader;
-            this.contextForLogging = contextForLogging;
-        }
-        
-        public InstantiatorFromKey from(Map<?,?> data) {
-            return new InstantiatorFromKey(this, ConfigBag.newInstance(data));
-        }
-        
-        public InstantiatorFromKey from(ConfigBag data) {
-            return new InstantiatorFromKey(this, data);
-        }
-        
-        public InstantiatorFromName type(String typeName) {
-            return new InstantiatorFromName(this, typeName);
-        }
-
-    }
-        
-    public static class InstantiatorFromKey extends 
BrooklynYamlTypeInstantiator {
-        protected final ConfigBag data;
-        protected String typeKeyPrefix = null;
-        
-        /** Nullable only permitted for instances which do not do loading, 
e.g. LoaderFromKey#lookup */
-        protected InstantiatorFromKey(@Nullable Factory factory, ConfigBag 
data) {
-            super(factory);
-            this.data = data;
-        }
-        
-        public static Maybe<String> extractTypeName(String prefix, ConfigBag 
data) {
-            if (data==null) return Maybe.absent();
-            return new InstantiatorFromKey(null, 
data).prefix(prefix).getTypeName();
-        }
-        
-        public InstantiatorFromKey prefix(String prefix) {
-            typeKeyPrefix = prefix;
-            return this;
-        }
-
-        @Override
-        public Maybe<String> getTypeName() {
-            Maybe<Object> result = 
data.getStringKeyMaybe(getPreferredKeyName());
-            if (result.isAbsent() && typeKeyPrefix!=null) {
-                // try alternatives if a prefix was specified
-                result = data.getStringKeyMaybe(typeKeyPrefix+"Type");
-                if (result.isAbsent()) result = data.getStringKeyMaybe("type");
-            }
-            
-            if (result.isAbsent() || result.get()==null) 
-                return Maybe.absent("Missing key '"+getPreferredKeyName()+"'");
-            
-            if (result.get() instanceof String) return 
Maybe.of((String)result.get());
-            
-            throw new IllegalArgumentException("Invalid value 
"+result.get().getClass()+" for "+getPreferredKeyName()+"; "
-                + "expected String, got "+result.get());
-        }
-        
-        protected String getPreferredKeyName() {
-            if (typeKeyPrefix!=null) return typeKeyPrefix+"_type";
-            return "type";
-        }
-        
-        /** as {@link #newInstance(Class)} but inferring the type */
-        public Object newInstance() {
-            return newInstance(null);
-        }
-        
-        /** creates a new instance of the type referred to by this description,
-         * as a subtype of the type supplied here, 
-         * inferring a Map from <code>brooklyn.config</code> key.
-         * TODO in future also picking up recognized flags and config keys 
(those declared on the type).  
-         * <p>
-         * constructs the object using:
-         * <li> a constructor on the class taking a Map
-         * <li> a no-arg constructor, only if the inferred map is empty  
-         **/
-        public <T> T newInstance(@Nullable Class<T> supertype) {
-            Class<? extends T> type = getType(supertype);
-            Map<String, ?> cfg = getConfigMap();
-            Optional<? extends T> result = 
Reflections.invokeConstructorWithArgs(type, cfg);
-            if (result.isPresent()) 
-                return result.get();
-            
-            ConfigBag cfgBag = ConfigBag.newInstance(cfg);
-            result = Reflections.invokeConstructorWithArgs(type, cfgBag);
-            if (result.isPresent()) 
-                return result.get();
-            
-            if (cfg.isEmpty()) {
-                result = Reflections.invokeConstructorWithArgs(type);
-                if (result.isPresent()) 
-                    return result.get();
-            }
-            
-            throw new IllegalStateException("No known mechanism for 
constructing type "+type+" in "+factory.contextForLogging);
-        }
-
-        /** finds the map of config for the type specified;
-         * currently only gets <code>brooklyn.config</code>, returning empty 
map if none,
-         * but TODO in future should support recognized flags and config keys 
(those declared on the type),
-         * incorporating code in {@link BrooklynEntityMatcher}.
-         */
-        @SuppressWarnings("unchecked")
-        @Nonnull
-        public Map<String,?> getConfigMap() {
-            MutableMap<String,Object> result = MutableMap.of();
-            Object bc = 
data.getStringKey(BrooklynCampReservedKeys.BROOKLYN_CONFIG);
-            if (bc!=null) {
-                if (bc instanceof Map)
-                    result.putAll((Map<? extends String, ?>) bc);
-                else
-                    throw new IllegalArgumentException("brooklyn.config key in 
"+factory.contextForLogging+" should be a map, not "+bc.getClass()+" ("+bc+")");
-            }
-            return result; 
-        }
-
-    }
-    
-    public static class InstantiatorFromName extends 
BrooklynYamlTypeInstantiator {
-        protected final String typeName;
-        protected InstantiatorFromName(Factory factory, String typeName) {
-            super(factory);
-            this.typeName = typeName;
-        }
-        
-        @Override
-        public Maybe<String> getTypeName() {
-            return Maybe.fromNullable(typeName);
-        }
-    }
-    
-    protected BrooklynYamlTypeInstantiator(Factory factory) {
-        this.factory = factory;
-    }
-        
-    public abstract Maybe<String> getTypeName();
-    
-    public BrooklynClassLoadingContext getClassLoadingContext() {
-        Preconditions.checkNotNull(factory, "No factory set; cannot use this 
instance for type loading");
-        return factory.loader;
-    }
-    
-    public Class<?> getType() {
-        return getType(Object.class);
-    }
-    
-    public <T> Class<? extends T> getType(@Nonnull Class<T> type) {
-        try {
-            return getClassLoadingContext().loadClass(getTypeName().get(), 
type);
-        } catch (Exception e) {
-            Exceptions.propagateIfFatal(e);
-            log.debug("Unable to resolve " + type + " " + getTypeName().get() 
+ " (rethrowing) in spec " + factory.contextForLogging);
-            throw Exceptions.propagate(e);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampCatalogUtils.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampCatalogUtils.java
 
b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampCatalogUtils.java
deleted file mode 100644
index 706d6f2..0000000
--- 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampCatalogUtils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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 org.apache.brooklyn.camp.brooklyn.spi.creation;
-
-import java.util.Set;
-
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.camp.CampPlatform;
-import org.apache.brooklyn.core.typereg.RegisteredTypes;
-
-@Deprecated /** @deprecated since 0.9.0 use RegisteredType and CampResolver */
-public class CampCatalogUtils {
-
-    public static AbstractBrooklynObjectSpec<?, ?> 
createSpec(ManagementContext mgmt, CatalogItem<?, ?> item, Set<String> 
parentEncounteredTypes) {
-        return CampResolver.createSpecFromFull(mgmt, RegisteredTypes.of(item), 
item.getCatalogItemJavaType(), parentEncounteredTypes, null);
-    }
-    
-    public static CampPlatform getCampPlatform(ManagementContext mgmt) {
-        return CampInternalUtils.getCampPlatform(mgmt);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampInternalUtils.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampInternalUtils.java
 
b/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampInternalUtils.java
deleted file mode 100644
index 9096168..0000000
--- 
a/brooklyn-server/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampInternalUtils.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * 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 org.apache.brooklyn.camp.brooklyn.spi.creation;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.io.StringReader;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.api.objs.SpecParameter;
-import org.apache.brooklyn.api.policy.Policy;
-import org.apache.brooklyn.api.policy.PolicySpec;
-import org.apache.brooklyn.api.typereg.RegisteredType;
-import org.apache.brooklyn.camp.CampPlatform;
-import org.apache.brooklyn.camp.brooklyn.BrooklynCampConstants;
-import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
-import org.apache.brooklyn.camp.spi.AssemblyTemplate;
-import org.apache.brooklyn.camp.spi.AssemblyTemplate.Builder;
-import org.apache.brooklyn.camp.spi.instantiate.AssemblyTemplateInstantiator;
-import org.apache.brooklyn.camp.spi.pdp.DeploymentPlan;
-import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
-import 
org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
-import org.apache.brooklyn.core.objs.BasicSpecParameter;
-import 
org.apache.brooklyn.core.objs.BrooklynObjectInternal.ConfigurationSupportInternal;
-import org.apache.brooklyn.entity.stock.BasicApplicationImpl;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.guava.Maybe;
-import org.apache.brooklyn.util.stream.Streams;
-import org.apache.brooklyn.util.yaml.Yamls;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-
-/** package-private; as {@link RegisteredType} becomes standard hopefully we 
can remove this */
-class CampInternalUtils {
-
-    static EntitySpec<? extends Application> createWrapperApp(AssemblyTemplate 
template, BrooklynClassLoadingContext loader) {
-        BrooklynComponentTemplateResolver resolver = 
BrooklynComponentTemplateResolver.Factory.newInstance(
-            loader, buildWrapperAppTemplate(template));
-        EntitySpec<Application> wrapperSpec = 
resolver.resolveSpec(ImmutableSet.<String>of());
-        resetSpecIfTemplateHasNoExplicitParameters(template, wrapperSpec);
-        // caller always sets WRAPPER_APP config; should we do it here?
-        return wrapperSpec;
-    }
-
-    static void resetSpecIfTemplateHasNoExplicitParameters(AssemblyTemplate 
template, EntitySpec<? extends Application> wrapperSpec) {
-        if 
(!template.getCustomAttributes().containsKey(BrooklynCampReservedKeys.BROOKLYN_PARAMETERS))
 {
-            // Clear out default parameters (coming from the wrapper app's 
class) so they don't overwrite the entity's params on unwrap.
-            wrapperSpec.parameters(ImmutableList.<SpecParameter<?>>of());
-        }
-    }
-
-    private static AssemblyTemplate buildWrapperAppTemplate(AssemblyTemplate 
template) {
-        Builder<? extends AssemblyTemplate> builder = 
AssemblyTemplate.builder();
-        builder.type("brooklyn:" + BasicApplicationImpl.class.getName());
-        builder.id(template.getId());
-        builder.name(template.getName());
-        builder.sourceCode(template.getSourceCode());
-        for (Entry<String, Object> entry : 
template.getCustomAttributes().entrySet()) {
-            builder.customAttribute(entry.getKey(), entry.getValue());
-        }
-        builder.instantiator(template.getInstantiator());
-        AssemblyTemplate wrapTemplate = builder.build();
-        return wrapTemplate;
-    }
-
-    static AssemblyTemplateInstantiator getInstantiator(AssemblyTemplate at) {
-        try {
-            return at.getInstantiator().newInstance();
-        } catch (Exception e) {
-            throw Exceptions.propagate(e);
-        }
-    }
-
-    static AssemblyTemplate registerDeploymentPlan(String plan, 
BrooklynClassLoadingContext loader, CampPlatform camp) {
-        BrooklynLoaderTracker.setLoader(loader);
-        try {
-            return camp.pdp().registerDeploymentPlan(new StringReader(plan));
-        } finally {
-            BrooklynLoaderTracker.unsetLoader(loader);
-        }
-    }
-
-    static PolicySpec<?> createPolicySpec(String yamlPlan, 
BrooklynClassLoadingContext loader, Set<String> encounteredCatalogTypes) {
-        DeploymentPlan plan = makePlanFromYaml(loader.getManagementContext(), 
yamlPlan);
-
-        //Would ideally re-use the PolicySpecResolver
-        //but it is CAMP specific and there is no easy way to get hold of it.
-        Object policies = 
checkNotNull(plan.getCustomAttributes().get(BasicBrooklynCatalog.POLICIES_KEY), 
"policy config");
-        if (!(policies instanceof Iterable<?>)) {
-            throw new IllegalStateException("The value of " + 
BasicBrooklynCatalog.POLICIES_KEY + " must be an Iterable.");
-        }
-
-        Object policy = Iterables.getOnlyElement((Iterable<?>)policies);
-
-        return createPolicySpec(loader, policy, encounteredCatalogTypes);
-    }
-
-    @SuppressWarnings("unchecked")
-    static PolicySpec<?> createPolicySpec(BrooklynClassLoadingContext loader, 
Object policy, Set<String> encounteredCatalogTypes) {
-        Map<String, Object> itemMap;
-        if (policy instanceof String) {
-            itemMap = ImmutableMap.<String, Object>of("type", policy);
-        } else if (policy instanceof Map) {
-            itemMap = (Map<String, Object>) policy;
-        } else {
-            throw new IllegalStateException("Policy expected to be string or 
map. Unsupported object type " + policy.getClass().getName() + " (" + 
policy.toString() + ")");
-        }
-
-        String versionedId = (String) 
checkNotNull(Yamls.getMultinameAttribute(itemMap, "policy_type", "policyType", 
"type"), "policy type");
-        PolicySpec<? extends Policy> spec = resolvePolicySpec(versionedId, 
loader, encounteredCatalogTypes);
-        Map<String, Object> brooklynConfig = (Map<String, Object>) 
itemMap.get(BrooklynCampReservedKeys.BROOKLYN_CONFIG);
-        if (brooklynConfig != null) {
-            spec.configure(brooklynConfig);
-        }
-        List<?> parameters = (List<?>) 
itemMap.get(BrooklynCampReservedKeys.BROOKLYN_PARAMETERS);
-        initParameters(parameters, spec, loader);
-        return spec;
-    }
-
-    static LocationSpec<?> createLocationSpec(String yamlPlan, 
BrooklynClassLoadingContext loader, Set<String> encounteredTypes) {
-        DeploymentPlan plan = makePlanFromYaml(loader.getManagementContext(), 
yamlPlan);
-        Object locations = 
checkNotNull(plan.getCustomAttributes().get(BasicBrooklynCatalog.LOCATIONS_KEY),
 "location config");
-        if (!(locations instanceof Iterable<?>)) {
-            throw new IllegalStateException("The value of " + 
BasicBrooklynCatalog.LOCATIONS_KEY + " must be an Iterable.");
-        }
-
-        Object location = Iterables.getOnlyElement((Iterable<?>)locations);
-        return createLocationSpec(loader, location);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static LocationSpec<?> 
createLocationSpec(BrooklynClassLoadingContext loader, Object location) {
-        Map<String, Object> itemMap;
-        if (location instanceof String) {
-            itemMap = ImmutableMap.<String, Object>of("type", location);
-        } else if (location instanceof Map) {
-            itemMap = (Map<String, Object>) location;
-        } else {
-            throw new IllegalStateException("Location expected to be string or 
map. Unsupported object type " + location.getClass().getName() + " (" + 
location.toString() + ")");
-        }
-
-        String type = (String) 
checkNotNull(Yamls.getMultinameAttribute(itemMap, "location_type", 
"locationType", "type"), "location type");
-        Map<String, Object> brooklynConfig = (Map<String, Object>) 
itemMap.get("brooklyn.config");
-        LocationSpec<?> locationSpec = resolveLocationSpec(type, 
brooklynConfig, loader);
-        List<?> explicitParams = (List<?>) 
itemMap.get(BrooklynCampReservedKeys.BROOKLYN_PARAMETERS);
-        initParameters(explicitParams, locationSpec, loader);
-        return locationSpec;
-    }
-
-    private static void initParameters(List<?> explicitParams, 
AbstractBrooklynObjectSpec<?, ?> spec, BrooklynClassLoadingContext loader) {
-        if (explicitParams != null) {
-            spec.parameters(BasicSpecParameter.fromConfigList(explicitParams, 
loader));
-        } else {
-            
spec.parameters(BasicSpecParameter.fromSpec(loader.getManagementContext(), 
spec));
-        }
-    }
-
-    public static DeploymentPlan makePlanFromYaml(ManagementContext mgmt, 
String yaml) {
-        CampPlatform camp = getCampPlatform(mgmt);
-        return 
camp.pdp().parseDeploymentPlan(Streams.newReaderWithContents(yaml));
-    }
-
-    public static CampPlatform getCampPlatform(ManagementContext mgmt) {
-        CampPlatform result = 
mgmt.getConfig().getConfig(BrooklynCampConstants.CAMP_PLATFORM);
-        if (result!=null) {
-            return result;
-        } else {
-            throw new IllegalStateException("No CAMP Platform is registered 
with this Brooklyn management context.");
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private static PolicySpec<? extends Policy> resolvePolicySpec(
-            String versionedId,
-            BrooklynClassLoadingContext loader,
-            Set<String> encounteredCatalogTypes) {
-        
-        PolicySpec<? extends Policy> spec;
-        RegisteredType item = 
loader.getManagementContext().getTypeRegistry().get(versionedId);
-        if (item != null && 
!encounteredCatalogTypes.contains(item.getSymbolicName())) {
-            return 
loader.getManagementContext().getTypeRegistry().createSpec(item, null, 
PolicySpec.class);
-        } else {
-            // TODO-type-registry pass the loader in to the above, and allow 
it to load with the loader
-            spec = PolicySpec.create(loader.loadClass(versionedId, 
Policy.class));
-        }
-        return spec;
-    }
-
-    private static LocationSpec<?> resolveLocationSpec(
-            String type,
-            Map<String, Object> brooklynConfig,
-            BrooklynClassLoadingContext loader) {
-        Maybe<Class<? extends Location>> javaClass = loader.tryLoadClass(type, 
Location.class);
-        if (javaClass.isPresent()) {
-            LocationSpec<?> spec = LocationSpec.create(javaClass.get());
-            if (brooklynConfig != null) {
-                spec.configure(brooklynConfig);
-            }
-            return spec;
-        } else {
-            Maybe<Location> loc = 
loader.getManagementContext().getLocationRegistry().resolve(type, false, 
brooklynConfig);
-            if (loc.isPresent()) {
-                // TODO extensions?
-                Map<String, Object> locConfig = 
((ConfigurationSupportInternal)loc.get().config()).getBag().getAllConfig();
-                Class<? extends Location> locType = loc.get().getClass();
-                Set<Object> locTags = loc.get().tags().getTags();
-                String locDisplayName = loc.get().getDisplayName();
-                return LocationSpec.create(locType)
-                        .configure(locConfig)
-                        .displayName(locDisplayName)
-                        .tags(locTags);
-            } else {
-                throw new IllegalStateException("No class or resolver found 
for location type "+type);
-            }
-        }
-    }
-
-}

Reply via email to