package fr.lteconsulting.hexa.rebind; import java.io.PrintWriter; import fr.lteconsulting.hexa.client.comm.CustomMethod; import fr.lteconsulting.hexa.client.comm.FieldName; 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.JParameterizedType; import com.google.gwt.core.ext.typeinfo.TypeOracle; import com.google.gwt.user.rebind.ClassSourceFileComposerFactory; import com.google.gwt.user.rebind.SourceWriter; public class DataProxyJSOGenerator 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(); 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.DataProxyJSO" ); composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.GenericJSO" ); composerFactory.addImport( "com.google.gwt.core.client.JsArray" ); composerFactory.addImplementedInterface( requestedClass ); composerFactory.setSuperclass( "GenericJSO" ); SourceWriter sw = composerFactory.createSourceWriter( context, printWriter ); if( sw == null ) { // logger.log( TreeLogger.WARN, requestedClass + // " : CANNOT CREATE SOURCEWRITER", null ); return fullClassName; // null, already generated } JMethod[] methods = requestedType.getMethods(); for( JMethod method : methods ) { 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 final " + method.getReturnType().getParameterizedQualifiedSourceName() + " " + method.getName() + "() {" ); sw.indent(); if( method.getReturnType().getSimpleSourceName().compareTo( "ArrayList" ) != 0 ) { String jsoType = method.getReturnType().getSimpleSourceName(); if( method.getReturnType().getSimpleSourceName().compareTo( "int" ) == 0 ) jsoType = "Int"; if( method.getReturnType().getSimpleSourceName().compareTo( "double" ) == 0 ) jsoType = "Double"; sw.println( "return get" + jsoType + "( \"" + fnAnnotation.fieldName() + "\" );" ); } else { JParameterizedType ptype = method.getReturnType().isParameterized(); JClassType[] typeArgs = ptype.getTypeArgs(); assert (typeArgs.length == 1); String type = typeArgs[0].getParameterizedQualifiedSourceName(); String field = fnAnnotation.fieldName(); sw.println( "ArrayList<" + type + "> res = new ArrayList<" + type + ">();" ); sw.println( "JsArray<GenericJSO> jsos = jso.getArray( \"" + field + "\" );" ); sw.println( "for( int i=0; i<jsos.length(); i++ ) {" ); sw.println( " " + type + " elem = GWT.create( " + type + ".class );" ); sw.println( " elem.init( jsos.get(i) );" ); sw.println( " res.add( elem );" ); sw.println( "}" ); sw.println( "return res;" ); } sw.outdent(); sw.println( "}" ); } } sw.commit( logger ); return fullClassName; } }