Verify we can extract int, double and String from event properties
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 22 Apr 2013 23:18:55 +0200
changeset 22990ceaedfbe0
parent 21 4a593b351de2
child 23 54e266fb5c67
Verify we can extract int, double and String from event properties
json/src/main/java/net/java/html/json/Context.java
json/src/main/java/org/apidesign/html/json/impl/JSON.java
json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java
json/src/main/java/org/apidesign/html/json/spi/Technology.java
json/src/test/java/net/java/html/json/MapModelTest.java
json/src/test/java/net/java/html/json/ModelTest.java
json/src/test/java/net/java/html/json/TypesTest.java
json/src/test/java/org/apidesign/html/json/impl/JSONListTest.java
     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  }