You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2013/09/29 13:13:43 UTC

svn commit: r1527303 - in /directory/escimo/branches/json-schema-experiment/client: ./ src/main/java/org/apache/directory/scim/ src/main/resources/

Author: kayyagari
Date: Sun Sep 29 11:13:43 2013
New Revision: 1527303

URL: http://svn.apache.org/r1527303
Log:
generating java classes from scim schema

Added:
    directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/AttributeDetail.java
    directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/JsonToJava.java
    directory/escimo/branches/json-schema-experiment/client/src/main/resources/
    directory/escimo/branches/json-schema-experiment/client/src/main/resources/resource-class.st
Modified:
    directory/escimo/branches/json-schema-experiment/client/pom.xml

Modified: directory/escimo/branches/json-schema-experiment/client/pom.xml
URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/client/pom.xml?rev=1527303&r1=1527302&r2=1527303&view=diff
==============================================================================
--- directory/escimo/branches/json-schema-experiment/client/pom.xml (original)
+++ directory/escimo/branches/json-schema-experiment/client/pom.xml Sun Sep 29 11:13:43 2013
@@ -39,6 +39,12 @@
      <artifactId>escimo-common</artifactId>
      <version>${project.version}</version>
    </dependency>   
-   
+
+   <dependency>
+     <groupId>org.antlr</groupId>
+     <artifactId>stringtemplate</artifactId>
+     <version>3.2.1</version>
+   </dependency>
+      
   </dependencies>
 </project>

Added: directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/AttributeDetail.java
URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/AttributeDetail.java?rev=1527303&view=auto
==============================================================================
--- directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/AttributeDetail.java (added)
+++ directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/AttributeDetail.java Sun Sep 29 11:13:43 2013
@@ -0,0 +1,111 @@
+/*
+ *  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.directory.scim;
+
+
+/**
+ * 
+ * A simple pojo internally used while gerating the source code.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class AttributeDetail
+{
+    private String name;
+    private String javaType;
+    private boolean multiValued = false;
+
+
+    public AttributeDetail( String name, String javaType )
+    {
+        if ( name == null || javaType == null )
+        {
+            throw new IllegalArgumentException( "Null value cannot be accepted" );
+        }
+
+        this.name = name;
+        this.javaType = javaType;
+    }
+
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public String getMethodName()
+    {
+        return Character.toUpperCase( name.charAt( 0 ) ) + name.substring( 1 );
+    }
+
+    public String getJavaType()
+    {
+        return javaType;
+    }
+
+
+    public boolean isMultiValued()
+    {
+        return multiValued;
+    }
+
+
+    public void setMultiValued( boolean isMultiValued )
+    {
+        this.multiValued = isMultiValued;
+    }
+
+    
+    public boolean isBoolean()
+    {
+        return "boolean".equalsIgnoreCase( javaType );
+    }
+    
+
+    public int compareTo( Object o )
+    {
+        AttributeDetail that = ( AttributeDetail ) o;
+
+        return getName().compareTo( that.getName() );
+    }
+
+
+    @Override
+    public boolean equals( Object obj )
+    {
+        return getName().equals( ( ( AttributeDetail ) obj ).getName() );
+    }
+
+
+    @Override
+    public int hashCode()
+    {
+        return name.hashCode();
+    }
+
+
+    @Override
+    public String toString()
+    {
+        return name + "=" + name;
+    }
+
+}

Added: directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/JsonToJava.java
URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/JsonToJava.java?rev=1527303&view=auto
==============================================================================
--- directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/JsonToJava.java (added)
+++ directory/escimo/branches/json-schema-experiment/client/src/main/java/org/apache/directory/scim/JsonToJava.java Sun Sep 29 11:13:43 2013
@@ -0,0 +1,171 @@
+/*
+ *   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.directory.scim;
+
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.antlr.stringtemplate.StringTemplate;
+import org.antlr.stringtemplate.StringTemplateGroup;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+/**
+ * TODO JsonToJava.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class JsonToJava
+{
+    private static StringTemplateGroup stg = new StringTemplateGroup( "json" );
+    
+    public static void compile( String schema )
+    {
+        JsonParser parser = new JsonParser();
+        JsonObject json = ( JsonObject ) parser.parse( schema );
+
+        List<String> innerClasses = new ArrayList<String>();
+        
+        StringTemplate template = generateClass( json, innerClasses, null );
+        template.setAttribute( "allInnerClasses", innerClasses );
+        
+        System.out.println( template );
+    }
+
+    
+    private static StringTemplate generateClass( JsonObject json, List<String> innerClasses, StringTemplate parent )
+    {
+        StringTemplate template = stg.getInstanceOf( "resource-class" );
+
+        if ( json.has( "id" ) )
+        {
+            String schemaId = json.get( "id" ).getAsString();
+            template.setAttribute( "schemaId", schemaId );
+
+            template.setAttribute( "package", "org.apache.directory.scim" );
+
+            template.setAttribute( "visibility", "public" );
+
+            String desc = json.get( "description" ).getAsString();
+            template.setAttribute( "resourceDesc", desc );
+        }
+
+        if( parent != null )
+        {
+            template.setAttribute( "static", "static" );
+        }
+
+        String className = json.get( "name" ).getAsString();
+        template.setAttribute( "className", className );
+
+        List<AttributeDetail> simpleAttributes = new ArrayList<AttributeDetail>();
+
+
+        JsonArray attributes;
+        
+        if( json.has( "attributes" ) )
+        {
+            attributes = json.get( "attributes" ).getAsJsonArray();
+        }
+        else
+        {
+            attributes = json.get( "subAttributes" ).getAsJsonArray();
+        }
+
+        Iterator<JsonElement> itr = attributes.iterator();
+        while ( itr.hasNext() )
+        {
+            JsonObject jo = ( JsonObject ) itr.next();
+            String type = jo.get( "type" ).getAsString();
+
+            String name = jo.get( "name" ).getAsString();
+
+            String javaType = "String";
+            if ( type.equals( "numeric" ) )
+            {
+                javaType = "Number";
+            }
+            else if ( type.equals( "boolean" ) )
+            {
+                javaType = "boolean";
+            }
+
+            if ( type.equals( "complex" ) )
+            {
+                javaType = Character.toUpperCase( name.charAt( 0 ) ) + name.substring( 1 );
+                
+                if( javaType.endsWith( "s" ) )
+                {
+                    javaType = javaType.substring( 0, javaType.length() - 1 );
+                }
+                
+                // replace the type's name
+                jo.remove( "name" );
+                jo.addProperty( "name", javaType );
+                
+                javaType = className + "." + javaType;
+                
+                boolean multiValued = jo.get( "multiValued" ).getAsBoolean();
+                
+                if ( multiValued )
+                {
+                    javaType = "java.util.List<" + javaType + ">";
+                }
+                
+                //how to add inner classes
+                StringTemplate inner = generateClass( jo, innerClasses, template );
+                innerClasses.add( inner.toString() );
+            }
+
+            AttributeDetail nc = new AttributeDetail( name, javaType );
+            simpleAttributes.add( nc );
+        }
+
+        template.setAttribute( "allAttrs", simpleAttributes );
+
+        return template;
+    }
+
+    public static void main( String[] args ) throws Exception
+    {
+        //InputStream in = JsonToJava.class.getClassLoader().getSystemClassLoader().getResourceAsStream( "user-schema.json" );
+        BufferedReader br = new BufferedReader( new FileReader(
+            "/Users/dbugger/projects/json-schema-escimo/common/src/main/resources/user-schema.json" ) );
+        String s;
+
+        StringBuilder sb = new StringBuilder();
+        while ( ( s = br.readLine() ) != null )
+        {
+            sb.append( s );
+        }
+
+        JsonToJava.compile( sb.toString() );
+    }
+}

Added: directory/escimo/branches/json-schema-experiment/client/src/main/resources/resource-class.st
URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/client/src/main/resources/resource-class.st?rev=1527303&view=auto
==============================================================================
--- directory/escimo/branches/json-schema-experiment/client/src/main/resources/resource-class.st (added)
+++ directory/escimo/branches/json-schema-experiment/client/src/main/resources/resource-class.st Sun Sep 29 11:13:43 2013
@@ -0,0 +1,61 @@
+$!/*
+ *  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.
+ *
+ */!$
+$if(package)$
+package $package$;
+$endif$
+
+$visibility$ $static$ class $className$
+{
+
+    $if(schemaId)$
+    public static final String schemaId = "$schemaId$";
+    $endif$
+    
+    $if(resourceDesc)$
+    public static final String resourceDesc = "$resourceDesc$";
+    $endif$
+    
+    $allAttrs: { attr | private $attr.javaType$ $attr.name$;}; separator="\n\n"$
+    
+    public $className$()
+    {
+    
+    }
+   
+   $allAttrs: { attr | 
+    public void set$attr.methodName$( $attr.javaType$ $attr.name$ )
+    {      
+       this.$attr.name$ = $attr.name$;
+    }
+   
+    $if(attr.boolean)$
+    public $attr.javaType$ is$attr.methodName$()
+    $else$
+    public $attr.javaType$ get$attr.methodName$()
+    $endif$
+    {
+       return $attr.name$;
+    }
+    
+   }$
+    
+    
+    $allInnerClasses: { innerClass | $innerClass$ }; separator="\n\n"$
+}
\ No newline at end of file