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/10/28 13:05:17 UTC

[2/6] incubator-brooklyn git commit: Adds regexReplacement to BrooklynDslCommon

Adds regexReplacement to BrooklynDslCommon


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

Branch: refs/heads/master
Commit: c76db103547530315b34e7e9bf0830318fb50818
Parents: d53bd18
Author: Martin Harris <gi...@nakomis.com>
Authored: Fri Sep 18 13:11:37 2015 +0100
Committer: Martin Harris <gi...@nakomis.com>
Committed: Thu Oct 15 15:40:41 2015 +0100

----------------------------------------------------------------------
 .../core/sensor/DependentConfiguration.java     | 71 +++++++++++++++++++-
 .../brooklyn/enricher/stock/Transformer.java    |  1 +
 .../core/entity/DependentConfigurationTest.java | 25 +++++++
 .../spi/dsl/methods/BrooklynDslCommon.java      | 48 +++++++++++++
 4 files changed, 144 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c76db103/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java b/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
index ddca05c..2bc5b6e 100644
--- a/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
+++ b/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
@@ -180,7 +180,7 @@ public class DependentConfiguration {
     public static <T> T waitInTaskForAttributeReady(final Entity source, final AttributeSensor<T> sensor, Predicate<? super T> ready, List<AttributeAndSensorCondition<?>> abortConditions, String blockingDetails) {
         return new WaitInTaskForAttributeReady<T,T>(source, sensor, ready, abortConditions, blockingDetails).call();
     }
-    
+
     protected static class WaitInTaskForAttributeReady<T,V> implements Callable<V> {
 
         /* This is a change since before Oct 2014. Previously it would continue to poll,
@@ -483,6 +483,75 @@ public class DependentConfiguration {
             taskArgs);
     }
 
+    public static Task<Function<String, String>> regexReplacement(Object pattern, Object replacement) {
+        List<TaskAdaptable<Object>> taskArgs = getTaskAdaptable(pattern, replacement);
+        Function<List<Object>, Function<String, String>> transformer = new RegexTransformer(pattern, replacement);
+        return transformMultiple(
+                MutableMap.of("displayName", String.format("creating regex replacement function (%s:%s)", pattern, replacement)),
+                transformer,
+                taskArgs
+        );
+    }
+
+    private static List<TaskAdaptable<Object>> getTaskAdaptable(Object... args){
+        List<TaskAdaptable<Object>> taskArgs = Lists.newArrayList();
+        for (Object arg: args) {
+            if (arg instanceof TaskAdaptable) {
+                taskArgs.add((TaskAdaptable<Object>)arg);
+            } else if (arg instanceof TaskFactory) {
+                taskArgs.add(((TaskFactory<TaskAdaptable<Object>>)arg).newTask());
+            }
+        }
+        return taskArgs;
+    }
+
+    public static class RegexTransformer  implements Function<List<Object>, Function<String, String>> {
+
+        private final Object pattern;
+        private final Object replacement;
+
+        public RegexTransformer(Object pattern, Object replacement){
+            this.pattern = pattern;
+            this.replacement = replacement;
+        }
+
+        @Override
+        public Function<String, String> apply(List<Object> input) {
+            Iterator<?> taskArgsIterator = input.iterator();
+            return new RegexReplacer(resolveArgument(pattern, taskArgsIterator), resolveArgument(replacement, taskArgsIterator));
+        }
+
+        private String resolveArgument(Object argument, Iterator<?> taskArgsIterator) {
+            Object resolvedArgument;
+            if (argument instanceof TaskAdaptable || argument instanceof TaskFactory) {
+                resolvedArgument = taskArgsIterator.next();
+            } else if (argument instanceof DeferredSupplier) {
+                resolvedArgument = ((DeferredSupplier<?>) argument).get();
+            } else {
+                resolvedArgument = argument;
+            }
+            return String.valueOf(resolvedArgument);
+        }
+
+    }
+
+    public static class RegexReplacer implements Function<String, String> {
+
+        private final String pattern;
+        private final String replacement;
+
+        public RegexReplacer(String pattern, String replacement) {
+            this.pattern = pattern;
+            this.replacement = replacement;
+        }
+
+        @Nullable
+        @Override
+        public String apply(@Nullable String s) {
+            return Strings.replaceAllRegex(s, pattern, replacement);
+        }
+    }
+
     /** returns a task for parallel execution returning a list of values for the given sensor for the given entity list, 
      * optionally when the values satisfy a given readiness predicate (defaulting to groovy truth if not supplied) */
     public static <T> Task<List<T>> listAttributesWhenReady(AttributeSensor<T> sensor, Iterable<Entity> entities) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c76db103/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java
index ef23ab4..815b07d 100644
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java
+++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java
@@ -45,6 +45,7 @@ public class Transformer<T,U> extends AbstractTransformer<T,U> {
     public static ConfigKey<Function<?, ?>> TRANSFORMATION_FROM_EVENT = ConfigKeys.newConfigKey(new TypeToken<Function<?, ?>>() {}, "enricher.transformation.fromevent");
     
     public Transformer() {
+        System.out.println("Creating");
     }
 
     /** returns a function for transformation, for immediate use only (not for caching, as it may change) */

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c76db103/core/src/test/java/org/apache/brooklyn/core/entity/DependentConfigurationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/DependentConfigurationTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/DependentConfigurationTest.java
index acd3a7d..43c37e7 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/DependentConfigurationTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/DependentConfigurationTest.java
@@ -31,11 +31,14 @@ import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
 import org.apache.brooklyn.core.sensor.DependentConfiguration;
+import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.test.Asserts;
@@ -110,6 +113,28 @@ public class DependentConfigurationTest extends BrooklynAppUnitTestSupport {
     }
 
     @Test
+    public void testRegexReplacementWithStrings() throws Exception {
+        Task<Function<String, String>> task = DependentConfiguration.regexReplacement("foo", "bar");
+        submit(task);
+        Function<String, String> regexReplacer = task.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        Assert.assertEquals(regexReplacer.apply("somefootext"), "somebartext");
+    }
+
+    @Test
+    public void testRegexReplacementWithAttributeWhenReady() throws Exception {
+        AttributeSensor<Object> replacementSensor = Sensors.newSensor(Object.class, "test.replacement");
+        DependentConfiguration.attributeWhenReady(entity, TestEntity.NAME);
+        Task<String> pattern = DependentConfiguration.attributeWhenReady(entity, TestEntity.NAME);
+        Task<Object> replacement = DependentConfiguration.attributeWhenReady(entity, replacementSensor);
+        Task<Function<String, String>> task = DependentConfiguration.regexReplacement(pattern, replacement);
+        submit(task);
+        entity.sensors().set(TestEntity.NAME, "foo");
+        entity.sensors().set(replacementSensor, "bar");
+        Function<String, String> regexReplacer = task.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        Assert.assertEquals(regexReplacer.apply("somefootext"), "somebartext");
+    }
+
+    @Test
     public void testAttributeWhenReady() throws Exception {
         final Task<String> t = submit(DependentConfiguration.attributeWhenReady(entity, TestEntity.NAME));
         assertNotDoneContinually(t);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c76db103/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index 92dc14e..5139b06 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -23,6 +23,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Callable;
 
+import javax.annotation.Nullable;
+
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.mgmt.TaskAdaptable;
@@ -191,6 +193,31 @@ public class BrooklynDslCommon {
         }
     }
 
+
+    public static Object regexReplacement(final Object pattern, final Object replacement) {
+        if (DslUtils.resolved(pattern, replacement)) {
+            return new RegexReplacer(String.valueOf(pattern), String.valueOf(replacement));
+        } else {
+            return new DslRegexReplacer(pattern, replacement);
+        }
+    }
+
+    public static class RegexReplacer implements Function<String, String> {
+        private final String pattern;
+        private final String replacement;
+
+        public RegexReplacer(String pattern, String replacement) {
+            this.pattern = pattern;
+            this.replacement = replacement;
+        }
+
+        @Nullable
+        @Override
+        public String apply(@Nullable String s) {
+            return Strings.replaceAllRegex(s, pattern, replacement);
+        }
+    }
+
     /**
      * Deferred execution of String formatting.
      *
@@ -221,6 +248,27 @@ public class BrooklynDslCommon {
         }
     }
 
+    protected static class DslRegexReplacer extends BrooklynDslDeferredSupplier<Function<String, String>> {
+
+        private Object pattern;
+        private Object replacement;
+
+        public DslRegexReplacer(Object pattern, Object replacement) {
+            this.pattern = pattern;
+            this.replacement = replacement;
+        }
+
+        @Override
+        public Task<Function<String, String>> newTask() {
+            return DependentConfiguration.regexReplacement(pattern, replacement);
+        }
+
+        @Override
+        public String toString() {
+            return String.format("$brooklyn:regexReplace(%s:%s)", pattern, replacement);
+        }
+    }
+
     /** @deprecated since 0.7.0; use {@link DslFormatString} */
     @SuppressWarnings("serial")
     @Deprecated