# HG changeset patch # User Jaroslav Tulach # Date 1358683502 -3600 # Node ID e089ef6785c0d5d8586d0ca5271cb4b6a07a3bd8 # Parent 4b59fa013d492a2e8e31b757e702b3e572597ee0 Annotation to generate getters and setters diff -r 4b59fa013d49 -r e089ef6785c0 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Sun Jan 20 12:29:50 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Sun Jan 20 13:05:02 2013 +0100 @@ -34,17 +34,18 @@ import javax.annotation.processing.SupportedAnnotationTypes; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; +import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.TypeMirror; import javax.tools.Diagnostic; import javax.tools.FileObject; import javax.tools.StandardLocation; import org.apidesign.bck2brwsr.htmlpage.api.On; import org.apidesign.bck2brwsr.htmlpage.api.Page; +import org.apidesign.bck2brwsr.htmlpage.api.Property; import org.openide.util.lookup.ServiceProvider; /** Annotation processor to process an XHTML page and generate appropriate @@ -99,6 +100,7 @@ return false; } w.append(" }\n"); + generateProperties(w, p.properties()); w.append("}\n"); } finally { w.close(); @@ -229,4 +231,39 @@ } return e.getEnclosingElement(); } + + private static void generateProperties(Writer w, Property[] properties) throws IOException { + for (Property p : properties) { + String[] gs = toGetSet(p); + + final String tn = typeName(p); + w.write("private static " + tn + " prop_" + p.name() + ";\n"); + w.write("public static " + tn + " " + gs[0] + "() {\n"); + w.write(" return prop_" + p.name() + ";\n"); + w.write("}\n"); + w.write("public static void " + gs[1] + "(" + tn + " v) {\n"); + w.write(" prop_" + p.name() + " = v;\n"); + w.write("}\n"); + } + } + + private static String[] toGetSet(Property p) { + String n = Character.toUpperCase(p.name().charAt(0)) + p.name().substring(1); +// if (p.type() == boolean.class) { +// return new String[] { "is" + n, "set" + n }; +// } else { + return new String[]{"get" + n, "set" + n}; +// } + } + + private static String typeName(Property p) { + try { + return p.type().getName(); + } catch (MirroredTypeException ex) { + if (ex.getTypeMirror().getKind().isPrimitive()) { + return ex.getTypeMirror().toString(); + } + throw ex; + } + } } diff -r 4b59fa013d49 -r e089ef6785c0 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Page.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Page.java Sun Jan 20 12:29:50 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Page.java Sun Jan 20 13:05:02 2013 +0100 @@ -36,4 +36,7 @@ * found elements with IDs. */ String className() default ""; + /** List of properties generated into the page. + */ + Property[] properties() default {}; } diff -r 4b59fa013d49 -r e089ef6785c0 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Property.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Property.java Sun Jan 20 13:05:02 2013 +0100 @@ -0,0 +1,34 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 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.api; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** Represents a property in a generated model of an HTML + * {@link Page}. + * + * @author Jaroslav Tulach + */ +@Retention(RetentionPolicy.SOURCE) +@Target({}) +public @interface Property { + String name(); + Class type(); +} diff -r 4b59fa013d49 -r e089ef6785c0 javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Sun Jan 20 12:29:50 2013 +0100 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Sun Jan 20 13:05:02 2013 +0100 @@ -18,6 +18,7 @@ package org.apidesign.bck2brwsr.htmlpage; import org.apidesign.bck2brwsr.htmlpage.api.Page; +import org.apidesign.bck2brwsr.htmlpage.api.Property; import static org.testng.Assert.*; import org.testng.annotations.Test; @@ -25,10 +26,14 @@ * * @author Jaroslav Tulach */ -@Page(xhtml = "Empty.html", className = "Model") +@Page(xhtml = "Empty.html", className = "Model", properties = { + @Property(name = "value", type = int.class) +}) public class ModelTest { - @Test public void classGenerated() { + @Test public void classGeneratedWithSetterGetter() { Class c = Model.class; assertNotNull(c, "Class for empty page generated"); + Model.setValue(10); + assertEquals(10, Model.getValue(), "Value changed"); } }