# HG changeset patch # User Jaroslav Tulach # Date 1358688550 -3600 # Node ID 14268cd404a4db1faaea97780fab09bb17ff5c1d # Parent e089ef6785c0d5d8586d0ca5271cb4b6a07a3bd8 The model can contain derived properties diff -r e089ef6785c0 -r 14268cd404a4 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 13:05:02 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Sun Jan 20 14:29:10 2013 +0100 @@ -22,6 +22,7 @@ import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Locale; @@ -34,15 +35,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.element.VariableElement; 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.ComputedProperty; import org.apidesign.bck2brwsr.htmlpage.api.On; import org.apidesign.bck2brwsr.htmlpage.api.Page; import org.apidesign.bck2brwsr.htmlpage.api.Property; @@ -101,6 +105,7 @@ } w.append(" }\n"); generateProperties(w, p.properties()); + generateComputedProperties(w, e.getEnclosedElements()); w.append("}\n"); } finally { w.close(); @@ -234,7 +239,7 @@ private static void generateProperties(Writer w, Property[] properties) throws IOException { for (Property p : properties) { - String[] gs = toGetSet(p); + String[] gs = toGetSet(p.name(), null); final String tn = typeName(p); w.write("private static " + tn + " prop_" + p.name() + ";\n"); @@ -247,8 +252,34 @@ } } - private static String[] toGetSet(Property p) { - String n = Character.toUpperCase(p.name().charAt(0)) + p.name().substring(1); + private void generateComputedProperties(Writer w, Collection arr) throws IOException { + for (Element e : arr) { + if (e.getKind() != ElementKind.METHOD) { + continue; + } + if (e.getAnnotation(ComputedProperty.class) == null) { + continue; + } + ExecutableElement ee = (ExecutableElement)e; + String[] gs = toGetSet(ee.getSimpleName().toString(), null); + + final String tn = ee.getReturnType().toString(); + w.write("public static " + tn + " " + gs[0] + "() {\n"); + w.write(" return " + e.getEnclosingElement().getSimpleName() + '.' + e.getSimpleName() + "("); + String sep = ""; + for (VariableElement pe : ee.getParameters()) { + String[] call = toGetSet(pe.getSimpleName().toString(), null); + w.write(sep); + w.write(call[0] + "()"); + sep = ", "; + } + w.write(");\n"); + w.write("}\n"); + } + } + + private static String[] toGetSet(String name, Object type) { + String n = Character.toUpperCase(name.charAt(0)) + name.substring(1); // if (p.type() == boolean.class) { // return new String[] { "is" + n, "set" + n }; // } else { diff -r e089ef6785c0 -r 14268cd404a4 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/ComputedProperty.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/ComputedProperty.java Sun Jan 20 14:29:10 2013 +0100 @@ -0,0 +1,38 @@ +/** + * 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.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** Can be used in classes annotated with {@link Page} annotation to + * define a derived property. Value of derived property is based on values + * of {@link Property} as enumerated by {@link Page#properties()}. + *

+ * The name of the derived property is the name of the method. The arguments + * of the method define the property names (from {@link Page#properties()} list) + * the value of property depends on. + * + * @author Jaroslav Tulach + */ +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.METHOD) +public @interface ComputedProperty { +} diff -r e089ef6785c0 -r 14268cd404a4 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 13:05:02 2013 +0100 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Sun Jan 20 14:29:10 2013 +0100 @@ -17,6 +17,7 @@ */ package org.apidesign.bck2brwsr.htmlpage; +import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty; import org.apidesign.bck2brwsr.htmlpage.api.Page; import org.apidesign.bck2brwsr.htmlpage.api.Property; import static org.testng.Assert.*; @@ -36,4 +37,14 @@ Model.setValue(10); assertEquals(10, Model.getValue(), "Value changed"); } + + @Test public void computedMethod() { + Model.setValue(4); + assertEquals(16, Model.getPowerValue()); + } + + @ComputedProperty + static int powerValue(int value) { + return value * value; + } }