You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2010/11/26 09:38:59 UTC

svn commit: r1039269 - in /incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator: ./ src/ src/antlr/ src/antlr/org/ src/antlr/org/apache/ src/antlr/org/apache/chemistry/ src/antlr/org/apache/chemistry/opencmis/ src/antlr/org/apache/chemist...

Author: jens
Date: Fri Nov 26 08:38:59 2010
New Revision: 1039269

URL: http://svn.apache.org/viewvc?rev=1039269&view=rev
Log:
start with creating an experimental validator for Orderliy in Java (useful for the browser binding integration)

Added:
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/build.xml
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/apache/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/apache/chemistry/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/apache/chemistry/opencmis/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/apache/chemistry/opencmis/orderly/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/apache/chemistry/opencmis/orderly/Orderly.g
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/chemistry/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/chemistry/opencmis/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/chemistry/opencmis/orderly/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/chemistry/opencmis/orderly/validate/
    incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/chemistry/opencmis/orderly/validate/Validator.java

Added: incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/build.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/build.xml?rev=1039269&view=auto
==============================================================================
--- incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/build.xml (added)
+++ incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/build.xml Fri Nov 26 08:38:59 2010
@@ -0,0 +1,93 @@
+<project name="orderlyvalidator" basedir="." default="compile">
+
+    <!-- properties for location of directories and files used in build -->
+    <property name="java.src.dir"   value="src/java"/>
+    <property name="build.dir"      value="build"/>
+    <property name="antgen.src.dir" value="${build.dir}/generated-sources/antlr3"/>
+    <property name="testsrc.dir"    value="testsrc"/>
+    <property name="antlr.jar.dir"  value="C:/Java/maven-repository/org/antlr/antlr/3.2" />
+    <property name="antlr.jar.file" value="antlr-3.2.jar" />
+	<property name="jackson.dir"    value="C:/Java/jackson-1.5.6/" />
+    <property name="antlr.jar"      value="${antlr.jar.dir}/${antlr.jar.file}" />
+	<property name="package"        value="org/apache/chemistry/opencmis/orderly"/>
+    <property name="grammar.dir"    value="src/antlr/${package}"/>
+    <property name="grammar.name"   value="Orderly.g"/>
+    <property name="classes.dir"    value="${build.dir}/classes"/>
+    <property name="jar.dir"        value="${build.dir}/jar"/>
+	
+    <!-- Path settings used for classpath and execution  -->
+    <path id="base.path">
+      <pathelement path="${classpath}"/>
+	    <fileset dir="${antlr.jar.dir}">
+		  <include name="${antlr.jar.file}"/>		
+	    </fileset>
+		
+        <fileset dir="${jackson.dir}">
+          <include name="jackson-core-asl-1.5.6.jar" />
+          <include name="jackson-mapper-asl-1.5.6.jar" />
+        </fileset>
+      <!-- <pathelement location="$classes"/> -->
+    </path>
+
+    <!-- build targets for cleaning before build, antlr code generation, javac
+         compilation, jar creation and running of the tests -->
+    <target name="clean">
+        <delete dir="${build.dir}"/>
+    </target>
+
+    <property name="antlr.libdir" location="./antlr3" />
+    
+    <property name="antlr.libdir" location="./antlr3" />
+    <patternset id="antlr.libs">
+        <include name="antlr-3.2.jar" />
+    </patternset>
+
+    <target name="init">
+        <!-- Create the time stamp -->
+        <tstamp />
+        <mkdir dir="${antgen.src.dir}/${package}" />
+        <mkdir dir="${classes.dir}/${package}" />
+    </target>
+ 
+    <target name="antlr" depends="init" description="run antlr on grammar">
+        <echo message="antlr ${grammar.dir}/${grammar.name}" />
+        <antlr:antlr3 xmlns:antlr="antlib:org/apache/tools/ant/antlr"
+            target="${grammar.dir}/${grammar.name}"
+               outputdirectory="${antgen.src.dir}/${package}"
+			   libdirectory="${antgen.src.dir}"
+               multithreaded="false"
+               report="false"
+               profile="false">
+        </antlr:antlr3>
+    </target>
+	
+    <target name="compile" depends="antlr">
+        <mkdir dir="${classes.dir}"/>
+        <javac srcdir="${antgen.src.dir}" destdir="${classes.dir}">
+		    <classpath refid="base.path"/>
+		</javac>
+        <javac srcdir="${java.src.dir}" destdir="${classes.dir}">
+		    <classpath refid="base.path"/>
+		</javac>
+    </target>
+
+    <target name="jar" depends="compile">
+        <mkdir dir="${jar.dir}"/>
+        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
+<!--		
+            <manifest>
+                <attribute name="Main-Class" value="${main-class}"/>
+			<attribute name="Class-Path" value="${antlr.jar}" />
+		</manifest>
+-->		
+           <fileset dir="${antgen.src.dir}" />
+        </jar>
+    </target>
+
+    <target name="run" depends="jar">
+	    <java jar="${jar.dir}/${ant.project.name}.jar" fork="true" input="${test-file}"/>
+    </target>
+
+    <target name="clean-build" depends="clean,jar"/>
+
+</project>

Added: incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/apache/chemistry/opencmis/orderly/Orderly.g
URL: http://svn.apache.org/viewvc/incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/apache/chemistry/opencmis/orderly/Orderly.g?rev=1039269&view=auto
==============================================================================
--- incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/apache/chemistry/opencmis/orderly/Orderly.g (added)
+++ incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/antlr/org/apache/chemistry/opencmis/orderly/Orderly.g Fri Nov 26 08:38:59 2010
@@ -0,0 +1,302 @@
+/*
+ * 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.
+ *
+ */
+
+grammar Orderly;
+
+options {
+  language = Java;
+  output = AST;
+}
+
+@header {
+/*
+ * THIS FILE IS AUTO-GENERATED, DO NOT EDIT.
+ *
+ * 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.
+ *
+ *
+ * THIS FILE IS AUTO-GENERATED, DO NOT EDIT.
+ */
+package org.apache.chemistry.opencmis.orderly;
+import java.util.Map;
+import java.util.HashMap;
+}
+
+@lexer::header{ 
+package org.apache.chemistry.opencmis.orderly;
+}
+
+@main {
+}
+
+orderly_schema returns [Object result]
+	: e=unnamed_entries? ';'? {$result = $e.result; }
+	;
+
+named_entries returns [Map<Object,Object> result]
+@init {
+	Map<Object,Object> map = new HashMap<Object,Object>();
+}
+@after{
+$result = map;
+}
+	: e=named_entry[map] { } (
+      ';' e2=named_entry[map] { }
+      )*
+    ;
+
+unnamed_entries returns [Object result] 
+@init {
+	List<Object> arr = new ArrayList<Object>();
+}
+@after{
+$result = (arr.size() > 1 ? arr : arr.get(0));
+System.out.println("unnamed_entries return type " + $result.getClass().getName());
+}
+	: e=unnamed_entry { arr.add($e.result); } (
+      ';' e2=unnamed_entry {  arr.add($e2.result); }
+      )*;
+
+named_entry [Map<Object,Object> parentMap]
+@init {
+	Map<Object,Object> map = new HashMap<Object,Object>();
+}
+  :  (definition_prefix[map] name=property_name definition_suffix[map]) {parentMap.put($name.result, map);}
+  |  (string_prefix[map] name=property_name string_suffix[map])         {parentMap.put($name.result, map);}
+  ;
+
+unnamed_entry returns [Map<Object,Object> result]
+@init {
+	Map<Object,Object> map = new HashMap<Object,Object>();
+}
+@after{
+    $result = map;
+}
+  :  definition_prefix[map] definition_suffix[map]
+  |  string_prefix[map] string_suffix[map]
+  ;
+
+definition_prefix[Map<Object, Object> map]
+  :  'integer' rng=optional_range[map]?   { map.put("type", "integer"); }
+  |  'number' rng=optional_range[map]?    { map.put("type", "number"); }
+  |  'boolean'                       { map.put("type", "boolean"); }
+  |  'null'                          { map.put("type", "null"); }
+  |  'any'                           { map.put("any", "null"); }
+  |  'array' (
+      ('{' e1=unnamed_entries? ';'? '}' o=optional_additional_marker[map]? rng=optional_range[map]?)     
+      { 
+          map.put("type", "array"); 
+          map.put("items", $e1.result); 
+      }
+)//      | ('[' e2=unnamed_entry? ';'? ']' rng=optional_range[map]?)) { /*map.put("type", "array"); map.put("items", $e2.result); */}
+  |  'object' '{' e3=named_entries? ';'? '}' o=optional_additional_marker[map]?  { map.put("type", "object"); map.put("properties", $e3.result);}
+  |  'union'  '{' e1=unnamed_entries? ';'? '}'   { map.put("type", $e1.result); }    
+  ;
+ 
+string_prefix[Map<Object, Object> map]
+    :  
+	'string' rng=optional_range[map]? {map.put("type", "string");}
+	;
+
+string_suffix [Map<Object, Object> map]
+    :  
+	regex=OPTIONAL_PERL_REGEX? definition_suffix[map] { 
+		if ($regex != null)
+			map.put("pattern", $OPTIONAL_PERL_REGEX.text); 
+	}
+	;
+
+definition_suffix [Map<Object, Object> map]
+	:
+	enums=optional_enum_values?  { if (enums!= null && enums.result != null) map.put("enum", enums.result);}
+	def=optional_default_value? { if (def!= null && def.result != null) map.put("default", def.result);}
+	requires=optional_requires? { if (requires!= null &&requires.result != null) map.put("requires", requires.result);}
+	optional=optional_optional_marker[map]?
+	extra=optional_extra_properties? { if (extra!= null && extra.result != null) map.putAll($extra.result);}
+	;
+
+csv_property_names returns [Object result]
+@init {
+	List<Object> csvs = new ArrayList<Object>();
+}	
+@after{
+$result = csvs;
+}
+   :
+    prop=property_name          { csvs.add($prop.result);}
+    (  ',' prop2=property_name  { csvs.add($prop2.result);}
+    ) * { }
+	;
+
+optional_extra_properties returns [Map<Object, Object> result]
+    :  ('`' obj=json_object '`') {$result=$obj.result;}
+	;
+
+optional_requires returns [Object result]
+    :  ('<' p=csv_property_names '>') {$result = $p.result;}
+	;
+
+optional_optional_marker [Map<Object, Object> map]
+	: OPTIONAL_OPTIONAL_MARKER {map.put("optional", true); }
+	;
+
+optional_additional_marker[Map<Object, Object> map]
+	: OPTIONAL_ADDITIONAL_MARKER {map.put("additionalProperties", true); };
+
+optional_enum_values returns [Object result]
+    : arr=json_array {$result = $arr.result;}
+	;
+
+optional_default_value returns [Object result]
+    : ('=' d=json_value) {$result = $d.result;}
+	;
+
+optional_range[Map<Object, Object> map]  
+    : '{' s=json_number? ',' e=json_number? '}' { map.put("minimum", $s.result); map.put("maximum", $e.result); }
+	;
+
+property_name returns [Object result]
+  : s=json_string                             {$result = $s.result;}
+  | r=PROPERTY_NAME_TOKEN                     {$result = $r.text;}
+  ;
+
+///////////// JSON  //////////////////////////
+
+json_object returns [Map<Object, Object> result]
+   :  '{' m=members? '}' {$result = $m.result;};
+
+members  returns [Map<Object, Object> result]
+@init { 
+	Map<Object, Object> map = new HashMap<Object, Object>();
+}
+@after {
+ $result = map;
+}
+	:
+	pair[map] (',' pair[map] )* {$result = map;}
+	;
+
+pair[Map<Object, Object> map]
+	:  
+	k=json_string ':' v=json_value { map.put($k.result, $v.result);}
+	;
+
+json_array  returns [List<Object> result]
+    : 
+	'[' elem=elements? ']' {$result = $elem.result;}
+	;
+
+json_number  returns [Object result]
+	: 
+	NUM_LIT
+    {
+        try {
+            $result = Long.valueOf($NUM_LIT.text);
+        } catch (NumberFormatException e) {
+            $result = Double.valueOf($NUM_LIT.text);
+        }
+    }	
+	;
+
+elements returns [List<Object> result]
+@init {
+    List<Object> values = new ArrayList<Object>();
+}
+@after {
+    $result = values; 
+} 
+	: 
+	v=json_value {values.add($v.result); }
+	(',' v2=json_value {values.add($v2.result); }
+	)*
+	;
+
+json_value returns [Object result]
+  :  val1=json_string                          {$result = $val1.result;}
+  |  val2=json_number                          {$result = $val2.result;}
+  |  val3=json_object                          {$result = $val3.result;}
+  |  val4=json_array                           {$result = $val4.result;}
+  |  'true'                                    {$result = Boolean.TRUE;}
+  |  'false'                                   {$result = Boolean.FALSE;}
+  |  'null'                                    {$result = null;}
+  ;
+
+json_string returns [String result]
+	: 
+	STRING {$result=$STRING.text;}
+	;
+
+// ----------------------------------------
+
+OPTIONAL_OPTIONAL_MARKER : '?' ;
+
+OPTIONAL_ADDITIONAL_MARKER : '*' ;
+
+PROPERTY_NAME_TOKEN : ('a' .. 'z' | 'A' .. 'Z' | '_' | '-' )+;
+
+OPTIONAL_PERL_REGEX : ('/' ( (~'/') | '\\/' )+ '/');
+
+WS : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+   { $channel = HIDDEN; } ;
+
+COMMENT : ('//' | '#') (~'\n')* {$channel = HIDDEN; };
+
+fragment
+QUOTE_OR_BACKSLASH_OR_CONTROL_CHARACTER
+  :  '"'
+  |  '\\'
+  |  '\\' .
+  ;
+
+STRING  :  '"' ~'"'* '"';
+
+fragment
+HEX  :  'a'..'f'
+  |  'A'..'F'
+  |  '0'..'9';
+
+ESC : '\\\\' ;
+
+/*
+integer : '-'? ('0'..'9')+ ;
+exp     : ('e' | 'E') ('-' | '+') ?  ('0' .. '9')+ ;
+frac    : '.' ('0' .. '9')+ ;
+NUM_LIT : integer frac? exp?;
+*/
+fragment Sign : ('+'|'-')?;
+fragment Digits : ('0'..'9')+;
+fragment FloatBase : Digits DOT Digits | Digits DOT | DOT Digits | Digits;
+fragment ExpNumLit : ('e'|'E') Sign Digits;
+DOT : '.';
+NUM_LIT : Sign FloatBase ExpNumLit?;

Added: incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/chemistry/opencmis/orderly/validate/Validator.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/chemistry/opencmis/orderly/validate/Validator.java?rev=1039269&view=auto
==============================================================================
--- incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/chemistry/opencmis/orderly/validate/Validator.java (added)
+++ incubator/chemistry/playground/chemistry-opencmis-orderlyvalidator/src/java/org/apache/chemistry/opencmis/orderly/validate/Validator.java Fri Nov 26 08:38:59 2010
@@ -0,0 +1,75 @@
+/*
+ * 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.chemistry.opencmis.orderly.validate;
+
+import java.io.FileInputStream;
+import java.io.File;
+
+
+import java.util.Map;
+
+import org.antlr.runtime.ANTLRInputStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.TokenSource;
+import org.antlr.runtime.TokenStream;
+import org.antlr.runtime.tree.CommonTree;
+import org.apache.chemistry.opencmis.orderly.OrderlyLexer;
+import org.apache.chemistry.opencmis.orderly.OrderlyParser;
+import org.apache.chemistry.opencmis.orderly.OrderlyParser.orderly_schema_return;
+import org.codehaus.jackson.map.ObjectMapper;
+
+public class Validator {
+
+    /**
+     * @param args
+     */
+    public static void main(String[] args) {
+        if (args.length < 0 || args.length > 1) {
+            System.err.println("Usage: Validator <file-name>");
+            System.exit(1);
+        }
+        try {
+            CharStream input = new ANTLRInputStream(new FileInputStream(args[0]));
+            TokenSource lexer = new OrderlyLexer(input);
+            TokenStream tokens = new CommonTokenStream(lexer);
+            OrderlyParser parser = new OrderlyParser(tokens);
+
+            orderly_schema_return result = parser.orderly_schema();
+            CommonTree parserTree = (CommonTree) result.getTree();
+            System.out.println("tree="+parserTree.toStringTree()); 
+            
+            // Extract hashmap from parsed tree
+            Object untyped = result.result;
+            System.err.println("Parser result map " + untyped);
+
+            ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
+            mapper.writeValue(System.out, untyped);
+            mapper.writeValue(new File("json-schema.json"), untyped);
+
+
+        } catch (Exception e) {
+            System.err.println("Error parsing inout file " + args[0] + ": " + e);
+            e.printStackTrace();
+        }
+        
+
+    }
+
+}