Annotation to generate getters and setters model
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 20 Jan 2013 13:05:02 +0100
branchmodel
changeset 490e089ef6785c0
parent 489 4b59fa013d49
child 491 14268cd404a4
Annotation to generate getters and setters
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Page.java
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Property.java
javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java
     1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Sun Jan 20 12:29:50 2013 +0100
     1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Sun Jan 20 13:05:02 2013 +0100
     1.3 @@ -34,17 +34,18 @@
     1.4  import javax.annotation.processing.SupportedAnnotationTypes;
     1.5  import javax.lang.model.element.AnnotationMirror;
     1.6  import javax.lang.model.element.Element;
     1.7 -import javax.lang.model.element.ElementKind;
     1.8  import javax.lang.model.element.ExecutableElement;
     1.9  import javax.lang.model.element.Modifier;
    1.10  import javax.lang.model.element.PackageElement;
    1.11  import javax.lang.model.element.TypeElement;
    1.12 +import javax.lang.model.type.MirroredTypeException;
    1.13  import javax.lang.model.type.TypeMirror;
    1.14  import javax.tools.Diagnostic;
    1.15  import javax.tools.FileObject;
    1.16  import javax.tools.StandardLocation;
    1.17  import org.apidesign.bck2brwsr.htmlpage.api.On;
    1.18  import org.apidesign.bck2brwsr.htmlpage.api.Page;
    1.19 +import org.apidesign.bck2brwsr.htmlpage.api.Property;
    1.20  import org.openide.util.lookup.ServiceProvider;
    1.21  
    1.22  /** Annotation processor to process an XHTML page and generate appropriate 
    1.23 @@ -99,6 +100,7 @@
    1.24                          return false;
    1.25                      }
    1.26                      w.append("  }\n");
    1.27 +                    generateProperties(w, p.properties());
    1.28                      w.append("}\n");
    1.29                  } finally {
    1.30                      w.close();
    1.31 @@ -229,4 +231,39 @@
    1.32          }
    1.33          return e.getEnclosingElement();
    1.34      }
    1.35 +
    1.36 +    private static void generateProperties(Writer w, Property[] properties) throws IOException {
    1.37 +        for (Property p : properties) {
    1.38 +            String[] gs = toGetSet(p);
    1.39 +
    1.40 +            final String tn = typeName(p);
    1.41 +            w.write("private static " + tn + " prop_" + p.name() + ";\n");
    1.42 +            w.write("public static " + tn + " " + gs[0] + "() {\n");
    1.43 +            w.write("  return prop_" + p.name() + ";\n");
    1.44 +            w.write("}\n");
    1.45 +            w.write("public static void " + gs[1] + "(" + tn + " v) {\n");
    1.46 +            w.write("  prop_" + p.name() + " = v;\n");
    1.47 +            w.write("}\n");
    1.48 +        }
    1.49 +    }
    1.50 +
    1.51 +    private static String[] toGetSet(Property p) {
    1.52 +        String n = Character.toUpperCase(p.name().charAt(0)) + p.name().substring(1);
    1.53 +//        if (p.type() == boolean.class) {
    1.54 +//            return new String[] { "is" + n, "set" + n };
    1.55 +//        } else {
    1.56 +        return new String[]{"get" + n, "set" + n};
    1.57 +//        }
    1.58 +    }
    1.59 +
    1.60 +    private static String typeName(Property p) {
    1.61 +        try {
    1.62 +            return p.type().getName();
    1.63 +        } catch (MirroredTypeException ex) {
    1.64 +            if (ex.getTypeMirror().getKind().isPrimitive()) {
    1.65 +                return ex.getTypeMirror().toString();
    1.66 +            }
    1.67 +            throw ex;
    1.68 +        }
    1.69 +    }
    1.70  }
     2.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Page.java	Sun Jan 20 12:29:50 2013 +0100
     2.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Page.java	Sun Jan 20 13:05:02 2013 +0100
     2.3 @@ -36,4 +36,7 @@
     2.4       * found elements with IDs.
     2.5       */
     2.6      String className() default "";
     2.7 +    /** List of properties generated into the page.
     2.8 +     */
     2.9 +    Property[] properties() default {};
    2.10  }
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Property.java	Sun Jan 20 13:05:02 2013 +0100
     3.3 @@ -0,0 +1,34 @@
     3.4 +/**
     3.5 + * Back 2 Browser Bytecode Translator
     3.6 + * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     3.7 + *
     3.8 + * This program is free software: you can redistribute it and/or modify
     3.9 + * it under the terms of the GNU General Public License as published by
    3.10 + * the Free Software Foundation, version 2 of the License.
    3.11 + *
    3.12 + * This program is distributed in the hope that it will be useful,
    3.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    3.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    3.15 + * GNU General Public License for more details.
    3.16 + *
    3.17 + * You should have received a copy of the GNU General Public License
    3.18 + * along with this program. Look for COPYING file in the top folder.
    3.19 + * If not, see http://opensource.org/licenses/GPL-2.0.
    3.20 + */
    3.21 +package org.apidesign.bck2brwsr.htmlpage.api;
    3.22 +
    3.23 +import java.lang.annotation.Retention;
    3.24 +import java.lang.annotation.RetentionPolicy;
    3.25 +import java.lang.annotation.Target;
    3.26 +
    3.27 +/** Represents a property in a generated model of an HTML
    3.28 + * {@link Page}.
    3.29 + *
    3.30 + * @author Jaroslav Tulach <jtulach@netbeans.org>
    3.31 + */
    3.32 +@Retention(RetentionPolicy.SOURCE)
    3.33 +@Target({})
    3.34 +public @interface Property {
    3.35 +    String name();
    3.36 +    Class<?> type();
    3.37 +}
     4.1 --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java	Sun Jan 20 12:29:50 2013 +0100
     4.2 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java	Sun Jan 20 13:05:02 2013 +0100
     4.3 @@ -18,6 +18,7 @@
     4.4  package org.apidesign.bck2brwsr.htmlpage;
     4.5  
     4.6  import org.apidesign.bck2brwsr.htmlpage.api.Page;
     4.7 +import org.apidesign.bck2brwsr.htmlpage.api.Property;
     4.8  import static org.testng.Assert.*;
     4.9  import org.testng.annotations.Test;
    4.10  
    4.11 @@ -25,10 +26,14 @@
    4.12   *
    4.13   * @author Jaroslav Tulach <jtulach@netbeans.org>
    4.14   */
    4.15 -@Page(xhtml = "Empty.html", className = "Model")
    4.16 +@Page(xhtml = "Empty.html", className = "Model", properties = {
    4.17 +    @Property(name = "value", type = int.class)
    4.18 +})
    4.19  public class ModelTest {
    4.20 -    @Test public void classGenerated() {
    4.21 +    @Test public void classGeneratedWithSetterGetter() {
    4.22          Class<?> c = Model.class;
    4.23          assertNotNull(c, "Class for empty page generated");
    4.24 +        Model.setValue(10);
    4.25 +        assertEquals(10, Model.getValue(), "Value changed");
    4.26      }
    4.27  }