You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/10/20 14:39:17 UTC

[sling-org-apache-sling-repoinit-parser] 08/46: SLING-5843 - add 'register namespace' statement to repoinit parser

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

rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-repoinit-parser.git

commit 3833cfbb620e591232fb9c368bb8cff8b4afa783
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Mon Jul 18 08:50:04 2016 +0000

    SLING-5843 - add 'register namespace' statement to repoinit parser
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1753177 13f79535-47bb-0310-9956-ffa450edef68
---
 .../parser/operations/OperationVisitor.java        |  1 +
 ...perationVisitor.java => RegisterNamespace.java} | 32 +++++++++++++----
 .../repoinit/parser/operations/package-info.java   |  2 +-
 src/main/javacc/RepoInitGrammar.jjt                | 40 ++++++++++++++++++----
 .../parser/test/OperationToStringVisitor.java      |  6 ++++
 .../repoinit/parser/test/ParsingErrorsTest.java    | 21 ++++++++----
 src/test/resources/testcases/test-40-output.txt    |  3 ++
 src/test/resources/testcases/test-40.txt           |  4 +++
 src/test/resources/testcases/test-99-output.txt    |  1 +
 src/test/resources/testcases/test-99.txt           |  2 ++
 10 files changed, 92 insertions(+), 20 deletions(-)

diff --git a/src/main/java/org/apache/sling/repoinit/parser/operations/OperationVisitor.java b/src/main/java/org/apache/sling/repoinit/parser/operations/OperationVisitor.java
index 4079386..d7d2682 100644
--- a/src/main/java/org/apache/sling/repoinit/parser/operations/OperationVisitor.java
+++ b/src/main/java/org/apache/sling/repoinit/parser/operations/OperationVisitor.java
@@ -23,4 +23,5 @@ public interface OperationVisitor {
     void visitSetAclPrincipal(SetAclPrincipals s);
     void visitSetAclPaths(SetAclPaths s);
     void visitCreatePath(CreatePath cp);
+    void visitRegisterNamespace(RegisterNamespace rn);
 }
diff --git a/src/main/java/org/apache/sling/repoinit/parser/operations/OperationVisitor.java b/src/main/java/org/apache/sling/repoinit/parser/operations/RegisterNamespace.java
similarity index 53%
copy from src/main/java/org/apache/sling/repoinit/parser/operations/OperationVisitor.java
copy to src/main/java/org/apache/sling/repoinit/parser/operations/RegisterNamespace.java
index 4079386..b5a947b 100644
--- a/src/main/java/org/apache/sling/repoinit/parser/operations/OperationVisitor.java
+++ b/src/main/java/org/apache/sling/repoinit/parser/operations/RegisterNamespace.java
@@ -17,10 +17,30 @@
 
 package org.apache.sling.repoinit.parser.operations;
 
-public interface OperationVisitor {
-    void visitCreateServiceUser(CreateServiceUser s);
-    void visitDeleteServiceUser(DeleteServiceUser s);
-    void visitSetAclPrincipal(SetAclPrincipals s);
-    void visitSetAclPaths(SetAclPaths s);
-    void visitCreatePath(CreatePath cp);
+public class RegisterNamespace extends Operation {
+    private final String prefix;
+    private final String uri;
+    
+    public RegisterNamespace(String prefix, String uri) {
+        this.prefix = prefix;
+        this.uri = uri;
+    }
+    
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + " " + getParametersDescription();
+    }
+    
+    @Override
+    protected String getParametersDescription() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("(").append(prefix == null ? "" : prefix).append(") ");
+        sb.append(uri);
+        return sb.toString();
+    }
+
+    @Override
+    public void accept(OperationVisitor v) {
+        v.visitRegisterNamespace(this);
+    }
 }
diff --git a/src/main/java/org/apache/sling/repoinit/parser/operations/package-info.java b/src/main/java/org/apache/sling/repoinit/parser/operations/package-info.java
index fad0a42..b1ee857 100644
--- a/src/main/java/org/apache/sling/repoinit/parser/operations/package-info.java
+++ b/src/main/java/org/apache/sling/repoinit/parser/operations/package-info.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  ******************************************************************************/
 
-@Version("1.0.0")
+@Version("2.0.0")
 package org.apache.sling.repoinit.parser.operations;
 
 import aQute.bnd.annotation.Version;
diff --git a/src/main/javacc/RepoInitGrammar.jjt b/src/main/javacc/RepoInitGrammar.jjt
index 66b52b0..1f887b5 100644
--- a/src/main/javacc/RepoInitGrammar.jjt
+++ b/src/main/javacc/RepoInitGrammar.jjt
@@ -8,6 +8,8 @@ options
     STATIC=false;
     LOOKAHEAD=3;
     //FORCE_LA_CHECK=true;
+    //DEBUG_PARSER=true;
+    //DEBUG_LOOKAHEAD=true;
 }
 
 PARSER_BEGIN(RepoInitParserImpl)
@@ -65,13 +67,17 @@ TOKEN:
 |   < END: "end" >
 |   < USER: "user" >
 |   < NODETYPES: "nodetypes" >
+|   < REGISTER: "register" >
+|   < NAMESPACE: "namespace" >
 |   < LPAREN: "(" >
 |   < RPAREN: ")" >
-|   < PRINCIPAL: (["a"-"z"] | ["A"-"Z"] | ["0"-"9"] | "_" | "-")+ >
 |   < COMMA: "," >
 |   < STAR: "*" >
+
+/* The order of these fuzzy statements is important (first match wins?) */ 
 |   < NAMESPACED_ITEM: (["a"-"z"] | ["A"-"Z"])+ ":" (["a"-"z"] | ["A"-"Z"])+ >
 |   < PATH_STRING: "/" (["a"-"z"] | ["A"-"Z"] | ["0"-"9"] | ["-"] | ["_"] | ["."] | ["/"]) * >
+|   < STRING: (["a"-"z"] | ["A"-"Z"] | ["0"-"9"] | ["-"] | ["_"] | ["."] | ["/"] | [":"]) * >
 |   < EOL: "\n" >
 }
 
@@ -85,6 +91,7 @@ List<Operation> parse() :
         | setAclPaths(result) 
         | setAclPrincipals(result)
         | createPathStatement(result)
+        | registerNamespaceStatement(result)
         | blankLine() 
     ) * 
     <EOF>
@@ -104,8 +111,8 @@ List<String> principalsList() :
     List<String> principals = new ArrayList<String>(); 
 }
 {
-    t = <PRINCIPAL> { principals.add(t.image); } 
-    ( <COMMA> t = <PRINCIPAL> { principals.add(t.image); } )* 
+    t = <STRING> { principals.add(t.image); } 
+    ( <COMMA> t = <STRING> { principals.add(t.image); } )* 
     { return principals; }
 }
 
@@ -121,11 +128,11 @@ void serviceUserStatement(List<Operation> result) :
     (<EOL> | <EOF>)
     
     {
-        for(String PRINCIPAL : principals) {
+        for(String principal : principals) {
             if(CREATE == t.kind) {
-                result.add(new CreateServiceUser(PRINCIPAL));
+                result.add(new CreateServiceUser(principal));
             } else {
-                result.add(new DeleteServiceUser(PRINCIPAL));
+                result.add(new DeleteServiceUser(principal));
             }
         } 
     }
@@ -274,3 +281,24 @@ void setAclPrincipals(List<Operation> result) :
         result.add(new SetAclPrincipals(principals, lines));
     }
 }
+
+void registerNamespaceStatement(List<Operation> result) :
+{
+    Token prefix = null;
+    Token uri;
+}
+{
+    <REGISTER> <NAMESPACE> 
+    ( <LPAREN> prefix = <STRING> <RPAREN> )? 
+    uri = <STRING> 
+
+    {
+        if(prefix == null) {
+            result.add(new RegisterNamespace(null, uri.image)); 
+        } else {
+            result.add(new RegisterNamespace(prefix.image, uri.image)); 
+        } 
+    }
+    
+    (<EOL> | <EOF>)
+}
diff --git a/src/test/java/org/apache/sling/repoinit/parser/test/OperationToStringVisitor.java b/src/test/java/org/apache/sling/repoinit/parser/test/OperationToStringVisitor.java
index a439549..a25128a 100644
--- a/src/test/java/org/apache/sling/repoinit/parser/test/OperationToStringVisitor.java
+++ b/src/test/java/org/apache/sling/repoinit/parser/test/OperationToStringVisitor.java
@@ -25,6 +25,7 @@ import org.apache.sling.repoinit.parser.operations.CreatePath;
 import org.apache.sling.repoinit.parser.operations.CreateServiceUser;
 import org.apache.sling.repoinit.parser.operations.DeleteServiceUser;
 import org.apache.sling.repoinit.parser.operations.OperationVisitor;
+import org.apache.sling.repoinit.parser.operations.RegisterNamespace;
 import org.apache.sling.repoinit.parser.operations.SetAclPaths;
 import org.apache.sling.repoinit.parser.operations.SetAclPrincipals;
 
@@ -77,6 +78,11 @@ class OperationToStringVisitor implements OperationVisitor {
     public void visitCreatePath(CreatePath cp) {
         out.println(cp.toString());
     }
+    
+    @Override
+    public void visitRegisterNamespace(RegisterNamespace rn) {
+        out.println(rn.toString());
+    }
 
     private void dumpAclLines(Collection<AclLine> c) {
         for(AclLine line : c) {
diff --git a/src/test/java/org/apache/sling/repoinit/parser/test/ParsingErrorsTest.java b/src/test/java/org/apache/sling/repoinit/parser/test/ParsingErrorsTest.java
index fb46eef..c902ac1 100644
--- a/src/test/java/org/apache/sling/repoinit/parser/test/ParsingErrorsTest.java
+++ b/src/test/java/org/apache/sling/repoinit/parser/test/ParsingErrorsTest.java
@@ -56,9 +56,13 @@ public class ParsingErrorsTest {
             
             add(new Object[] { "create service user bob, alice, tom21", null  });
             add(new Object[] { "create service user bob-221_BOB", null  });
-            add(new Object[] { "create service user bob/221", ParseException.class  });
+            
+            // this passes since introducing "register namespace" and loosening
+            // the PRINCIPAL regexp
+            add(new Object[] { "create service user bob/221", null  });
+            
             add(new Object[] { "create service user bob,/alice, tom21", ParseException.class  });
-            add(new Object[] { "create service user bob,alice,tom21 # comment not allowed here", TokenMgrError.class  });
+            add(new Object[] { "create service user bob,alice,tom21 # comment not allowed here", ParseException.class });
             add(new Object[] { "CREATE service user bob, alice, tom21", ParseException.class });
             add(new Object[] { "create SERVICE user bob, alice, tom21", ParseException.class });
         }};
@@ -73,17 +77,20 @@ public class ParsingErrorsTest {
     @Test
     public void checkResult() throws ParseException, IOException {
         final StringReader r = new StringReader(input);
+        boolean noException = false;
         try {
             new RepoInitParserImpl(r).parse();
-            if(expected != null) {
-                fail("Expected a " + expected.getSimpleName() + " for [" + input + "]");
-            }
+            noException = true;
         } catch(Exception e) {
-            assertEquals(expected, e.getClass());
+            assertEquals("for input " + input, expected, e.getClass());
         } catch(Error err) {
-            assertEquals(expected, err.getClass());
+            assertEquals("for input " + input, expected, err.getClass());
         } finally {
             r.close();
         }
+        
+        if(noException && expected != null) {
+            fail("Expected a " + expected.getSimpleName() + " for [" + input + "]");
+        }
     }
 }
diff --git a/src/test/resources/testcases/test-40-output.txt b/src/test/resources/testcases/test-40-output.txt
new file mode 100644
index 0000000..e80b5c8
--- /dev/null
+++ b/src/test/resources/testcases/test-40-output.txt
@@ -0,0 +1,3 @@
+RegisterNamespace (foo) uri:some-uri/V/1.0
+RegisterNamespace () uri:without-prefix
+RegisterNamespace (prefix_with-other.things) andSimpleURI
\ No newline at end of file
diff --git a/src/test/resources/testcases/test-40.txt b/src/test/resources/testcases/test-40.txt
new file mode 100644
index 0000000..aa77e26
--- /dev/null
+++ b/src/test/resources/testcases/test-40.txt
@@ -0,0 +1,4 @@
+# Test the register namespace statement
+register namespace (foo) uri:some-uri/V/1.0
+register namespace uri:without-prefix
+register namespace ( prefix_with-other.things ) andSimpleURI
\ No newline at end of file
diff --git a/src/test/resources/testcases/test-99-output.txt b/src/test/resources/testcases/test-99-output.txt
index 2761b1b..fcbe63c 100644
--- a/src/test/resources/testcases/test-99-output.txt
+++ b/src/test/resources/testcases/test-99-output.txt
@@ -16,4 +16,5 @@ SetAclPrincipals for alice bob fred
   AclLine ALLOW {paths=[/content, /var], privileges=[jcr:read]}
   AclLine DENY {paths=[/content/example.com], privileges=[jcr:write]}
   AclLine DENY {nodetypes=[example:Page], paths=[/], privileges=[jcr:all]}
+RegisterNamespace (NSprefix) uri:someURI/v1.42
 CreateServiceUser the-last-one
\ No newline at end of file
diff --git a/src/test/resources/testcases/test-99.txt b/src/test/resources/testcases/test-99.txt
index 44de7e9..54927c4 100644
--- a/src/test/resources/testcases/test-99.txt
+++ b/src/test/resources/testcases/test-99.txt
@@ -31,4 +31,6 @@ set ACL for alice, bob,fred
     
 end
 
+register namespace ( NSprefix ) uri:someURI/v1.42
+
 create service user the-last-one
\ No newline at end of file

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