Extract CustomizeTemplateBuilder from JcloudsLocation

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

Branch: refs/heads/master
Commit: f89ba453253cadf2d0df1bf05d741543d8e36a9b
Parents: 7582ebe
Author: Sam Corbett <sam.corb...@cloudsoftcorp.com>
Authored: Fri Dec 9 17:29:55 2016 +0000
Committer: Sam Corbett <sam.corb...@cloudsoftcorp.com>
Committed: Tue Dec 20 15:40:12 2016 +0000

----------------------------------------------------------------------
 .../location/jclouds/JcloudsLocation.java       |  88 +++-------
 .../customize/TemplateBuilderCustomizer.java    |  29 ++++
 .../customize/TemplateBuilderCustomizers.java   | 164 +++++++++++++++++++
 3 files changed, 213 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f89ba453/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
index fd06a9a..67aa826 100644
--- 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
+++ 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
@@ -78,6 +78,8 @@ import 
org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
 import 
org.apache.brooklyn.core.mgmt.persist.jclouds.JcloudsBlobStoreBasedObjectStore;
 import 
org.apache.brooklyn.location.jclouds.networking.JcloudsPortForwarderExtension;
 import org.apache.brooklyn.location.jclouds.templates.PortableTemplateBuilder;
+import 
org.apache.brooklyn.location.jclouds.templates.customize.TemplateBuilderCustomizer;
+import 
org.apache.brooklyn.location.jclouds.templates.customize.TemplateBuilderCustomizers;
 import 
org.apache.brooklyn.location.jclouds.templates.customize.TemplateOptionCustomizer;
 import 
org.apache.brooklyn.location.jclouds.templates.customize.TemplateOptionCustomizers;
 import org.apache.brooklyn.location.jclouds.zone.AwsAvailabilityZoneExtension;
@@ -92,7 +94,6 @@ import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.config.ResolvingConfigBag;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
-import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.core.internal.ssh.ShellTool;
 import org.apache.brooklyn.util.core.internal.ssh.SshTool;
 import org.apache.brooklyn.util.core.internal.winrm.WinRmTool;
@@ -109,7 +110,6 @@ import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.exceptions.ReferenceWithError;
 import org.apache.brooklyn.util.exceptions.UserFacingException;
 import org.apache.brooklyn.util.guava.Maybe;
-import org.apache.brooklyn.util.javalang.Enums;
 import org.apache.brooklyn.util.javalang.Reflections;
 import org.apache.brooklyn.util.net.Cidr;
 import org.apache.brooklyn.util.net.Networking;
@@ -120,7 +120,6 @@ import org.apache.brooklyn.util.ssh.IptablesCommands;
 import org.apache.brooklyn.util.ssh.IptablesCommands.Chain;
 import org.apache.brooklyn.util.ssh.IptablesCommands.Policy;
 import org.apache.brooklyn.util.stream.Streams;
-import org.apache.brooklyn.util.text.ByteSizeStrings;
 import org.apache.brooklyn.util.text.KeyValueParser;
 import org.apache.brooklyn.util.text.StringPredicates;
 import org.apache.brooklyn.util.text.Strings;
@@ -141,7 +140,6 @@ import org.jclouds.compute.domain.OperatingSystem;
 import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.domain.TemplateBuilder;
-import org.jclouds.compute.domain.TemplateBuilderSpec;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.domain.Credentials;
 import org.jclouds.domain.LocationScope;
@@ -1232,74 +1230,27 @@ public class JcloudsLocation extends 
AbstractCloudMachineProvisioningLocation im
 
     // ------------- constructing the template, etc ------------------------
 
-    private interface CustomizeTemplateBuilder {
-        void apply(TemplateBuilder tb, ConfigBag props, Object v);
-    }
-
     /** @deprecated since 0.11.0 use {@link TemplateOptionCustomizer} instead 
*/
     @Deprecated
     public interface CustomizeTemplateOptions extends TemplateOptionCustomizer 
{
     }
 
     /** properties which cause customization of the TemplateBuilder */
-    public static final Map<ConfigKey<?>, CustomizeTemplateBuilder> 
SUPPORTED_TEMPLATE_BUILDER_PROPERTIES = 
ImmutableMap.<ConfigKey<?>,CustomizeTemplateBuilder>builder()
-            .put(OS_64_BIT, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        Boolean os64Bit = TypeCoercions.coerce(v, 
Boolean.class);
-                        if (os64Bit!=null)
-                            tb.os64Bit(os64Bit);
-                    }})
-            .put(MIN_RAM, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        tb.minRam( 
(int)(ByteSizeStrings.parse(Strings.toString(v), "mb")/1000/1000) );
-                    }})
-            .put(MIN_CORES, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        tb.minCores(TypeCoercions.coerce(v, Double.class));
-                    }})
-            .put(MIN_DISK, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        tb.minDisk( 
(int)(ByteSizeStrings.parse(Strings.toString(v), "gb")/1000/1000/1000) );
-                    }})
-            .put(HARDWARE_ID, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        tb.hardwareId(((CharSequence)v).toString());
-                    }})
-            .put(IMAGE_ID, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        tb.imageId(((CharSequence)v).toString());
-                    }})
-            .put(IMAGE_DESCRIPTION_REGEX, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        
tb.imageDescriptionMatches(((CharSequence)v).toString());
-                    }})
-            .put(IMAGE_NAME_REGEX, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        tb.imageNameMatches(((CharSequence)v).toString());
-                    }})
-            .put(OS_FAMILY, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        Maybe<OsFamily> osFamily = 
Enums.valueOfIgnoreCase(OsFamily.class, v.toString());
-                        if (osFamily.isAbsent())
-                            throw new IllegalArgumentException("Invalid 
"+OS_FAMILY+" value "+v);
-                        tb.osFamily(osFamily.get());
-                    }})
-            .put(OS_VERSION_REGEX, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        tb.osVersionMatches( ((CharSequence)v).toString() );
-                    }})
-            .put(TEMPLATE_SPEC, new CustomizeTemplateBuilder() {
-                public void apply(TemplateBuilder tb, ConfigBag props, Object 
v) {
-                        
tb.from(TemplateBuilderSpec.parse(((CharSequence)v).toString()));
-                    }})
-            .put(DEFAULT_IMAGE_ID, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        /* done in the code, but included here so that it is 
in the map */
-                    }})
-            .put(TEMPLATE_BUILDER, new CustomizeTemplateBuilder() {
-                    public void apply(TemplateBuilder tb, ConfigBag props, 
Object v) {
-                        /* done in the code, but included here so that it is 
in the map */
-                    }})
+    public static final Map<ConfigKey<?>, ? extends TemplateBuilderCustomizer> 
SUPPORTED_TEMPLATE_BUILDER_PROPERTIES = ImmutableMap.<ConfigKey<?>, 
TemplateBuilderCustomizer>builder()
+            .put(HARDWARE_ID, TemplateBuilderCustomizers.hardwareId())
+            .put(IMAGE_DESCRIPTION_REGEX, 
TemplateBuilderCustomizers.imageDescription())
+            .put(IMAGE_ID, TemplateBuilderCustomizers.imageId())
+            .put(IMAGE_NAME_REGEX, TemplateBuilderCustomizers.imageNameRegex())
+            .put(MIN_CORES, TemplateBuilderCustomizers.minCores())
+            .put(MIN_DISK, TemplateBuilderCustomizers.minDisk())
+            .put(MIN_RAM, TemplateBuilderCustomizers.minRam())
+            .put(OS_64_BIT, TemplateBuilderCustomizers.os64Bit())
+            .put(OS_FAMILY, TemplateBuilderCustomizers.osFamily())
+            .put(OS_VERSION_REGEX, TemplateBuilderCustomizers.osVersionRegex())
+            .put(TEMPLATE_SPEC, TemplateBuilderCustomizers.templateSpec())
+            /* Both done in the code, but included here so that they are in 
the map */
+            .put(DEFAULT_IMAGE_ID, TemplateBuilderCustomizers.noOp())
+            .put(TEMPLATE_BUILDER, TemplateBuilderCustomizers.noOp())
             .build();
 
     /** properties which cause customization of the TemplateOptions */
@@ -1419,11 +1370,11 @@ public class JcloudsLocation extends 
AbstractCloudMachineProvisioningLocation im
         }
 
         // Apply the template builder and options properties
-        for (Map.Entry<ConfigKey<?>, CustomizeTemplateBuilder> entry : 
SUPPORTED_TEMPLATE_BUILDER_PROPERTIES.entrySet()) {
+        for (Map.Entry<ConfigKey<?>, ? extends TemplateBuilderCustomizer> 
entry : SUPPORTED_TEMPLATE_BUILDER_PROPERTIES.entrySet()) {
             ConfigKey<?> key = entry.getKey();
             Object val = config.containsKey(key) ? config.get(key) : 
key.getDefaultValue();
             if (val != null) {
-                CustomizeTemplateBuilder code = entry.getValue();
+                TemplateBuilderCustomizer code = entry.getValue();
                 code.apply(templateBuilder, config, val);
             }
         }
@@ -3100,4 +3051,5 @@ public class JcloudsLocation extends 
AbstractCloudMachineProvisioningLocation im
             return val1;
         }
     }
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f89ba453/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizer.java
----------------------------------------------------------------------
diff --git 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizer.java
 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizer.java
new file mode 100644
index 0000000..3c6e237
--- /dev/null
+++ 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizer.java
@@ -0,0 +1,29 @@
+/*
+ * 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.location.jclouds.templates.customize;
+
+import org.apache.brooklyn.util.core.config.ConfigBag;
+import org.jclouds.compute.domain.TemplateBuilder;
+
+public interface TemplateBuilderCustomizer {
+
+    void apply(TemplateBuilder tb, ConfigBag props, Object v);
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f89ba453/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizers.java
----------------------------------------------------------------------
diff --git 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizers.java
 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizers.java
new file mode 100644
index 0000000..e4426d6
--- /dev/null
+++ 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/customize/TemplateBuilderCustomizers.java
@@ -0,0 +1,164 @@
+/*
+ * 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.location.jclouds.templates.customize;
+
+import org.apache.brooklyn.location.jclouds.JcloudsLocationConfig;
+import org.apache.brooklyn.util.core.config.ConfigBag;
+import org.apache.brooklyn.util.core.flags.TypeCoercions;
+import org.apache.brooklyn.util.guava.Maybe;
+import org.apache.brooklyn.util.javalang.Enums;
+import org.apache.brooklyn.util.text.ByteSizeStrings;
+import org.apache.brooklyn.util.text.Strings;
+import org.jclouds.compute.domain.OsFamily;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.domain.TemplateBuilderSpec;
+
+public class TemplateBuilderCustomizers {
+
+    private TemplateBuilderCustomizers() {
+    }
+
+    public static TemplateBuilderCustomizer hardwareId() {
+        return new HardwareIdTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer imageDescription() {
+        return new ImageDescriptionRegexTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer imageId() {
+        return new ImageIdTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer imageNameRegex() {
+        return new ImageNameRegexTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer minCores() {
+        return new MinCoresTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer minDisk() {
+        return new MinDiskTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer minRam() {
+        return new MinRamTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer noOp() {
+        return new NoOpTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer os64Bit() {
+        return new Os64BitTemplateBuidler();
+    }
+
+    public static TemplateBuilderCustomizer osFamily() {
+        return new OsFamilyTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer osVersionRegex() {
+        return new OsVersionRegexTemplateBuilder();
+    }
+
+    public static TemplateBuilderCustomizer templateSpec() {
+        return new TemplateSpecTemplateBuilder();
+    }
+
+    private static class MinRamTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            tb.minRam((int) (ByteSizeStrings.parse(Strings.toString(v), "mb") 
/ 1000 / 1000));
+        }
+    }
+
+    private static class MinCoresTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            tb.minCores(TypeCoercions.coerce(v, Double.class));
+        }
+    }
+
+    private static class MinDiskTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            tb.minDisk((int) (ByteSizeStrings.parse(Strings.toString(v), "gb") 
/ 1000 / 1000 / 1000));
+        }
+    }
+
+    private static class HardwareIdTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            tb.hardwareId(v.toString());
+        }
+    }
+
+    private static class ImageIdTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            tb.imageId(v.toString());
+        }
+    }
+
+    private static class ImageDescriptionRegexTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            tb.imageDescriptionMatches(v.toString());
+        }
+    }
+
+    private static class ImageNameRegexTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            tb.imageNameMatches(v.toString());
+        }
+    }
+
+    private static class OsFamilyTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            Maybe<OsFamily> osFamily = Enums.valueOfIgnoreCase(OsFamily.class, 
v.toString());
+            if (osFamily.isAbsent()) {
+                throw new IllegalArgumentException("Invalid " + 
JcloudsLocationConfig.OS_FAMILY + " value " + v);
+            }
+            tb.osFamily(osFamily.get());
+        }
+    }
+
+    private static class OsVersionRegexTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            tb.osVersionMatches(v.toString());
+        }
+    }
+
+    private static class TemplateSpecTemplateBuilder implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            tb.from(TemplateBuilderSpec.parse(v.toString()));
+        }
+    }
+
+    private static class Os64BitTemplateBuidler implements 
TemplateBuilderCustomizer {
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+            Boolean os64Bit = TypeCoercions.coerce(v, Boolean.class);
+            if (os64Bit != null) {
+                tb.os64Bit(os64Bit);
+            }
+        }
+    }
+
+    private static class NoOpTemplateBuilder implements 
TemplateBuilderCustomizer {
+        @Override
+        public void apply(TemplateBuilder tb, ConfigBag props, Object v) {
+        }
+    }
+}

Reply via email to