You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2015/11/17 23:51:18 UTC

[03/14] incubator-brooklyn git commit: XML-based illustration of new-style XML plan creation

XML-based illustration of new-style XML plan creation

and tidy API and update deprecation


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

Branch: refs/heads/master
Commit: e480402f30237e5af0604eb82606901be2acaa20
Parents: e932d5f
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Nov 9 16:53:17 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Nov 10 17:13:02 2015 +0000

----------------------------------------------------------------------
 .../brooklyn/api/catalog/CatalogItem.java       |  24 ++++
 .../catalog/internal/BasicBrooklynCatalog.java  |  12 +-
 .../catalog/internal/CatalogItemBuilder.java    |  46 +++---
 .../core/typereg/BasicBrooklynTypeRegistry.java |  18 ++-
 .../core/plan/XmlPlanToSpecTransformer.java     |   2 +
 .../core/plan/XmlPlanToSpecTransformerTest.java |   2 +
 .../typereg/ExampleXmlTypePlanTransformer.java  | 140 +++++++++++++++++++
 .../ExampleXmlTypePlanTransformerTest.java      |  67 +++++++++
 .../camp/brooklyn/AbstractYamlTest.java         |   3 -
 9 files changed, 281 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e480402f/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java b/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
index 7f4e3b3..fe21daa 100644
--- a/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
+++ b/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
@@ -23,11 +23,19 @@ import java.util.List;
 
 import javax.annotation.Nullable;
 
+import org.apache.brooklyn.api.entity.Application;
+import org.apache.brooklyn.api.entity.Entity;
+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.rebind.RebindSupport;
 import org.apache.brooklyn.api.mgmt.rebind.Rebindable;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.CatalogItemMemento;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 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.OsgiBundleWithUrl;
 
 import com.google.common.annotations.Beta;
@@ -40,6 +48,22 @@ public interface CatalogItem<T,SpecT> extends BrooklynObject, Rebindable {
         ENTITY, 
         POLICY,
         LOCATION;
+        
+        public static CatalogItemType ofSpecClass(Class<? extends AbstractBrooklynObjectSpec<?, ?>> type) {
+            if (type==null) return null;
+            if (PolicySpec.class.isAssignableFrom(type)) return POLICY;
+            if (LocationSpec.class.isAssignableFrom(type)) return LOCATION;
+            if (EntitySpec.class.isAssignableFrom(type)) return ENTITY;
+            return null;
+        }
+        public static CatalogItemType ofTargetClass(Class<? extends BrooklynObject> type) {
+            if (type==null) return null;
+            if (Policy.class.isAssignableFrom(type)) return POLICY;
+            if (Location.class.isAssignableFrom(type)) return LOCATION;
+            if (Application.class.isAssignableFrom(type)) return TEMPLATE;
+            if (Entity.class.isAssignableFrom(type)) return ENTITY;
+            return null;
+        }
     }
     
     public static interface CatalogBundle extends OsgiBundleWithUrl {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e480402f/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
index 0832b4f..75c727a 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
@@ -63,7 +63,6 @@ import org.slf4j.LoggerFactory;
 import org.yaml.snakeyaml.Yaml;
 
 import com.google.common.base.Function;
-import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
@@ -849,15 +848,8 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         return Strings.join(lines, "\n");
     }
 
-    private CatalogItemBuilder<?> createItemBuilder(CatalogItemType itemType, String itemId, String version) {
-        Preconditions.checkNotNull(itemType, "itemType required");
-        switch (itemType) {
-        case ENTITY: return CatalogItemBuilder.newEntity(itemId, version);
-        case TEMPLATE: return CatalogItemBuilder.newTemplate(itemId, version);
-        case POLICY: return CatalogItemBuilder.newPolicy(itemId, version);
-        case LOCATION: return CatalogItemBuilder.newLocation(itemId, version);
-        }
-        throw new IllegalStateException("Unexpected itemType: "+itemType);
+    static CatalogItemBuilder<?> createItemBuilder(CatalogItemType itemType, String symbolicName, String version) {
+        return CatalogItemBuilder.newItem(itemType, symbolicName, version);
     }
 
     // these kept as their logic may prove useful; Apr 2015

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e480402f/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemBuilder.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemBuilder.java
index 1f9b9a2..59bc3a9 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemBuilder.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemBuilder.java
@@ -23,12 +23,24 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
+import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
 import org.apache.brooklyn.api.objs.SpecParameter;
 
 import com.google.common.base.Preconditions;
 
-public class CatalogItemBuilder<CatalogItemType extends CatalogItemDtoAbstract<?, ?>> {
-    private CatalogItemType dto;
+public class CatalogItemBuilder<CIConcreteType extends CatalogItemDtoAbstract<?, ?>> {
+    private CIConcreteType dto;
+
+    public static CatalogItemBuilder<?> newItem(CatalogItemType itemType, String symbolicName, String version) {
+        Preconditions.checkNotNull(itemType, "itemType required");
+        switch (itemType) {
+        case ENTITY: return newEntity(symbolicName, version);
+        case TEMPLATE: return newTemplate(symbolicName, version);
+        case POLICY: return newPolicy(symbolicName, version);
+        case LOCATION: return newLocation(symbolicName, version);
+        }
+        throw new IllegalStateException("Unexpected itemType: "+itemType);
+    }
 
     public static CatalogItemBuilder<CatalogEntityItemDto> newEntity(String symbolicName, String version) {
         return new CatalogItemBuilder<CatalogEntityItemDto>(new CatalogEntityItemDto())
@@ -54,74 +66,74 @@ public class CatalogItemBuilder<CatalogItemType extends CatalogItemDtoAbstract<?
                 .version(version);
     }
 
-    public CatalogItemBuilder(CatalogItemType dto) {
+    public CatalogItemBuilder(CIConcreteType dto) {
         this.dto = dto;
         this.dto.setLibraries(Collections.<CatalogBundle>emptyList());
     }
 
-    public CatalogItemBuilder<CatalogItemType> symbolicName(String symbolicName) {
+    public CatalogItemBuilder<CIConcreteType> symbolicName(String symbolicName) {
         dto.setSymbolicName(symbolicName);
         return this;
     }
 
     @Deprecated
-    public CatalogItemBuilder<CatalogItemType> javaType(String javaType) {
+    public CatalogItemBuilder<CIConcreteType> javaType(String javaType) {
         dto.setJavaType(javaType);
         return this;
     }
 
     /** @deprecated since 0.7.0 use {@link #displayName}*/
     @Deprecated
-    public CatalogItemBuilder<CatalogItemType> name(String name) {
+    public CatalogItemBuilder<CIConcreteType> name(String name) {
         return displayName(name);
     }
 
-    public CatalogItemBuilder<CatalogItemType> displayName(String displayName) {
+    public CatalogItemBuilder<CIConcreteType> displayName(String displayName) {
         dto.setDisplayName(displayName);
         return this;
     }
 
-    public CatalogItemBuilder<CatalogItemType> description(String description) {
+    public CatalogItemBuilder<CIConcreteType> description(String description) {
         dto.setDescription(description);
         return this;
     }
 
-    public CatalogItemBuilder<CatalogItemType> iconUrl(String iconUrl) {
+    public CatalogItemBuilder<CIConcreteType> iconUrl(String iconUrl) {
         dto.setIconUrl(iconUrl);
         return this;
     }
 
-    public CatalogItemBuilder<CatalogItemType> version(String version) {
+    public CatalogItemBuilder<CIConcreteType> version(String version) {
         dto.setVersion(version);
         return this;
     }
 
-    public CatalogItemBuilder<CatalogItemType> deprecated(boolean deprecated) {
+    public CatalogItemBuilder<CIConcreteType> deprecated(boolean deprecated) {
         dto.setDeprecated(deprecated);
         return this;
     }
 
-    public CatalogItemBuilder<CatalogItemType> disabled(boolean disabled) {
+    public CatalogItemBuilder<CIConcreteType> disabled(boolean disabled) {
         dto.setDisabled(disabled);
         return this;
     }
 
-    public CatalogItemBuilder<CatalogItemType> parameters(List<SpecParameter<?>> inputs) {
+    public CatalogItemBuilder<CIConcreteType> parameters(List<SpecParameter<?>> inputs) {
         dto.setParameters(inputs);
         return this;
     }
 
-    public CatalogItemBuilder<CatalogItemType> libraries(Collection<CatalogBundle> libraries) {
+    public CatalogItemBuilder<CIConcreteType> libraries(Collection<CatalogBundle> libraries) {
         dto.setLibraries(libraries);
         return this;
     }
 
-    public CatalogItemBuilder<CatalogItemType> plan(String yaml) {
+    public CatalogItemBuilder<CIConcreteType> plan(String yaml) {
         dto.setPlanYaml(yaml);
         return this;
     }
 
-    public CatalogItemType build() {
+    public CIConcreteType build() {
         Preconditions.checkNotNull(dto.getSymbolicName());
         Preconditions.checkNotNull(dto.getVersion());
 
@@ -132,7 +144,7 @@ public class CatalogItemBuilder<CatalogItemType extends CatalogItemDtoAbstract<?
             dto.setLibraries(Collections.<CatalogBundle>emptyList());
         }
 
-        CatalogItemType ret = dto;
+        CIConcreteType ret = dto;
 
         //prevent mutations through the builder
         dto = null;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e480402f/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
index cfb9f9b..b5c85c1 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
@@ -22,16 +22,19 @@ import javax.annotation.Nullable;
 
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.catalog.CatalogItem;
+import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
+import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
+import org.apache.brooklyn.util.text.Identifiers;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -121,9 +124,18 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry {
         // TODO remove once all transformers are available in the new style
         CatalogItem item = (CatalogItem) mgmt.getCatalog().getCatalogItem(type.getSymbolicName(), type.getVersion());
         if (item==null) {
-            // if not in catalog (because loading a new item?) then throw original
-            // (NB: to support any recursive legacy transformers we might have to create a CI; cross that bridge when we come to it)
-            result.get();
+            // if not in catalog (because loading a new item?) then look up item based on type
+            // (only really used in tests; possibly also for any recursive legacy transformers we might have to create a CI; cross that bridge when we come to it)
+            CatalogItemType ciType = CatalogItemType.ofTargetClass( (Class)constraint.getExpectedJavaSuperType() );
+            if (ciType==null) {
+                // throw -- not supported for non-spec types
+                result.get();
+            }
+            item = CatalogItemBuilder.newItem(ciType, 
+                    type.getSymbolicName()!=null ? type.getSymbolicName() : Identifiers.makeRandomId(8), 
+                        type.getVersion()!=null ? type.getVersion() : BasicBrooklynCatalog.DEFAULT_VERSION)
+                .plan(RegisteredTypes.getImplementationDataStringForSpec(type))
+                .build();
         }
         try {
             return (SpecT) BasicBrooklynCatalog.internalCreateSpecLegacy(mgmt, item, constraint.getAlreadyEncounteredTypes(), false);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e480402f/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformer.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformer.java b/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformer.java
index a4c3766..063df64 100644
--- a/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformer.java
+++ b/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformer.java
@@ -41,6 +41,8 @@ import org.w3c.dom.Node;
 /** Example implementation of {@link PlanToSpecTransformer} showing 
  * how implementations are meant to be written. */
 public class XmlPlanToSpecTransformer implements PlanToSpecTransformer {
+    
+    // this is REPLACED by ExampleXmlTypePlanTransformer
 
     @SuppressWarnings("unused")
     private ManagementContext mgmt;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e480402f/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformerTest.java b/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformerTest.java
index 19a6ba4..ffec32c 100644
--- a/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/plan/XmlPlanToSpecTransformerTest.java
@@ -36,6 +36,8 @@ import org.testng.annotations.Test;
  * which illustrates how the {@link PlanToSpecTransformer} can be used. */
 public class XmlPlanToSpecTransformerTest {
 
+    // TEST is REPLACED by ExampleXmlTypePlanTransformerTest
+   
     private ManagementContext mgmt;
 
     @BeforeMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e480402f/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java
new file mode 100644
index 0000000..01b80a1
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java
@@ -0,0 +1,140 @@
+/*
+ * 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.core.typereg;
+
+import java.io.StringReader;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+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.typereg.RegisteredType;
+import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
+import org.apache.brooklyn.entity.stock.BasicApplication;
+import org.apache.brooklyn.entity.stock.BasicEntity;
+import org.apache.brooklyn.util.core.xstream.XmlSerializer;
+import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.stream.ReaderInputStream;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/** Example implementation of {@link BrooklynTypePlanTransformer} showing 
+ * how implementations are meant to be written. */
+public class ExampleXmlTypePlanTransformer extends AbstractTypePlanTransformer {
+
+    protected ExampleXmlTypePlanTransformer() {
+        super("example-xml", "Example XML", "Illustration of writing a transformer");
+    }
+
+    @Override
+    protected double scoreForNullFormat(Object planData, RegisteredType type, RegisteredTypeLoadingContext context) {
+        if (!(planData instanceof String)) return 0;
+        try {
+            // if it's XML, accept it
+            parseXml((String)planData);
+            return 0.3;
+        } catch (Exception e) {
+            Exceptions.propagateIfFatal(e);
+            return 0;
+        }
+    }
+
+    @Override
+    protected double scoreForNonmatchingNonnullFormat(String planFormat, Object planData, RegisteredType type, RegisteredTypeLoadingContext context) {
+        // only null and xml supported
+        return 0;
+    }
+
+    @Override
+    protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
+        return toEntitySpec(parseXml((String)type.getPlan().getPlanData()), 
+            isApplicationExpected(type, context) ? 0 : 1);
+    }
+
+    private static boolean isApplicationExpected(RegisteredType type, RegisteredTypeLoadingContext context) {
+        return RegisteredTypes.isSubTypeOf(type, Application.class) ||
+            (context.getExpectedJavaSuperType()!=null && context.getExpectedJavaSuperType().isAssignableFrom(Application.class));
+    }
+
+    @Override
+    protected Object createBean(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
+        return new XmlSerializer<Object>().fromString((String)type.getPlan().getPlanData());
+    }
+
+
+    @Override
+    public double scoreForTypeDefinition(String formatCode, Object catalogData) {
+        // defining types not supported
+        return 0;
+    }
+
+    @Override
+    public List<RegisteredType> createFromTypeDefinition(String formatCode, Object catalogData) {
+        // defining types not supported
+        return null;
+    }
+
+    private Document parseXml(String plan) {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        Document dom;
+        
+        try {
+            //Using factory get an instance of document builder
+            DocumentBuilder db = dbf.newDocumentBuilder();
+
+            //parse using builder to get DOM representation of the XML file
+            dom = db.parse(new ReaderInputStream(new StringReader(plan)));
+            
+        } catch (Exception e) {
+            Exceptions.propagateIfFatal(e);
+            throw new UnsupportedTypePlanException(e);
+        }
+        return dom;
+    }
+
+    private EntitySpec<?> toEntitySpec(Node dom, int depth) {
+        if (dom.getNodeType()==Node.DOCUMENT_NODE) {
+            if (dom.getChildNodes().getLength()!=1) {
+                // NB: <?...?>  entity preamble might break this
+                throw new IllegalStateException("Document for "+dom+" has "+dom.getChildNodes().getLength()+" nodes; 1 expected.");
+            }
+            return toEntitySpec(dom.getChildNodes().item(0), depth);
+        }
+        
+        EntitySpec<?> result = depth == 0 ? EntitySpec.create(BasicApplication.class) : EntitySpec.create(BasicEntity.class);
+        result.displayName(dom.getNodeName());
+        if (dom.getAttributes()!=null) {
+            for (int i=0; i<dom.getAttributes().getLength(); i++)
+                result.configure(dom.getAttributes().item(i).getNodeName(), dom.getAttributes().item(i).getTextContent());
+        }
+        if (dom.getChildNodes()!=null) {
+            for (int i=0; i<dom.getChildNodes().getLength(); i++) {
+                Node item = dom.getChildNodes().item(i);
+                if (item.getNodeType()==Node.ELEMENT_NODE) {
+                    result.child(toEntitySpec(item, depth+1));
+                }
+            }
+        }
+        return result;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e480402f/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformerTest.java b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformerTest.java
new file mode 100644
index 0000000..b1b7804
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformerTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.core.typereg;
+
+import org.apache.brooklyn.api.entity.Application;
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
+import org.apache.brooklyn.core.plan.XmlPlanToSpecTransformer;
+import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.Iterables;
+
+/** Tests the sample {@link XmlPlanToSpecTransformer}
+ * which illustrates how the {@link PlanToSpecTransformer} can be used. */
+public class ExampleXmlTypePlanTransformerTest {
+
+    private ManagementContext mgmt;
+
+    @BeforeMethod(alwaysRun=true)
+    public void setUp() throws Exception {
+        TypePlanTransformers.forceAvailable(ExampleXmlTypePlanTransformer.class);
+        mgmt = LocalManagementContextForTests.newInstance();
+    }
+    
+    @AfterMethod(alwaysRun = true)
+    public void tearDown() {
+        TypePlanTransformers.clearForced();
+        if (mgmt!=null) Entities.destroyAll(mgmt);
+    }
+
+    @Test
+    public void testAppSpecXmlPlanParse() {
+        EntitySpec<? extends Application> appSpec = EntityManagementUtils.createEntitySpecForApplication(mgmt, 
+            "<root><a_kid foo=\"bar\"/></root>");
+        Application app = EntityManagementUtils.createStarting(mgmt, appSpec).get();
+        Entities.dumpInfo(app);
+        Assert.assertEquals(app.getDisplayName(), "root");
+        Entity child = Iterables.getOnlyElement(app.getChildren());
+        Assert.assertEquals(child.getDisplayName(), "a_kid");
+        Assert.assertEquals(child.config().get(ConfigKeys.newStringConfigKey("foo")), "bar");
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e480402f/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java
index 15df062..06dfaa3 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java
@@ -28,9 +28,7 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.mgmt.Task;
-import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.spi.creation.CampTypePlanTransformer;
-import org.apache.brooklyn.camp.brooklyn.spi.creation.CampTypePlanTransformer.CampTypeImplementationPlan;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.trait.Startable;
@@ -39,7 +37,6 @@ import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.core.typereg.RegisteredTypeLoadingContexts;
-import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.stream.Streams;