You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2015/10/02 18:01:46 UTC

svn commit: r1706440 - in /sling/trunk/bundles/scripting/sightly/engine/src: main/java/org/apache/sling/scripting/sightly/impl/compiled/ main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/ main/java/org/apache/sling/scripting/sightly/imp...

Author: radu
Date: Fri Oct  2 16:01:46 2015
New Revision: 1706440

URL: http://svn.apache.org/viewvc?rev=1706440&view=rev
Log:
SLING-4971 - "static" node name not allowed as a script ancestor

* reduced duplication of Java reserved keywords definition

Added:
    sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/utils/JavaEscapeUtils.java
Modified:
    sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/VariableAnalyzer.java
    sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifier.java
    sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifierTest.java

Modified: sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/VariableAnalyzer.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/VariableAnalyzer.java?rev=1706440&r1=1706439&r2=1706440&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/VariableAnalyzer.java (original)
+++ sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/VariableAnalyzer.java Fri Oct  2 16:01:46 2015
@@ -23,11 +23,11 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 
 import org.apache.sling.scripting.sightly.impl.compiler.SightlyParsingException;
 import org.apache.sling.scripting.sightly.impl.compiler.util.VariableTracker;
+import org.apache.sling.scripting.sightly.impl.utils.JavaEscapeUtils;
 
 /**
  * Data structure used in the analysis of variables
@@ -35,7 +35,6 @@ import org.apache.sling.scripting.sightl
  */
 public class VariableAnalyzer {
 
-    private static final HashSet<String> javaKeywords = new HashSet<String>();
     private final VariableTracker<VariableDescriptor> tracker = new VariableTracker<VariableDescriptor>();
     private final List<VariableDescriptor> variables = new ArrayList<VariableDescriptor>();
     private final HashMap<String, VariableDescriptor> dynamicVariables = new HashMap<String, VariableDescriptor>();
@@ -144,16 +143,16 @@ public class VariableAnalyzer {
     }
 
     private String findDynamicName(String original) {
-        return DYNAMIC_PREFIX + syntaxSafeName(original);
+        return DYNAMIC_PREFIX + JavaEscapeUtils.getEscapedToken(original);
     }
 
     private String findGlobalName(String original) {
-        return GLOBAL_PREFIX + syntaxSafeName(original);
+        return GLOBAL_PREFIX + JavaEscapeUtils.getEscapedToken(original);
     }
 
     private String findSafeName(String original) {
         int occurrenceCount = tracker.getOccurrenceCount(original);
-        String syntaxSafe = syntaxSafeName(original);
+        String syntaxSafe = JavaEscapeUtils.getEscapedToken(original);
         if (occurrenceCount == 0) {
             return syntaxSafe; //no other declarations in scope. Use this very name
         } else {
@@ -161,71 +160,10 @@ public class VariableAnalyzer {
         }
     }
 
-    private String syntaxSafeName(String original) {
-        if (javaKeywords.contains(original)) {
-            return "_" + original;
-        }
-        return original.replaceAll("-", "_");
-    }
-
     private String validName(String name) {
         if (name == null || name.contains("-")) {
             throw new SightlyParsingException("Unsupported identifier name: " + name);
         }
         return name.toLowerCase();
     }
-
-    static {
-        javaKeywords.add("abstract");
-        javaKeywords.add("continue");
-        javaKeywords.add("for");
-        javaKeywords.add("new");
-        javaKeywords.add("switch");
-        javaKeywords.add("assert");
-        javaKeywords.add("default");
-        javaKeywords.add("goto");
-        javaKeywords.add("package");
-        javaKeywords.add("synchronized");
-        javaKeywords.add("boolean");
-        javaKeywords.add("do");
-        javaKeywords.add("if");
-        javaKeywords.add("private");
-        javaKeywords.add("this");
-        javaKeywords.add("break");
-        javaKeywords.add("double");
-        javaKeywords.add("implements");
-        javaKeywords.add("protected");
-        javaKeywords.add("throw");
-        javaKeywords.add("byte");
-        javaKeywords.add("else");
-        javaKeywords.add("import");
-        javaKeywords.add("public");
-        javaKeywords.add("throws");
-        javaKeywords.add("case");
-        javaKeywords.add("enum");
-        javaKeywords.add("instanceof");
-        javaKeywords.add("return");
-        javaKeywords.add("transient");
-        javaKeywords.add("catch");
-        javaKeywords.add("extends");
-        javaKeywords.add("int");
-        javaKeywords.add("short");
-        javaKeywords.add("try");
-        javaKeywords.add("char");
-        javaKeywords.add("final");
-        javaKeywords.add("interface");
-        javaKeywords.add("static");
-        javaKeywords.add("void");
-        javaKeywords.add("class");
-        javaKeywords.add("finally");
-        javaKeywords.add("long");
-        javaKeywords.add("strictfp");
-        javaKeywords.add("volatile");
-        javaKeywords.add("const");
-        javaKeywords.add("float");
-        javaKeywords.add("native");
-        javaKeywords.add("super");
-        javaKeywords.add("while");
-    }
-
 }

Modified: sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifier.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifier.java?rev=1706440&r1=1706439&r2=1706440&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifier.java (original)
+++ sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifier.java Fri Oct  2 16:01:46 2015
@@ -19,73 +19,18 @@
 
 package org.apache.sling.scripting.sightly.impl.engine.compiled;
 
-import java.util.HashSet;
-import java.util.Set;
-
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.commons.classloader.ClassLoaderWriter;
 import org.apache.sling.scripting.sightly.impl.compiler.UnitChangeMonitor;
 import org.apache.sling.scripting.sightly.impl.engine.SightlyEngineConfiguration;
+import org.apache.sling.scripting.sightly.impl.utils.JavaEscapeUtils;
 
 /**
  * Identifies a Java source file in a JCR repository.
  */
 public class SourceIdentifier {
 
-    private static final Set<String> reservedKeywords = new HashSet<String>(){{
-        add("abstract");
-        add("assert");
-        add("boolean");
-        add("break");
-        add("byte");
-        add("case");
-        add("catch");
-        add("char");
-        add("class");
-        add("const");
-        add("continue");
-        add("default");
-        add("do");
-        add("double");
-        add("else");
-        add("enum");
-        add("extends");
-        add("final");
-        add("finally");
-        add("float");
-        add("for");
-        add("goto");
-        add("if");
-        add("implements");
-        add("import");
-        add("instanceof");
-        add("int");
-        add("interface");
-        add("long");
-        add("native");
-        add("new");
-        add("package");
-        add("private");
-        add("protected");
-        add("public");
-        add("return");
-        add("short");
-        add("static");
-        add("strictfp");
-        add("super");
-        add("switch");
-        add("synchronized");
-        add("this");
-        add("throw");
-        add("throws");
-        add("transient");
-        add("try");
-        add("void");
-        add("volatile");
-        add("while");
-    }};
-
     private final String className;
     private final Resource resource;
     private final String packageName;
@@ -149,11 +94,7 @@ public class SourceIdentifier {
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < packageNameElements.length; i++) {
             String subPackage = packageNameElements[i];
-            if (reservedKeywords.contains(subPackage)) {
-                sb.append(subPackage).append("_");
-            } else {
-                sb.append(subPackage);
-            }
+            sb.append(JavaEscapeUtils.getEscapedToken(subPackage));
             if (i != packageNameElements.length - 1) {
                 sb.append(".");
             }

Added: sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/utils/JavaEscapeUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/utils/JavaEscapeUtils.java?rev=1706440&view=auto
==============================================================================
--- sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/utils/JavaEscapeUtils.java (added)
+++ sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/utils/JavaEscapeUtils.java Fri Oct  2 16:01:46 2015
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.scripting.sightly.impl.utils;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * The {@code JavaEscapeUtils} provides useful methods for escaping or transforming invalid Java tokens to valid ones that could be used in
+ * generated Java source code.
+ */
+public class JavaEscapeUtils {
+
+    private static final Set<String> reservedKeywords = new HashSet<String>() {{
+        add("abstract");
+        add("assert");
+        add("boolean");
+        add("break");
+        add("byte");
+        add("case");
+        add("catch");
+        add("char");
+        add("class");
+        add("const");
+        add("continue");
+        add("default");
+        add("do");
+        add("double");
+        add("else");
+        add("enum");
+        add("extends");
+        add("final");
+        add("finally");
+        add("float");
+        add("for");
+        add("goto");
+        add("if");
+        add("implements");
+        add("import");
+        add("instanceof");
+        add("int");
+        add("interface");
+        add("long");
+        add("native");
+        add("new");
+        add("package");
+        add("private");
+        add("protected");
+        add("public");
+        add("return");
+        add("short");
+        add("static");
+        add("strictfp");
+        add("super");
+        add("switch");
+        add("synchronized");
+        add("this");
+        add("throw");
+        add("throws");
+        add("transient");
+        add("try");
+        add("void");
+        add("volatile");
+        add("while");
+    }};
+
+    /**
+     * Escapes and / or transforms an invalid token (in case the token represents a reserved Java keyword) to provide a valid token.
+     *
+     * @param token the token to be transformed
+     * @return a valid Java token
+     */
+    public static String getEscapedToken(String token) {
+        String result = token.toLowerCase();
+        if (reservedKeywords.contains(result)) {
+            result = "_" + result;
+        }
+        return result.replaceAll("-", "_");
+    }
+
+}

Modified: sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifierTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifierTest.java?rev=1706440&r1=1706439&r2=1706440&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifierTest.java (original)
+++ sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/engine/compiled/SourceIdentifierTest.java Fri Oct  2 16:01:46 2015
@@ -42,11 +42,11 @@ public class SourceIdentifierTest {
 
     @Test
     public void testGetPackageName() throws Exception {
-        assertEquals("apps.blah.static_.foo", sourceIdentifier.getPackageName());
+        assertEquals("apps.blah._static.foo", sourceIdentifier.getPackageName());
     }
 
     @Test
     public void testGetFullyQualifiedName() throws Exception {
-        assertEquals("apps.blah.static_.foo.SightlyJava_foo", sourceIdentifier.getFullyQualifiedName());
+        assertEquals("apps.blah._static.foo.SightlyJava_foo", sourceIdentifier.getFullyQualifiedName());
     }
 }
\ No newline at end of file