1.1 --- a/json/src/main/java/net/java/html/json/Context.java Mon Apr 22 22:38:59 2013 +0200
1.2 +++ b/json/src/main/java/net/java/html/json/Context.java Mon Apr 22 23:18:55 2013 +0200
1.3 @@ -85,5 +85,12 @@
1.4 public Object wrapArray(Object[] arr) {
1.5 return arr;
1.6 }
1.7 +
1.8 + @Override
1.9 + public void extract(Object obj, String[] props, Object[] values) {
1.10 + for (int i = 0; i < values.length; i++) {
1.11 + values[i] = null;
1.12 + }
1.13 + }
1.14 }
1.15 }
2.1 --- a/json/src/main/java/org/apidesign/html/json/impl/JSON.java Mon Apr 22 22:38:59 2013 +0200
2.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/JSON.java Mon Apr 22 23:18:55 2013 +0200
2.3 @@ -20,6 +20,9 @@
2.4 */
2.5 package org.apidesign.html.json.impl;
2.6
2.7 +import net.java.html.json.Context;
2.8 +import org.apidesign.html.json.spi.Technology;
2.9 +
2.10 /**
2.11 *
2.12 * @author Jaroslav Tulach <jtulach@netbeans.org>
2.13 @@ -29,15 +32,17 @@
2.14 private JSON() {
2.15 }
2.16
2.17 - public static void extract(Object value, String[] props, Object[] values) {
2.18 + public static void extract(Context c, Object value, String[] props, Object[] values) {
2.19 + Technology<?> t = ContextAccessor.findTechnology(c);
2.20 + t.extract(value, props, values);
2.21 }
2.22
2.23 - private static Object getProperty(Object obj, String prop) {
2.24 + private static Object getProperty(Context c, Object obj, String prop) {
2.25 if (prop == null) return obj;
2.26
2.27 String[] arr = { prop };
2.28 Object[] val = { null };
2.29 - extract(obj, arr, val);
2.30 + extract(c, obj, arr, val);
2.31 return val[0];
2.32 }
2.33
2.34 @@ -60,10 +65,18 @@
2.35 return value.toString();
2.36 }
2.37
2.38 - public static String toString(Object obj, String prop) {
2.39 - obj = getProperty(obj, prop);
2.40 + public static String toString(Context c, Object obj, String prop) {
2.41 + obj = getProperty(c, obj, prop);
2.42 return obj instanceof String ? (String)obj : null;
2.43 }
2.44 + public static Number toNumber(Context c, Object obj, String prop) {
2.45 + obj = getProperty(c, obj, prop);
2.46 + if (!(obj instanceof Number)) {
2.47 + obj = Double.NaN;
2.48 + }
2.49 + return (Number)obj;
2.50 + }
2.51 +
2.52
2.53 public static String createJSONP(Object[] res, Runnable callback) {
2.54 return null;
3.1 --- a/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java Mon Apr 22 22:38:59 2013 +0200
3.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java Mon Apr 22 23:18:55 2013 +0200
3.3 @@ -254,7 +254,7 @@
3.4 values++;
3.5 }
3.6 w.append(" Object[] ret = new Object[" + values + "];\n");
3.7 - w.append(" org.apidesign.html.json.impl.JSON.extract(json, new String[] {\n");
3.8 + w.append(" org.apidesign.html.json.impl.JSON.extract(context, json, new String[] {\n");
3.9 for (int i = 0; i < propsGetSet.size(); i += 5) {
3.10 Prprt p = findPrprt(props, propsGetSet.get(i));
3.11 if (p == null) {
3.12 @@ -834,18 +834,21 @@
3.13 }
3.14 first = false;
3.15 String toCall = null;
3.16 + String toFinish = null;
3.17 if (ve.asType() == stringType) {
3.18 if (ve.getSimpleName().contentEquals("id")) {
3.19 params.append('"').append(id).append('"');
3.20 continue;
3.21 }
3.22 - toCall = "org.apidesign.html.json.impl.JSON.toString(";
3.23 + toCall = "org.apidesign.html.json.impl.JSON.toString(context, ";
3.24 }
3.25 if (ve.asType().getKind() == TypeKind.DOUBLE) {
3.26 - toCall = "org.apidesign.html.json.impl.JSON.toDouble(";
3.27 + toCall = "org.apidesign.html.json.impl.JSON.toNumber(context, ";
3.28 + toFinish = ".doubleValue()";
3.29 }
3.30 if (ve.asType().getKind() == TypeKind.INT) {
3.31 - toCall = "org.apidesign.html.json.impl.JSON.toInt(";
3.32 + toCall = "org.apidesign.html.json.impl.JSON.toNumber(context, ";
3.33 + toFinish = ".intValue()";
3.34 }
3.35 if (dataName != null && ve.getSimpleName().contentEquals(dataName) && isModel(ve.asType())) {
3.36 toCall = "org.apidesign.html.json.impl.JSON.toModel(" + ve.asType() + ".class, ";
3.37 @@ -871,6 +874,9 @@
3.38 params.append("\"");
3.39 }
3.40 params.append(")");
3.41 + if (toFinish != null) {
3.42 + params.append(toFinish);
3.43 + }
3.44 continue;
3.45 }
3.46 String rn = fqn(ve.asType(), ee);
4.1 --- a/json/src/main/java/org/apidesign/html/json/spi/Technology.java Mon Apr 22 22:38:59 2013 +0200
4.2 +++ b/json/src/main/java/org/apidesign/html/json/spi/Technology.java Mon Apr 22 23:18:55 2013 +0200
4.3 @@ -69,4 +69,15 @@
4.4 * @return wrapped array
4.5 */
4.6 public Object wrapArray(Object[] arr);
4.7 +
4.8 + /** Called to inspect properties of an object (usually a JSON or JavaScript
4.9 + * wrapper.
4.10 + *
4.11 + * @param obj the object to inspect
4.12 + * @param props the names of properties to check on the object <code>obj</code>
4.13 + * @param values array of the same length as <code>props</code> should be filled
4.14 + * by values of properties on the <code>obj</code>. If a property is not
4.15 + * defined, a <code>null</code> value should be stored in the array
4.16 + */
4.17 + public void extract(Object obj, String[] props, Object[] values);
4.18 }
5.1 --- a/json/src/test/java/net/java/html/json/MapModelTest.java Mon Apr 22 22:38:59 2013 +0200
5.2 +++ b/json/src/test/java/net/java/html/json/MapModelTest.java Mon Apr 22 23:18:55 2013 +0200
5.3 @@ -111,7 +111,7 @@
5.4 assertEquals(p.getSex(), Sex.FEMALE, "Changed");
5.5 }
5.6
5.7 - private static final class One {
5.8 + static final class One {
5.9 int changes;
5.10 final PropertyBinding pb;
5.11 final FunctionBinding fb;
5.12 @@ -134,7 +134,7 @@
5.13 }
5.14 }
5.15
5.16 - private static final class MapTechnology implements Technology<Map<String,One>> {
5.17 + static final class MapTechnology implements Technology<Map<String,One>> {
5.18
5.19 @Override
5.20 public Map<String, One> wrapModel(Object model) {
5.21 @@ -176,5 +176,20 @@
5.22 public Object wrapArray(Object[] arr) {
5.23 return arr;
5.24 }
5.25 +
5.26 + @Override
5.27 + public void extract(Object obj, String[] props, Object[] values) {
5.28 + Map<?,?> map = obj instanceof Map ? (Map<?,?>)obj : null;
5.29 + for (int i = 0; i < Math.min(props.length, values.length); i++) {
5.30 + if (map == null) {
5.31 + values[i] = null;
5.32 + } else {
5.33 + values[i] = map.get(props[i]);
5.34 + if (values[i] instanceof One) {
5.35 + values[i] = ((One)values[i]).pb.getValue();
5.36 + }
5.37 + }
5.38 + }
5.39 + }
5.40 }
5.41 }
6.1 --- a/json/src/test/java/net/java/html/json/ModelTest.java Mon Apr 22 22:38:59 2013 +0200
6.2 +++ b/json/src/test/java/net/java/html/json/ModelTest.java Mon Apr 22 23:18:55 2013 +0200
6.3 @@ -261,5 +261,9 @@
6.4 public Object wrapArray(Object[] arr) {
6.5 return arr;
6.6 }
6.7 +
6.8 + @Override
6.9 + public void extract(Object obj, String[] props, Object[] values) {
6.10 + }
6.11 }
6.12 }
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
7.2 +++ b/json/src/test/java/net/java/html/json/TypesTest.java Mon Apr 22 23:18:55 2013 +0200
7.3 @@ -0,0 +1,100 @@
7.4 +/**
7.5 + * HTML via Java(tm) Language Bindings
7.6 + * Copyright (C) 2013 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
7.7 + *
7.8 + * This program is free software: you can redistribute it and/or modify
7.9 + * it under the terms of the GNU General Public License as published by
7.10 + * the Free Software Foundation, version 2 of the License.
7.11 + *
7.12 + * This program is distributed in the hope that it will be useful,
7.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
7.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7.15 + * GNU General Public License for more details. apidesign.org
7.16 + * designates this particular file as subject to the
7.17 + * "Classpath" exception as provided by apidesign.org
7.18 + * in the License file that accompanied this code.
7.19 + *
7.20 + * You should have received a copy of the GNU General Public License
7.21 + * along with this program. Look for COPYING file in the top folder.
7.22 + * If not, see http://wiki.apidesign.org/wiki/GPLwithClassPathException
7.23 + */
7.24 +package net.java.html.json;
7.25 +
7.26 +import java.util.Map;
7.27 +import net.java.html.json.MapModelTest.One;
7.28 +import org.apidesign.html.json.impl.WrapperObject;
7.29 +import org.apidesign.html.json.spi.ContextBuilder;
7.30 +import org.testng.annotations.BeforeMethod;
7.31 +import org.testng.annotations.Test;
7.32 +import static org.testng.Assert.*;
7.33 +
7.34 +/**
7.35 + *
7.36 + * @author Jaroslav Tulach <jtulach@netbeans.org>
7.37 + */
7.38 +@Model(className = "Types", properties = {
7.39 + @Property(name = "intX", type = int.class),
7.40 + @Property(name = "byteX", type = byte.class),
7.41 + @Property(name = "shortX", type = short.class),
7.42 + @Property(name = "longX", type = long.class),
7.43 + @Property(name = "floatX", type = float.class),
7.44 + @Property(name = "doubleX", type = double.class),
7.45 + @Property(name = "charX", type = char.class),
7.46 + @Property(name = "StringX", type = String.class),
7.47 +})
7.48 +public class TypesTest {
7.49 + private MapModelTest.MapTechnology t;
7.50 + private Context c;
7.51 +
7.52 + @BeforeMethod public void initTechnology() {
7.53 + t = new MapModelTest.MapTechnology();
7.54 + c = ContextBuilder.create().withTechnology(t).build();
7.55 + }
7.56 + @Function static void readFromEvent(int intX,
7.57 + /*
7.58 + byte byteX,
7.59 + short shortX, long longX, float floatX,
7.60 + char charX
7.61 + */
7.62 + double doubleX,
7.63 + String StringX, Types myModel) {
7.64 +
7.65 + myModel.setIntX(intX);
7.66 + myModel.setDoubleX(doubleX);
7.67 + myModel.setStringX(StringX);
7.68 +
7.69 + /*
7.70 + myModel.setByte(byteX);
7.71 + myModel.setShort(shortX);
7.72 + myModel.setLong(longX);
7.73 + myModel.setFloat(floatX);
7.74 + */
7.75 + }
7.76 +
7.77 + @Test public void canParseEventAttributes() {
7.78 + Types t = new Types(c);
7.79 + t.setIntX(33);
7.80 + t.setDoubleX(180.5);
7.81 + t.setStringX("Ahoj");
7.82 +
7.83 + /*
7.84 + t.setCharX('A');
7.85 + t.setByteX((byte)3);
7.86 + t.setShortX((short)10);
7.87 + t.setLongX(66);
7.88 + t.setFloatX(99f);
7.89 + */
7.90 +
7.91 + Object json = WrapperObject.find(t);
7.92 +
7.93 + Types copy = new Types(c);
7.94 + Map copyMap = (Map) WrapperObject.find(copy);
7.95 + One o = (One) copyMap.get("readFromEvent");
7.96 + o.fb.call(null, json);
7.97 +
7.98 + assertEquals(copy.getIntX(), 33);
7.99 + assertEquals(copy.getDoubleX(), 180.5);
7.100 + assertEquals(copy.getStringX(), "Ahoj");
7.101 +// assertEquals(copy.getCharX(), 'A');
7.102 + }
7.103 +}
8.1 --- a/json/src/test/java/org/apidesign/html/json/impl/JSONListTest.java Mon Apr 22 22:38:59 2013 +0200
8.2 +++ b/json/src/test/java/org/apidesign/html/json/impl/JSONListTest.java Mon Apr 22 23:18:55 2013 +0200
8.3 @@ -156,5 +156,9 @@
8.4 public Object wrapArray(Object[] arr) {
8.5 return replaceArray ? this : arr;
8.6 }
8.7 +
8.8 + @Override
8.9 + public void extract(Object obj, String[] props, Object[] values) {
8.10 + }
8.11
8.12 }