All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.lteconsulting.hexa.rebind.StackGenerator Maven / Gradle / Ivy

The newest version!
package fr.lteconsulting.hexa.rebind;

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.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 StackGenerator 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.DEBUG, requestedClass + " : CANNOT CREATE PRINT WRITER", null );
			return fullClassName;
		}

		JClassType[] imple = requestedType.getImplementedInterfaces();
		JClassType implemented = imple[0];
		JParameterizedType parametrized = implemented.isParameterized();
		JClassType[] typeArgs = parametrized.getTypeArgs();
		logger.log( TreeLogger.INFO, imple.length + " implemented interfaces / " + typeArgs.length + " type args:" + typeArgs[0].getName() );

		//
		String typeFactored = typeArgs[0].getSimpleSourceName();
		String factoredTypeQualified = typeArgs[0].getQualifiedSourceName();

		ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory( packageName, className );
		composerFactory.addImport( "com.google.gwt.core.client.GWT" );
		composerFactory.addImport( "fr.lteconsulting.hexa.client.comm.Stack" );
		composerFactory.addImport( factoredTypeQualified );
		composerFactory.addImplementedInterface( requestedClass );

		SourceWriter sw = composerFactory.createSourceWriter( context, printWriter );
		if( sw == null )
			return fullClassName; // null, already generated

		// extended version : stack instances share the same objects.
		// BE CAREFUL : This is ok in GWT since browsers are single threaded
		// but it wouldn't work as-it-is in a multi-threaded env

		sw.println( "private static " + typeFactored + "[] objs = new " + typeFactored + "[Stack.NB_OBJS];" );
		sw.println( "private static int next = 0;" );
		sw.println( "" );

		sw.println( "public " + className + "() {" );
		sw.println( "if( objs[0] != null )" );
		sw.indent();
		sw.println( "return;" );
		sw.outdent();
		sw.println( "for( int i=0;i




© 2015 - 2025 Weber Informatics LLC | Privacy Policy