make unique tag more configurable and smarter default for workflow sensors and policies
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowPolicy.java b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowPolicy.java
index 3eadfd5..88324b3 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowPolicy.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowPolicy.java
@@ -59,6 +59,10 @@
     public static final ConfigKey<Map<String,Object>> INPUT = WorkflowCommonConfig.INPUT;
     public static final ConfigKey<List<Object>> STEPS = WorkflowCommonConfig.STEPS;
 
+    public static final ConfigKey<String> UNIQUE_TAG_CAMEL = WorkflowSensor.UNIQUE_TAG_CAMEL;
+    public static final ConfigKey<String> UNIQUE_TAG_UNDERSCORE = WorkflowSensor.UNIQUE_TAG_UNDERSCORE;
+    public static final ConfigKey<String> UNIQUE_TAG_DASH = WorkflowSensor.UNIQUE_TAG_DASH;
+
     protected transient Poller<Object> poller;
 
     // ? - do we need to have an option not to run when added?
@@ -110,18 +114,26 @@
 
     @Override
     public void init() {
-        initUniqueTag();
         super.init();
     }
 
     public String initUniqueTag() {
-        if (uniqueTag==null) uniqueTag = "workflow-policy-hash-"+ Objects.hash(getDisplayName(), config().getBag());
+        return getUniqueTag();
+    }
+
+    @Override
+    public String getUniqueTag() {
+        if (uniqueTag==null) {
+            uniqueTag = WorkflowSensor.getUniqueTag(config().getBag(), null);
+            if (uniqueTag==null) {
+                uniqueTag = "workflow-policy-hash-" + Objects.hash(getDisplayName(), config().getBag());
+            }
+        }
         return super.getUniqueTag();
     }
 
     @Override
     public void setEntity(EntityLocal entity) {
-        initUniqueTag();
         super.setEntity(entity);
 
         poller = new Poller<>(getEntity(), this, false);
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowSensor.java b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowSensor.java
index 7c67301..d86b623 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowSensor.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowSensor.java
@@ -64,6 +64,18 @@
 
     public static final ConfigKey<EntityValueToSet> SENSOR = ConfigKeys.newConfigKey(EntityValueToSet.class, "sensor");
 
+    public static final ConfigKey<String> UNIQUE_TAG_CAMEL = ConfigKeys.newStringConfigKey("uniqueTag");
+    public static final ConfigKey<String> UNIQUE_TAG_UNDERSCORE = ConfigKeys.newStringConfigKey("unique_tag");
+    public static final ConfigKey<String> UNIQUE_TAG_DASH = ConfigKeys.newStringConfigKey("unique-tag");
+
+    static String getUniqueTag(ConfigBag bag, String defaultValue) {
+        String result = bag.get(UNIQUE_TAG_CAMEL);
+        if (result==null) result = bag.get(UNIQUE_TAG_UNDERSCORE);
+        if (result==null) result = bag.get(UNIQUE_TAG_DASH);
+        if (result==null) result = defaultValue;
+        return result;
+    }
+
     // do we need to have an option not to run when initialization is done?
 
     public WorkflowSensor() {}
@@ -98,6 +110,7 @@
                 .name("Sensor Workflow Feed: "+sensor.getName())
                 .entity(entity)
                 .onlyIfServiceUp(Maybe.ofDisallowingNull(EntityInitializers.resolve(params, ONLY_IF_SERVICE_UP)).or(false))
+                .uniqueTag(getUniqueTag(params, "workflow_sensor_feed:"+sensor.getName()))
                 .poll(pollConfig);
 
         wc.init(feedBuilder.build(true));
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/variables/TransformVariableWorkflowStep.java b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/variables/TransformVariableWorkflowStep.java
index d59f797..14c8ff7 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/variables/TransformVariableWorkflowStep.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/variables/TransformVariableWorkflowStep.java
@@ -220,6 +220,7 @@
         TRANSFORMATIONS.put("average", () -> v -> average(v, "average"));
         TRANSFORMATIONS.put("size", () -> v -> size(v, "size"));
         TRANSFORMATIONS.put("get", () -> v -> {
+            // TODO should this be able to get indexes etc
             if (v instanceof Supplier) return ((Supplier)v).get();
             return v;
         });