# HG changeset patch # User Jaroslav Tulach # Date 1358765727 -3600 # Node ID f9e80d48e9b47f7c4e72badb86be6b0c0622b680 # Parent af027874f93e2f27ae90f76fe783d0e6c39d2823 @ComputedProperty methods can't access the model diff -r af027874f93e -r f9e80d48e9b4 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Jan 21 10:06:42 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Jan 21 11:55:27 2013 +0100 @@ -95,6 +95,7 @@ w.append("package " + pkg + ";\n"); w.append("import org.apidesign.bck2brwsr.htmlpage.api.*;\n"); w.append("class ").append(className).append(" {\n"); + w.append(" private static boolean locked;\n"); w.append(" private ").append(className).append("() {}\n"); for (String id : pp.ids()) { String tag = pp.tagNameForId(id); @@ -272,9 +273,11 @@ w.write("private static " + tn + " prop_" + p.name() + ";\n"); w.write("public static " + tn + " " + gs[0] + "() {\n"); + w.write(" if (locked) throw new IllegalStateException();\n"); w.write(" return prop_" + p.name() + ";\n"); w.write("}\n"); w.write("public static void " + gs[1] + "(" + tn + " v) {\n"); + w.write(" if (locked) throw new IllegalStateException();\n"); w.write(" prop_" + p.name() + " = v;\n"); w.write(" if (ko != null) {\n"); w.write(" ko.valueHasMutated(\"" + p.name() + "\");\n"); @@ -310,14 +313,14 @@ String[] gs = toGetSet(sn, tn); w.write("public static " + tn + " " + gs[0] + "() {\n"); - w.write(" return " + e.getEnclosingElement().getSimpleName() + '.' + e.getSimpleName() + "("); - String sep = ""; + w.write(" if (locked) throw new IllegalStateException();\n"); + int arg = 0; for (VariableElement pe : ee.getParameters()) { final String dn = pe.getSimpleName().toString(); - String[] call = toGetSet(dn, pe.asType().toString()); - w.write(sep); - w.write(call[0] + "()"); - sep = ", "; + final String dt = pe.asType().toString(); + String[] call = toGetSet(dn, dt); + w.write(" " + dt + " arg" + (++arg) + " = "); + w.write(call[0] + "();\n"); Collection depends = deps.get(dn); if (depends == null) { @@ -326,7 +329,19 @@ } depends.add(sn); } + w.write(" try {\n"); + w.write(" locked = true;\n"); + w.write(" return " + e.getEnclosingElement().getSimpleName() + '.' + e.getSimpleName() + "("); + String sep = ""; + for (int i = 1; i <= arg; i++) { + w.write(sep); + w.write("arg" + i); + sep = ", "; + } w.write(");\n"); + w.write(" } finally {\n"); + w.write(" locked = false;\n"); + w.write(" }\n"); w.write("}\n"); props.add(e.getSimpleName().toString()); diff -r af027874f93e -r f9e80d48e9b4 javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Mon Jan 21 10:06:42 2013 +0100 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Mon Jan 21 11:55:27 2013 +0100 @@ -65,11 +65,40 @@ assertTrue(my.mutated.contains("unrelated"), "Its name is unrelated"); } + @Test public void computedPropertyCannotWriteToModel() { + try { + String res = Model.getNotAllowedWrite(); + fail("We should not be allowed to write to the model: " + res); + } catch (IllegalStateException ex) { + // OK, we can't read + } + } + + @Test public void computedPropertyCannotReadToModel() { + try { + String res = Model.getNotAllowedRead(); + fail("We should not be allowed to read from the model: " + res); + } catch (IllegalStateException ex) { + // OK, we can't read + } + } + @ComputedProperty static int powerValue(int value) { return value * value; } + @ComputedProperty + static String notAllowedRead() { + return "Not allowed callback: " + Model.getUnrelated(); + } + + @ComputedProperty + static String notAllowedWrite() { + Model.setUnrelated(11); + return "Not allowed callback!"; + } + static class MockKnockout extends Knockout { List mutated = new ArrayList();