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 }