diff -r 000000000000 -r 03e4aaa4ef3d htmlpage/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/htmlpage/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Sep 24 15:06:43 2012 +0200 @@ -0,0 +1,113 @@ +/** + * Java 4 Browser Bytecode Translator + * Copyright (C) 2012-2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +package org.apidesign.bck2brwsr.htmlpage; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.Locale; +import java.util.Set; +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.Processor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.element.Element; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.tools.Diagnostic; +import javax.tools.FileObject; +import javax.tools.StandardLocation; +import org.apidesign.bck2brwsr.htmlpage.api.Page; +import org.openide.util.lookup.ServiceProvider; + +/** Annotation processor to process an XHTML page and generate appropriate + * "id" file. + * + * @author Jaroslav Tulach + */ +@ServiceProvider(service=Processor.class) +@SupportedAnnotationTypes("org.apidesign.bck2brwsr.htmlpage.api.Page") +public final class PageProcessor extends AbstractProcessor { + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + for (Element e : roundEnv.getElementsAnnotatedWith(Page.class)) { + Page p = e.getAnnotation(Page.class); + PackageElement pe = (PackageElement)e; + String pkg = pe.getQualifiedName().toString(); + + ProcessPage pp; + try { + InputStream is = openStream(pkg, p.xhtml()); + pp = ProcessPage.readPage(is); + is.close(); + } catch (IOException iOException) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Can't read " + p.xhtml(), e); + return false; + } + Writer w; + try { + FileObject java = processingEnv.getFiler().createSourceFile(pkg + '.' + p.name(), e); + w = new OutputStreamWriter(java.openOutputStream()); + w.append("package " + pkg + ";\n"); + w.append("import org.apidesign.bck2brwsr.htmlpage.api.*;\n"); + w.append("class ").append(p.name()).append(" {\n"); + for (String id : pp.ids()) { + String tag = pp.tagNameForId(id); + String type = type(tag); + w.append(" ").append("public static final "). + append(type).append(' ').append(cnstnt(id)).append(" = new "). + append(type).append("(\"").append(id).append("\");\n"); + } + w.append("}"); + w.close(); + } catch (IOException ex) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Can't create " + p.name() + ".java", e); + return false; + } + } + return true; + } + + private InputStream openStream(String pkg, String name) throws IOException { + FileObject fo = processingEnv.getFiler().getResource( + StandardLocation.SOURCE_PATH, pkg, name); + try { + return fo.openInputStream(); + } catch (IOException ex) { + return processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, pkg, name).openInputStream(); + } + } + + private static String type(String tag) { + if (tag.equals("title")) { + return "Title"; + } + if (tag.equals("button")) { + return "Button"; + } + if (tag.equals("input")) { + return "Input"; + } + return "Element"; + } + + private static String cnstnt(String id) { + return id.toUpperCase(Locale.ENGLISH).replace('.', '_'); + } +}