package com.himamis.retex.generator;
import java.net.URL;
import com.google.gwt.core.ext.Generator;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.dev.util.Util;
import com.google.gwt.resources.ext.AbstractResourceGenerator;
import com.google.gwt.resources.ext.ResourceContext;
import com.google.gwt.resources.ext.ResourceGeneratorUtil;
import com.google.gwt.user.rebind.SourceWriter;
import com.google.gwt.user.rebind.StringSourceWriter;
import com.himamis.retex.renderer.web.resources.xml.XmlResource;
public class XmlResourceGenerator extends AbstractResourceGenerator
{
@Override
public String createAssignment(TreeLogger logger, ResourceContext context,
JMethod method) throws UnableToCompleteException {
// Extract the SVG name from the @Source annotation
URL[] resources = ResourceGeneratorUtil.findResources(logger, context,
method);
if (resources.length != 1) {
logger.log(TreeLogger.ERROR,
"Exactly one resource must be specified", null);
throw new UnableToCompleteException();
}
URL resource = resources[0];
String xml = Util.readURLAsString(resource);
int commentStart = 1;
do {
commentStart = xml.indexOf("<!--");
if (commentStart >= 0) {
int commentEnd = xml.indexOf("-->", commentStart + 1);
if (commentEnd > 0) {
xml = xml.substring(0, commentStart - 1)
+ xml.substring(commentEnd + 3);
}
}
} while (commentStart >= 0);
SourceWriter sw = new StringSourceWriter();
sw.println("new " + XmlResource.class.getName() + "() {");
sw.indent();
// Convenience when examining the generated code.
sw.println("// " + resource.toExternalForm());
sw.println("@Override");
sw.println("public String getName() {");
sw.indent();
sw.println("return \"" + method.getName() + "\";");
sw.outdent();
sw.println("}");
sw.println("@Override");
sw.println("public String getText() {");
sw.indent();
sw.println("return \"" + Generator.escape(xml) + "\";");
sw.outdent();
sw.println("}");
sw.outdent();
sw.println("}");
return sw.toString();
}
}