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