package fr.lteconsulting.hexa.rebind;
import java.io.OutputStream;
import java.io.PrintWriter;
import com.google.gwt.core.ext.Generator;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
import com.google.gwt.user.rebind.SourceWriter;
import fr.lteconsulting.hexa.client.comm.CustomMethod;
import fr.lteconsulting.hexa.client.comm.FieldName;
public class DataProxySerializedGenerator extends Generator
{
@Override
public String generate( TreeLogger logger, GeneratorContext context, String requestedClass ) throws UnableToCompleteException
{
logger.log( TreeLogger.INFO, "Generate '" + requestedClass, null );
TypeOracle typeOracle = context.getTypeOracle();
JClassType requestedType = typeOracle.findType( requestedClass );
if( requestedType == null )
{
logger.log( TreeLogger.ERROR, "Type '" + requestedClass + "' has not been found by the Oracle", null );
throw new UnableToCompleteException();
}
String className = requestedType.getName() + "Impl";
String fullClassName = requestedClass + "Impl";
String packageName = requestedType.getPackage().getName();
OutputStream phpStream = context.tryCreateResource( logger, requestedClass + "Serializer.php" );
if( phpStream == null )
return fullClassName;
PrintWriter phpPw = new PrintWriter( phpStream );
phpPw.println( "class " + requestedClass + "Serializer" );
phpPw.println( "{" );
phpPw.println( " var $fields = array(" );
PrintWriter printWriter = context.tryCreate( logger, packageName, className );
if( printWriter == null )
{
logger.log( TreeLogger.INFO, requestedClass + " : CANNOT CREATE PRINT WRITER", null );
return fullClassName;
}
ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory( packageName, className );
composerFactory.addImport( "com.google.gwt.core.client.GWT" );
composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.DataProxy" );
composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.GenericJSO" );
composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.ResponseJSO" );
composerFactory.addImport( "fr.lteconsulting.hexa.client.common.HexaDate" );
composerFactory.addImport( "fr.lteconsulting.hexa.client.common.HexaTime" );
composerFactory.addImport( "fr.lteconsulting.hexa.client.common.HexaDateTime" );
composerFactory.addImplementedInterface( requestedClass );
SourceWriter sw = composerFactory.createSourceWriter( context, printWriter );
if( sw == null )
{
logger.log( TreeLogger.ERROR, requestedClass + " : CANNOT CREATE SOURCEWRITER", null );
return fullClassName; // null, already generated
}
sw.println( "private GenericJSO jso = null;" );
JMethod[] methods = requestedType.getMethods();
sw.println( "public void init( GenericJSO jso ) {" );
sw.indent();
sw.println( "this.jso = jso;" );
sw.outdent();
sw.println( "}" );
for( int m = 0; m < methods.length; m++ )
{
JMethod method = methods[m];
FieldName fnAnnotation = method.getAnnotation( FieldName.class );
CustomMethod cmAnnotation = method.getAnnotation( CustomMethod.class );
if( cmAnnotation != null )
{
sw.println( "public " + method.getReturnType().getSimpleSourceName() + " " + method.getName() + "() {" );
sw.indent();
sw.println( cmAnnotation.body() );
sw.outdent();
sw.println( "}" );
}
else if( fnAnnotation != null )
{
sw.println( "public " + method.getReturnType().getSimpleSourceName() + " " + method.getName() + "() {" );
sw.indent();
if( method.getReturnType().getSimpleSourceName().compareTo( "HexaDate" ) == 0 )
{
sw.println( "return new HexaDate( jso.getStringByIdx( " + m + " ) );" );
}
else if( method.getReturnType().getSimpleSourceName().compareTo( "HexaTime" ) == 0 )
{
sw.println( "return new HexaTime( jso.getStringByIdx( " + m + " ) );" );
}
else if( method.getReturnType().getSimpleSourceName().compareTo( "HexaDateTime" ) == 0 )
{
sw.println( "return new HexaDateTime( jso.getStringByIdx( " + m + " ) );" );
}
else
{
String jsoType = method.getReturnType().getSimpleSourceName();
if( method.getReturnType().getSimpleSourceName().compareTo( "int" ) == 0 )
jsoType = "Int";
else if( method.getReturnType().getSimpleSourceName().compareTo( "Integer" ) == 0 )
jsoType = "Integer";
else if( method.getReturnType().getSimpleSourceName().compareTo( "double" ) == 0 )
jsoType = "Double";
sw.println( "return jso.get" + jsoType + "ByIdx( " + m + " );" );
}
sw.outdent();
sw.println( "}" );
phpPw.print( " \"" + fnAnnotation.fieldName() + "\"" );
if( m < methods.length - 1 )
phpPw.println( "," );
}
}
sw.commit( logger );
phpPw.println( " );" );
phpPw.println( " public function GetFieldOrder()" );
phpPw.println( " {" );
phpPw.println( " return $this->fields;" );
phpPw.println( " }" );
phpPw.println();
phpPw.println( " public function TransformRow( $row )" );
phpPw.println( " {" );
phpPw.println( " $res = array();" );
phpPw.println( " foreach( $this->fields as $field )" );
phpPw.println( " $res[] = $row[$field];" );
phpPw.println( " return $res;" );
phpPw.println( " }" );
phpPw.println( "}" );
phpPw.flush();
context.commitResource( logger, phpStream );
return fullClassName;
}
}