You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2015/04/12 23:48:07 UTC

[2/3] incubator-brooklyn git commit: Better documentation and added check suggested in review

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 <gr...@apache.org>
Authored: Thu Apr 9 14:09:36 2015 +0100
Committer: Andrew Kennedy <gr...@apache.org>
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);
 
 }