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 <[email protected]> Authored: Mon Nov 9 16:53:17 2015 +0000 Committer: Alex Heneveld <[email protected]> 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;
