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();
}
}