This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag 
org.apache.sling.provisioning.model-1.2.0
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-provisioning-model.git

commit 9c0eaaa3bfb1c4acabf3d8a2c426d5cc12f34122
Author: Stefan Seifert <sseif...@apache.org>
AuthorDate: Thu Jun 4 20:47:35 2015 +0000

    SLING-4766 Provisioning Model does not support adding variables to Sling 
Settings - allow escaping with \${var}
    
    git-svn-id: 
https://svn.apache.org/repos/asf/sling/trunk/tooling/support/provisioning-model@1683639
 13f79535-47bb-0310-9956-ffa450edef68
---
 .../sling/provisioning/model/ModelUtility.java     | 10 ++-
 .../model/ModelUtilityReplaceTest.java             | 77 ++++++++++++++++++++++
 2 files changed, 84 insertions(+), 3 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java 
b/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java
index 4b4ce7b..8c9087f 100644
--- a/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java
+++ b/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java
@@ -313,7 +313,7 @@ public abstract class ModelUtility {
      * @result The value of the variable
      * @throws IllegalArgumentException If variable can't be found.
      */
-    private static String replace(final Feature feature, final String v, final 
VariableResolver resolver) {
+    static String replace(final Feature feature, final String v, final 
VariableResolver resolver) {
         if ( v == null ) {
             return null;
         }
@@ -322,12 +322,15 @@ public abstract class ModelUtility {
         int pos = -1;
         int start = 0;
         while ( ( pos = msg.indexOf('$', start) ) != -1 ) {
+            boolean escapedVariable = (pos > 0 && msg.charAt(pos - 1) == '\\');
             if ( msg.length() > pos && msg.charAt(pos + 1) == '{' && (pos == 0 
|| msg.charAt(pos - 1) != '$') ) {
                 final int endPos = msg.indexOf('}', pos);
                 if ( endPos != -1 ) {
                     final String name = msg.substring(pos + 2, endPos);
                     final String value;
-                    if ( resolver != null ) {
+                    if (escapedVariable) {
+                        value = "\\${" + name + "}";
+                    } else if ( resolver != null ) {
                         value = resolver.resolve(feature, name);
                     } else {
                         value = feature.getVariables().get(name);
@@ -335,7 +338,8 @@ public abstract class ModelUtility {
                     if ( value == null ) {
                         throw new IllegalArgumentException("Unknown variable: 
" + name);
                     }
-                    msg = msg.substring(0, pos) + value + msg.substring(endPos 
+ 1);
+                    int startPos = escapedVariable ? pos - 1 : pos;
+                    msg = msg.substring(0, startPos) + value + 
msg.substring(endPos + 1);
                 }
             }
             start = pos + 1;
diff --git 
a/src/test/java/org/apache/sling/provisioning/model/ModelUtilityReplaceTest.java
 
b/src/test/java/org/apache/sling/provisioning/model/ModelUtilityReplaceTest.java
new file mode 100644
index 0000000..f0fbb40
--- /dev/null
+++ 
b/src/test/java/org/apache/sling/provisioning/model/ModelUtilityReplaceTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.sling.provisioning.model;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.sling.provisioning.model.ModelUtility.VariableResolver;
+import org.junit.Test;
+
+public class ModelUtilityReplaceTest {
+    
+    private static final Feature TEST_FEATURE = new Feature("testFeature");
+    static {
+        TEST_FEATURE.getVariables().put("var1", "value1");
+        TEST_FEATURE.getVariables().put("var2", "value2");
+    }
+
+    @Test
+    public void testNoReplace() {
+        assertEquals("nothing to replace", ModelUtility.replace(TEST_FEATURE, 
"nothing to replace", null));
+    }
+
+    @Test
+    public void testOneReplace() {
+        assertEquals("one value1 variable", ModelUtility.replace(TEST_FEATURE, 
"one ${var1} variable", null));
+        assertEquals("value1 one variable", ModelUtility.replace(TEST_FEATURE, 
"${var1} one variable", null));
+        assertEquals("value1 one variable value1", 
ModelUtility.replace(TEST_FEATURE, "${var1} one variable ${var1}", null));
+    }
+
+    @Test
+    public void testTwoReplaces() {
+        assertEquals("two value1 variables value2", 
ModelUtility.replace(TEST_FEATURE, "two ${var1} variables ${var2}", null));
+        assertEquals("value1value2 two variables", 
ModelUtility.replace(TEST_FEATURE, "${var1}${var2} two variables", null));
+        assertEquals("value2 two variables value1", 
ModelUtility.replace(TEST_FEATURE, "${var2} two variables ${var1}", null));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testInvalidVariable() {
+        assertEquals("one value1 variable", ModelUtility.replace(TEST_FEATURE, 
"one ${var99} variable", null));
+    }
+
+    @Test
+    public void testEscapedVariable() {
+        assertEquals("escaped \\${var99} variable", 
ModelUtility.replace(TEST_FEATURE, "escaped \\${var99} variable", null));
+        assertEquals("\\${var99} escaped variable", 
ModelUtility.replace(TEST_FEATURE, "\\${var99} escaped variable", null));
+        assertEquals("escaped variable \\${var99}", 
ModelUtility.replace(TEST_FEATURE, "escaped variable \\${var99}", null));
+        assertEquals("escaped \\${var1} variable value2", 
ModelUtility.replace(TEST_FEATURE, "escaped \\${var1} variable ${var2}", null));
+    }
+
+    @Test
+    public void testOneResolver() {
+        VariableResolver resolver = new VariableResolver() {
+            @Override
+            public String resolve(Feature feature, String name) {
+                return name.toUpperCase();
+            }
+        };
+        assertEquals("one VAR1 variable", ModelUtility.replace(TEST_FEATURE, 
"one ${var1} variable", resolver));
+        assertEquals("VAR1 one variable", ModelUtility.replace(TEST_FEATURE, 
"${var1} one variable", resolver));
+        assertEquals("VAR1 one variable VAR2", 
ModelUtility.replace(TEST_FEATURE, "${var1} one variable ${var2}", resolver));
+    }
+
+}

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <commits@sling.apache.org>.

Reply via email to