Better documentation and added check suggested in review
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/1f6731ef Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/1f6731ef Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/1f6731ef Branch: refs/heads/master Commit: 1f6731ef0ebbb5ddc27859cba0295e5a1685c063 Parents: 303c388 Author: Andrew Kennedy <[email protected]> Authored: Thu Apr 9 14:09:36 2015 +0100 Committer: Andrew Kennedy <[email protected]> Committed: Thu Apr 9 14:13:52 2015 +0100 ---------------------------------------------------------------------- .../BrooklynComponentTemplateResolver.java | 23 +++++++------ .../service/BrooklynServiceTypeResolver.java | 2 +- .../service/CatalogServiceTypeResolver.java | 36 +++++++++++++++----- .../service/ChefServiceTypeResolver.java | 4 +-- .../service/JavaServiceTypeResolver.java | 9 +++++ .../creation/service/ServiceTypeResolver.java | 30 ++++++++++++++++ 6 files changed, 83 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java index 37fccf8..67e5af1 100644 --- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java +++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java @@ -28,6 +28,7 @@ import io.brooklyn.camp.spi.PlatformComponentTemplate; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.ServiceLoader; import java.util.Set; @@ -71,12 +72,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Maps; /** - * This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code brooklyn:} - * to Brooklyn {@link EntitySpec} instances. - * <p> - * but TODO this should probably be done by {@link BrooklynEntityMatcher} - * so we have a spec by the time we come to instantiate. - * (currently privileges "brooklyn.*" key names are checked in both places!) + * This generates instances of a template resolver that use a {@link ServiceTypeResolver} + * to parse the {@code serviceType} line in the template. */ public class BrooklynComponentTemplateResolver { @@ -118,11 +115,17 @@ public class BrooklynComponentTemplateResolver { return findService(context, type); } + // TODO This could be extended to support multiple prefixes per resolver and a 'best-match' algorithm protected static ServiceTypeResolver findService(BrooklynClassLoadingContext context, String type) { - String prefix = Splitter.on(":").splitToList(type).get(0); - ServiceLoader<ServiceTypeResolver> loader = ServiceLoader.load(ServiceTypeResolver.class, context.getManagementContext().getCatalog().getRootClassLoader()); - for (ServiceTypeResolver resolver : loader) { - if (prefix.equalsIgnoreCase(resolver.getTypePrefix())) return resolver; + if (type.indexOf(':') != -1) { + String prefix = Splitter.on(":").splitToList(type).get(0); + ServiceLoader<ServiceTypeResolver> loader = ServiceLoader.load(ServiceTypeResolver.class, + context.getManagementContext().getCatalog().getRootClassLoader()); + for (ServiceTypeResolver resolver : loader) { + if (prefix.equals(resolver.getTypePrefix())) { + return resolver; + } + } } return null; } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java index 3528cee..2fd134a 100644 --- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java +++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java @@ -39,7 +39,7 @@ import brooklyn.util.text.Strings; */ public class BrooklynServiceTypeResolver implements ServiceTypeResolver { - private static final Logger log = LoggerFactory.getLogger(ServiceTypeResolver.class); + private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class); @Override public String getTypePrefix() { return DEFAULT_TYPE_PREFIX; } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java index 4b33649..d082b13 100644 --- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java +++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java @@ -20,21 +20,43 @@ package io.brooklyn.camp.brooklyn.spi.creation.service; import io.brooklyn.camp.spi.PlatformComponentTemplate; +import java.util.Map; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import brooklyn.entity.basic.VanillaSoftwareProcess; +import brooklyn.entity.brooklynnode.BrooklynNode; import brooklyn.entity.group.DynamicCluster; import brooklyn.entity.group.DynamicRegionsFabric; +import brooklyn.entity.java.VanillaJavaApp; import brooklyn.entity.proxying.EntitySpec; +import com.google.common.base.CaseFormat; +import com.google.common.base.Converter; +import com.google.common.collect.ImmutableMap; + /** * This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code catalog:} * to Brooklyn {@link EntitySpec} instances. */ public class CatalogServiceTypeResolver extends BrooklynServiceTypeResolver { - private static final Logger log = LoggerFactory.getLogger(ServiceTypeResolver.class); + private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class); + + // TODO currently a hardcoded list of aliases; would like that to come from mgmt somehow + private static final Map<String, String> CATALOG_TYPES = ImmutableMap.<String, String>builder() + .put("cluster", DynamicCluster.class.getName()) + .put("fabric", DynamicRegionsFabric.class.getName()) + .put("vanilla", VanillaSoftwareProcess.class.getName()) + .put("software-process", VanillaSoftwareProcess.class.getName()) + .put("java-app", VanillaJavaApp.class.getName()) + .put("brooklyn-node", BrooklynNode.class.getName()) + .put("web-app-cluster","brooklyn.entity.webapp.ControlledDynamicWebAppCluster") + .build(); + + // Allow catalog-type or CatalogType as service type string + private static final Converter<String, String> FMT = CaseFormat.LOWER_HYPHEN.converterTo(CaseFormat.UPPER_CAMEL); @Override public String getTypePrefix() { return "catalog"; } @@ -44,13 +66,11 @@ public class CatalogServiceTypeResolver extends BrooklynServiceTypeResolver { String type = super.getBrooklynType(serviceType); if (type == null) return null; - // TODO currently a hardcoded list of aliases; would like that to come from mgmt somehow - if (type.equals("cluster") || type.equals("Cluster")) return DynamicCluster.class.getName(); - if (type.equals("fabric") || type.equals("Fabric")) return DynamicRegionsFabric.class.getName(); - if (type.equals("vanilla") || type.equals("Vanilla")) return VanillaSoftwareProcess.class.getName(); - if (type.equals("web-app-cluster") || type.equals("WebAppCluster")) - // TODO use service discovery; currently included as string to avoid needing a reference to it - return "brooklyn.entity.webapp.ControlledDynamicWebAppCluster"; + for (String check : CATALOG_TYPES.keySet()) { + if (type.equals(check) || type.equals(FMT.convert(check))) { + return CATALOG_TYPES.get(check); + } + } return type; } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java index 9f266e5..da7be21 100644 --- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java +++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java @@ -37,7 +37,7 @@ import brooklyn.util.text.Strings; */ public class ChefServiceTypeResolver extends BrooklynServiceTypeResolver { - private static final Logger log = LoggerFactory.getLogger(ServiceTypeResolver.class); + private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class); @Override public String getTypePrefix() { return "chef"; } @@ -47,7 +47,7 @@ public class ChefServiceTypeResolver extends BrooklynServiceTypeResolver { return ChefEntity.class.getName(); } - // chef: items are not in catalog + /** Chef items are not in the catalog. */ @Override public CatalogItem<Entity, EntitySpec<?>> getCatalogItem(BrooklynComponentTemplateResolver resolver, String serviceType) { return null; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java index 7c30c6a..f348ea8 100644 --- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java +++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java @@ -18,12 +18,21 @@ */ package io.brooklyn.camp.brooklyn.spi.creation.service; +import io.brooklyn.camp.spi.PlatformComponentTemplate; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import brooklyn.entity.proxying.EntitySpec; + /** * This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code java:} * to Brooklyn {@link EntitySpec} instances. */ public class JavaServiceTypeResolver extends BrooklynServiceTypeResolver { + private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class); + @Override public String getTypePrefix() { return "java"; } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java index 74c7990..3a96a89 100644 --- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java +++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java @@ -18,17 +18,40 @@ */ package io.brooklyn.camp.brooklyn.spi.creation.service; +import java.util.ServiceLoader; + import io.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver; import brooklyn.catalog.CatalogItem; import brooklyn.entity.Entity; import brooklyn.entity.proxying.EntitySpec; +/** + * Resolves and decorates {@link EntitySpec entity specifications} based on the {@code serviceType} in a template. + * <p> + * The {@link #getTypePrefix()} method returns a string that should match the beginning of the + * service type. The resolver implementation will use the rest of the service type information + * to create and decorate an approprate {@link EntitySpec entity}. + * <p> + * The resolvers are loaded using the {@link ServiceLoader} mechanism, allowing external libraries + * to add extra service type implementations that will be picked up at runtime. + * + * @see BrooklynServiceTypeResolver + * @see ChefServiceTypeResolver + */ public interface ServiceTypeResolver { String DEFAULT_TYPE_PREFIX = "brooklyn"; + /** + * The service type prefix the resolver is responsible for. + */ String getTypePrefix(); + /** + * The name of the Java type that Brooklyn will instantiate to create the + * service. This can be generated from parts of the service type information + * or may be a fixed value. + */ String getBrooklynType(String serviceType); /** @@ -38,6 +61,13 @@ public interface ServiceTypeResolver { */ CatalogItem<Entity, EntitySpec<?>> getCatalogItem(BrooklynComponentTemplateResolver resolver, String serviceType); + /** + * Takes the provided {@link EntitySpec} and decorates it appropriately for the service type. + * <p> + * This includes setting configuration and adding policies, enrichers and initializers. + * + * @see BrooklynServiceTypeResolver#decorateSpec(BrooklynComponentTemplateResolver, EntitySpec) + */ <T extends Entity> void decorateSpec(BrooklynComponentTemplateResolver resolver, EntitySpec<T> spec); }
