This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.pipes-1.0.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-pipes.git
commit 0b66cbc244c789c5c84821a3a54ecaca64b4c360 Author: Robert Munteanu <[email protected]> AuthorDate: Thu Apr 27 11:43:20 2017 +0000 SLING-6799 - add support for MV expressions in write pipe This closes #219 Submitted-By: Nicolas Peltier git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/sling-pipes@1792869 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/sling/pipes/internal/WritePipe.java | 52 +++++++++++++--------- .../apache/sling/pipes/internal/WritePipeTest.java | 4 +- src/test/resources/write.json | 3 +- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/apache/sling/pipes/internal/WritePipe.java b/src/main/java/org/apache/sling/pipes/internal/WritePipe.java index a03f3ba..149803c 100644 --- a/src/main/java/org/apache/sling/pipes/internal/WritePipe.java +++ b/src/main/java/org/apache/sling/pipes/internal/WritePipe.java @@ -64,8 +64,9 @@ public class WritePipe extends BasePipe { resourceExpression = getPath(); } + /** - * convert the configured value (can be an expression) in a value that can be written in a resource. + * convert the configured string value (can be an expression) in a value that can be written in a resource. * also handles patch for multivalue properties like <code>+[value]</code> in which case <code>value</code> * is added to the MV property * @param resource resource to which value will be written @@ -73,28 +74,39 @@ public class WritePipe extends BasePipe { * @param expression configured value to write * @return actual value to write to the resource */ + protected Object computeValue(Resource resource, String key, String expression){ + Object value = bindings.instantiateObject((String) expression); + if (value != null && value instanceof String) { + //in that case we treat special case like MV or patches + String sValue = (String)value; + Matcher patch = addPatch.matcher(sValue); + if (patch.matches()) { + String newValue = patch.group(1); + String[] actualValues = resource.adaptTo(ValueMap.class).get(key, String[].class); + List<String> newValues = actualValues != null ? new LinkedList<>(Arrays.asList(actualValues)) : new ArrayList<String>(); + if (!newValues.contains(newValue)) { + newValues.add(newValue); + } + return newValues.toArray(new String[newValues.size()]); + } + Matcher multiMatcher = multi.matcher(sValue); + if (multiMatcher.matches()) { + return multiMatcher.group(1).split(","); + } + } + return value; + } + + protected Object computeValue(Resource resource, String key, Object expression) { if (expression instanceof String) { - Object value = bindings.instantiateObject((String) expression); - if (value != null && value instanceof String) { - //in that case we treat special case like MV or patches - String sValue = (String)value; - Matcher patch = addPatch.matcher(sValue); - if (patch.matches()) { - String newValue = patch.group(1); - String[] actualValues = resource.adaptTo(ValueMap.class).get(key, String[].class); - List<String> newValues = actualValues != null ? new LinkedList<>(Arrays.asList(actualValues)) : new ArrayList<String>(); - if (!newValues.contains(newValue)) { - newValues.add(newValue); - } - return newValues.toArray(new String[newValues.size()]); - } - Matcher multiMatcher = multi.matcher(sValue); - if (multiMatcher.matches()) { - return multiMatcher.group(1).split(","); - } + return computeValue(resource, key, (String)expression); + } else if (expression instanceof String[]){ + List<String> values = new ArrayList<>(); + for (String expr : (String[])expression){ + values.add((String)computeValue(resource, key, expr)); } - return value; + return values.toArray(new String[values.size()]); } return expression; } diff --git a/src/test/java/org/apache/sling/pipes/internal/WritePipeTest.java b/src/test/java/org/apache/sling/pipes/internal/WritePipeTest.java index fdb1d79..d464c96 100644 --- a/src/test/java/org/apache/sling/pipes/internal/WritePipeTest.java +++ b/src/test/java/org/apache/sling/pipes/internal/WritePipeTest.java @@ -64,8 +64,10 @@ public class WritePipeTest extends AbstractPipeTest { */ public static void assertPiped(Resource resource) { ValueMap properties = resource.adaptTo(ValueMap.class); + String[] array = new String[]{"cabbage","carrot"}; assertArrayEquals("Second fruit should have been correctly instantiated & patched, added to the first", new String[]{"apple","banana"}, properties.get("fruits", String[].class)); - assertArrayEquals("Fixed mv should be there", new String[]{"cabbage","carrot"}, properties.get("fixedVegetables", String[].class)); + assertArrayEquals("Fixed mv should be there", array, properties.get("fixedVegetables", String[].class)); + assertArrayEquals("Expr fixed mv should there and computed", array, properties.get("computedVegetables", String[].class)); } @Test diff --git a/src/test/resources/write.json b/src/test/resources/write.json index 4af4e1c..6be4f2c 100644 --- a/src/test/resources/write.json +++ b/src/test/resources/write.json @@ -31,7 +31,8 @@ "conf":{ "jcr:primaryType":"nt:unstructured", "fruits": "+[${fruit.name}]", - "fixedVegetables":"[cabbage,carrot]" + "fixedVegetables":"[cabbage,carrot]", + "computedVegetables":["${'cabbage'}","${'carrot'}"] } } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
