htmlpage/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 24 Sep 2012 15:06:43 +0200
changeset 26 03e4aaa4ef3d
child 28 81ad7a739fed
permissions -rw-r--r--
Can extract 'id' elements from a page and generate appropriate HTML page
     1 /**
     2  * Java 4 Browser Bytecode Translator
     3  * Copyright (C) 2012-2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 2 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 package org.apidesign.bck2brwsr.htmlpage;
    19 
    20 import java.io.IOException;
    21 import java.io.InputStream;
    22 import java.io.OutputStreamWriter;
    23 import java.io.Writer;
    24 import java.util.Locale;
    25 import java.util.Set;
    26 import javax.annotation.processing.AbstractProcessor;
    27 import javax.annotation.processing.Processor;
    28 import javax.annotation.processing.RoundEnvironment;
    29 import javax.annotation.processing.SupportedAnnotationTypes;
    30 import javax.lang.model.element.Element;
    31 import javax.lang.model.element.PackageElement;
    32 import javax.lang.model.element.TypeElement;
    33 import javax.tools.Diagnostic;
    34 import javax.tools.FileObject;
    35 import javax.tools.StandardLocation;
    36 import org.apidesign.bck2brwsr.htmlpage.api.Page;
    37 import org.openide.util.lookup.ServiceProvider;
    38 
    39 /** Annotation processor to process an XHTML page and generate appropriate 
    40  * "id" file.
    41  *
    42  * @author Jaroslav Tulach <jtulach@netbeans.org>
    43  */
    44 @ServiceProvider(service=Processor.class)
    45 @SupportedAnnotationTypes("org.apidesign.bck2brwsr.htmlpage.api.Page")
    46 public final class PageProcessor extends AbstractProcessor {
    47     @Override
    48     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    49         for (Element e : roundEnv.getElementsAnnotatedWith(Page.class)) {
    50             Page p = e.getAnnotation(Page.class);
    51             PackageElement pe = (PackageElement)e;
    52             String pkg = pe.getQualifiedName().toString();
    53             
    54             ProcessPage pp;
    55             try {
    56                 InputStream is = openStream(pkg, p.xhtml());
    57                 pp = ProcessPage.readPage(is);
    58                 is.close();
    59             } catch (IOException iOException) {
    60                 processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Can't read " + p.xhtml(), e);
    61                 return false;
    62             }
    63             Writer w;
    64             try {
    65                 FileObject java = processingEnv.getFiler().createSourceFile(pkg + '.' + p.name(), e);
    66                 w = new OutputStreamWriter(java.openOutputStream());
    67                 w.append("package " + pkg + ";\n");
    68                 w.append("import org.apidesign.bck2brwsr.htmlpage.api.*;\n");
    69                 w.append("class ").append(p.name()).append(" {\n");
    70                 for (String id : pp.ids()) {
    71                     String tag = pp.tagNameForId(id);
    72                     String type = type(tag);
    73                     w.append("  ").append("public static final ").
    74                         append(type).append(' ').append(cnstnt(id)).append(" = new ").
    75                         append(type).append("(\"").append(id).append("\");\n");
    76                 }
    77                 w.append("}");
    78                 w.close();
    79             } catch (IOException ex) {
    80                 processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Can't create " + p.name() + ".java", e);
    81                 return false;
    82             }
    83         }
    84         return true;
    85     }
    86 
    87     private InputStream openStream(String pkg, String name) throws IOException {
    88         FileObject fo = processingEnv.getFiler().getResource(
    89             StandardLocation.SOURCE_PATH, pkg, name);
    90         try {
    91             return fo.openInputStream();
    92         } catch (IOException ex) {
    93             return processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, pkg, name).openInputStream();
    94         }
    95     }
    96 
    97     private static String type(String tag) {
    98         if (tag.equals("title")) {
    99             return "Title";
   100         }
   101         if (tag.equals("button")) {
   102             return "Button";
   103         }
   104         if (tag.equals("input")) {
   105             return "Input";
   106         }
   107         return "Element";
   108     }
   109 
   110     private static String cnstnt(String id) {
   111         return id.toUpperCase(Locale.ENGLISH).replace('.', '_');
   112     }
   113 }