# HG changeset patch # User Jaroslav Tulach # Date 1365494779 -7200 # Node ID 4887e22cb810297eaea9bb87f9752d158c0e565e # Parent 9a85848f6ff7e4a787ded28b1bdf306bdf1a2582 Support for enums diff -r 9a85848f6ff7 -r 4887e22cb810 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 19:53:11 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Tue Apr 09 10:06:19 2013 +0200 @@ -193,17 +193,16 @@ boolean[] isModel = { false }; boolean[] isEnum = { false }; String type = checkType(m.properties()[prop++], isModel, isEnum); - if (isEnum[0]) { -// w.append(type).append(".valueOf((String)"); -// close = true; - w.append(" this.prop_").append(pn); - w.append(" = null;\n"); - } else if (p.array()) { + if (p.array()) { w.append("if (ret[" + cnt + "] instanceof Object[]) {\n"); w.append(" for (Object e : ((Object[])ret[" + cnt + "])) {\n"); if (isModel[0]) { w.append(" this.prop_").append(pn).append(".add(new "); w.append(type).append("(e));\n"); + } else if (isEnum[0]) { + w.append(" this.prop_").append(pn); + w.append(".add("); + w.append(type).append(".valueOf((String)e));\n"); } else { if (isPrimitive(type)) { w.append(" this.prop_").append(pn).append(".add(((Number)e)."); @@ -216,7 +215,11 @@ w.append(" }\n"); w.append("}\n"); } else { - if (isPrimitive(type)) { + if (isEnum[0]) { + w.append(" this.prop_").append(pn); + w.append(" = "); + w.append(type).append(".valueOf((String)ret[" + cnt + "]);\n"); + } else if (isPrimitive(type)) { w.append(" this.prop_").append(pn); w.append(" = ((Number)").append("ret[" + cnt + "])."); w.append(type).append("Value();\n"); diff -r 9a85848f6ff7 -r 4887e22cb810 javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypesTest.java --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypesTest.java Mon Apr 08 19:53:11 2013 +0200 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypesTest.java Tue Apr 09 10:06:19 2013 +0200 @@ -43,7 +43,7 @@ assert "son".equals(p.getFirstName()) : "First name: " + p.getFirstName(); assert "dj".equals(p.getLastName()) : "Last name: " + p.getLastName(); -// assert Sex.MALE.equals(p.getSex()) : "Sex: " + p.getSex(); + assert Sex.MALE.equals(p.getSex()) : "Sex: " + p.getSex(); } @Factory public static Object[] create() { diff -r 9a85848f6ff7 -r 4887e22cb810 javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java Mon Apr 08 19:53:11 2013 +0200 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java Tue Apr 09 10:06:19 2013 +0200 @@ -17,9 +17,7 @@ */ package org.apidesign.bck2brwsr.htmlpage; -import java.util.Arrays; import java.util.Iterator; -import java.util.List; import org.apidesign.bck2brwsr.htmlpage.api.OnReceive; import org.apidesign.bck2brwsr.htmlpage.api.Page; import org.apidesign.bck2brwsr.htmlpage.api.Property; @@ -39,7 +37,8 @@ */ @Page(xhtml = "Empty.html", className = "JSONik", properties = { @Property(name = "fetched", type = PersonImpl.class), - @Property(name = "fetchedCount", type = int.class) + @Property(name = "fetchedCount", type = int.class), + @Property(name = "fetchedSex", type = Sex.class, array = true) }) public class JSONTest { private JSONik js; @@ -169,7 +168,7 @@ } assert "Sitar".equals(p.getFirstName()) : "Expecting Sitar: " + p.getFirstName(); - // assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); + assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); } @OnReceive(url="/{url}?callme={me}", jsonp = "me") @@ -197,7 +196,7 @@ } assert "Mitar".equals(p.getFirstName()) : "Unexpected: " + p.getFirstName(); - // assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); + assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); } @Http(@Http.Resource( @@ -220,7 +219,7 @@ assert p != null : "We should get our person back: " + p; assert "Sitar".equals(p.getFirstName()) : "Expecting Sitar: " + p.getFirstName(); -// assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); + assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); } @Http(@Http.Resource( @@ -243,7 +242,7 @@ assert p != null : "We should get our person back: " + p; assert "Gitar".equals(p.getFirstName()) : "Expecting Gitar: " + p.getFirstName(); -// assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); + assert Sex.FEMALE.equals(p.getSex()) : "Expecting FEMALE: " + p.getSex(); } @Http(@Http.Resource( @@ -269,7 +268,7 @@ assert p != null : "We should get our person back: " + p; assert "Gitar".equals(p.getFirstName()) : "Expecting Gitar: " + p.getFirstName(); -// assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); + assert Sex.FEMALE.equals(p.getSex()) : "Expecting FEMALE: " + p.getSex(); } @Http(@Http.Resource( @@ -292,6 +291,38 @@ assert js.getFetchedCount() == 6 : "1 + 2 + 3 is " + js.getFetchedCount(); } + @OnReceive(url="/{url}") + static void fetchPeopleSex(People p, JSONik model) { + model.setFetchedCount(1); + model.getFetchedSex().addAll(p.getSex()); + } + + + @Http(@Http.Resource( + content = "{'sex':['FEMALE', 'MALE', 'MALE']}", + path="/people.json", + mimeType = "application/json" + )) + @BrwsrTest public void loadAndParseArrayOfEnums() throws InterruptedException { + if (js == null) { + js = new JSONik(); + js.applyBindings(); + + js.fetchPeopleSex("people.json"); + } + + if (0 == js.getFetchedCount()) { + throw new InterruptedException(); + } + + assert js.getFetchedCount() == 1 : "Loaded"; + + assert js.getFetchedSex().size() == 3 : "Three values " + js.getFetchedSex(); + assert js.getFetchedSex().get(0) == Sex.FEMALE : "Female first " + js.getFetchedSex(); + assert js.getFetchedSex().get(1) == Sex.MALE : "male 2nd " + js.getFetchedSex(); + assert js.getFetchedSex().get(2) == Sex.MALE : "male 3rd " + js.getFetchedSex(); + } + @Http(@Http.Resource( content = "[{'firstName': 'Gitar', 'sex': 'FEMALE'}," + "{'firstName': 'Peter', 'sex': 'MALE'}" @@ -315,7 +346,7 @@ assert js.getFetchedCount() == 2 : "We got two values: " + js.getFetchedCount(); assert p != null : "We should get our person back: " + p; assert "Gitar".equals(p.getFirstName()) : "Expecting Gitar: " + p.getFirstName(); -// assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); + assert Sex.FEMALE.equals(p.getSex()) : "Expecting FEMALE: " + p.getSex(); } @Factory public static Object[] create() { diff -r 9a85848f6ff7 -r 4887e22cb810 javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/PersonImpl.java --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/PersonImpl.java Mon Apr 08 19:53:11 2013 +0200 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/PersonImpl.java Tue Apr 09 10:06:19 2013 +0200 @@ -54,7 +54,9 @@ @Model(className = "People", properties = { @Property(array = true, name = "info", type = PersonImpl.class), @Property(array = true, name = "nicknames", type = String.class), - @Property(array = true, name = "age", type = int.class),}) + @Property(array = true, name = "age", type = int.class), + @Property(array = true, name = "sex", type = Sex.class) + }) public class PeopleImpl { } } diff -r 9a85848f6ff7 -r 4887e22cb810 rt/emul/mini/src/main/java/java/lang/Enum.java --- a/rt/emul/mini/src/main/java/java/lang/Enum.java Mon Apr 08 19:53:11 2013 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/Enum.java Tue Apr 09 10:06:19 2013 +0200 @@ -27,6 +27,7 @@ import java.io.Serializable; import java.io.IOException; +import org.apidesign.bck2brwsr.core.JavaScriptBody; /** * This is the common base class of all Java language enumeration types. @@ -225,15 +226,17 @@ */ public static > T valueOf(Class enumType, String name) { - throw new UnsupportedOperationException(); -// T result = enumType.enumConstantDirectory().get(name); -// if (result != null) -// return result; -// if (name == null) -// throw new NullPointerException("Name is null"); -// throw new IllegalArgumentException( -// "No enum constant " + enumType.getCanonicalName() + "." + name); + for (Object o : values(enumType)) { + T t = enumType.cast(o); + if (name.equals(((Enum)t).name)) { + return t; + } + } + throw new IllegalArgumentException(); } + + @JavaScriptBody(args = { "enumType" }, body = "return enumType.cnstr.$VALUES;") + private static native Object[] values(Class enumType); /** * enum classes cannot have finalize methods. diff -r 9a85848f6ff7 -r 4887e22cb810 rt/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Mon Apr 08 19:53:11 2013 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Tue Apr 09 10:06:19 2013 +0200 @@ -207,5 +207,12 @@ true ); } + + @Test public void valueOfEnum() throws Exception { + assertExec("can get value of enum", Classes.class, + "valueEnum__Ljava_lang_String_2Ljava_lang_String_2", + "TWO", "TWO" + ); + } } diff -r 9a85848f6ff7 -r 4887e22cb810 rt/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Mon Apr 08 19:53:11 2013 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Tue Apr 09 10:06:19 2013 +0200 @@ -230,4 +230,7 @@ return Application.class.isAssignableFrom(MyApplication.class); } + public static String valueEnum(String v) { + return ClassesMarker.E.valueOf(v).toString(); + } }