Package org.gwtoolbox.widget.rebind.form

Source Code of org.gwtoolbox.widget.rebind.form.HtmlFieldsRendererGenerator

package org.gwtoolbox.widget.rebind.form;

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.TypeOracle;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
import com.google.gwt.user.rebind.SourceWriter;

import java.io.*;

/**
* @author Uri Boness
*/
public class HtmlFieldsRendererGenerator extends Generator {

    @Override
    public String generate(TreeLogger logger, GeneratorContext context, String typeName) throws UnableToCompleteException {
        try {
            return doGenerate(logger, context, typeName);
        } catch (Exception e) {
            logger.log(TreeLogger.ERROR, null, e);
            throw new UnableToCompleteException();
        } finally {
            // cleaning up
        }
    }

    public String doGenerate(TreeLogger logger, GeneratorContext context, String typeName) throws Exception {

        TypeOracle typeOracle = context.getTypeOracle();
        JClassType type = typeOracle.getType(typeName);
        String packageName = type.getPackage().getName();
        String simpleClassName = type.getSimpleSourceName();

        String beanClassName = simpleClassName + "Impl";
        String qualifiedBeanClassName = packageName + "." + beanClassName;
        SourceWriter sourceWriter = getSourceWriter(logger, context, packageName, beanClassName, type);
        if (sourceWriter == null) {
            return qualifiedBeanClassName;
        }
        write(logger, sourceWriter, typeOracle, type, context);
        sourceWriter.commit(logger);
        return qualifiedBeanClassName;

    }

    protected SourceWriter getSourceWriter(
            TreeLogger logger,
            GeneratorContext context,
            String packageName,
            String beanClassName,
            JClassType superType) {

        PrintWriter printWriter = context.tryCreate(logger, packageName, beanClassName);

        if (printWriter == null) {
            return null;
        }

        ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(packageName, beanClassName);

        addImports(composerFactory);

        if (superType.isInterface() != null) {
            composerFactory.addImplementedInterface(superType.getQualifiedSourceName());
        } else {
            composerFactory.setSuperclass(superType.getQualifiedSourceName());
        }

        return composerFactory.createSourceWriter(context, printWriter);
    }

    protected void addImports(ClassSourceFileComposerFactory factory) {

    }

    protected void write(TreeLogger logger, SourceWriter writer,TypeOracle typeOracle, JClassType type, GeneratorContext context)
            throws Exception {

        logger.log(TreeLogger.INFO, "file name: " + type.getName() + ".html");

        Class clazz = loadClass(logger, type.getQualifiedBinaryName());
        InputStream htmlStream = clazz.getResourceAsStream(type.getName() + ".html");
        logger.log(TreeLogger.INFO, "stream: " + htmlStream);
       
        String html = getStreamAsString(htmlStream);
        if (logger.isLoggable(TreeLogger.Type.DEBUG) || logger.isLoggable(TreeLogger.Type.TRACE) || logger.isLoggable(TreeLogger.Type.SPAM)) {
            html = html.replace("\n", "\" + \n + \"");
        } else {
            html = html.replace("\n", "");
        }
        html = html.replace("\"", "\\\"");

        writer.indent();
        writer.println("protected String getHtmlTemplate() {");
        writer.println("    return \"" + html + "\";");
        writer.println("}");
        writer.outdent();
    }


    private static Class loadClass(TreeLogger logger, String className) {
        try {
            logger.log(TreeLogger.INFO, "className: " + className);
            return Class.forName(className);
        } catch (ClassNotFoundException cnfe) {
            logger.log(TreeLogger.Type.ERROR, "Could not find class '" + className + "'");
            return null;
        }
    }

    private static String getStreamAsString(InputStream input) throws IOException {
        StringWriter writer = new StringWriter();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(input));
            String line = null;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
            }
        } finally {
            if (reader != null) {
                reader.close();
            }
        }
        return writer.toString();
    }

}
TOP

Related Classes of org.gwtoolbox.widget.rebind.form.HtmlFieldsRendererGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.