Repository: incubator-juneau
Updated Branches:
  refs/heads/master b80299f2e -> 100006611


Bug fixes.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/10000661
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/10000661
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/10000661

Branch: refs/heads/master
Commit: 100006611b3fbb3e53574da6aa8230ade49c5426
Parents: b80299f
Author: JamesBognar <[email protected]>
Authored: Sun Apr 2 14:42:07 2017 -0400
Committer: JamesBognar <[email protected]>
Committed: Sun Apr 2 14:42:07 2017 -0400

----------------------------------------------------------------------
 .../java/org/apache/juneau/html/HtmlParser.java |   2 +-
 .../java/org/apache/juneau/uon/UonParser.java   |   3 +
 .../juneau/urlencoding/UrlEncodingParser.java   |  15 +--
 .../apache/juneau/rest/test/InterfaceProxy.java |  36 +++++
 .../rest/test/InterfaceProxyResource.java       |  76 +++++++++++
 .../juneau/rest/test/InterfaceProxyTest.java    | 133 +++++++++++++++++++
 6 files changed, 256 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/10000661/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
index f04ad04..9e53303 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
@@ -429,7 +429,7 @@ public class HtmlParser extends XmlParser {
                                if (m != null && c != null) {
                                        ObjectMap m2 = (m instanceof ObjectMap 
? (ObjectMap)m : new ObjectMap(m).setBeanSession(session));
                                        
m2.put(session.getBeanTypePropertyName(), c);
-                                       l.add((E)session.cast(m2, pMeta, null));
+                                       l.add((E)session.cast(m2, pMeta, 
elementType));
                                } else {
                                        l.add((E)m);
                                }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/10000661/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java 
b/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java
index 63e2a7d..347f0a3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/uon/UonParser.java
@@ -216,6 +216,9 @@ public class UonParser extends ReaderParser {
                                o = session.cast(m, pMeta, eType);
                        else
                                throw new ParseException(session, "Class 
''{0}'' could not be instantiated.  Reason: ''{1}''", 
sType.getInnerClass().getName(), sType.getNotABeanReason());
+               } else if (c == 'n') {
+                       r.read();
+                       parseNull(session, r);
                } else {
                        throw new ParseException(session, "Class ''{0}'' could 
not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), 
sType.getNotABeanReason());
                }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/10000661/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
index 9360dc2..953d004 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
@@ -91,14 +91,14 @@ public class UrlEncodingParser extends UonParser {
 
                if (sType.isObject()) {
                        ObjectMap m = new ObjectMap(session);
-                       parseIntoMap(session, r, m, session.string(), 
session.object());
+                       parseIntoMap(session, r, m, 
session.getClassMeta(Map.class, String.class, Object.class));
                        if (m.containsKey("_value"))
                                o = m.get("_value");
                        else
                                o = session.cast(m, null, eType);
                } else if (sType.isMap()) {
                        Map m = (sType.canCreateNewInstance() ? 
(Map)sType.newInstance() : new ObjectMap(session));
-                       o = parseIntoMap(session, r, m, sType.getKeyType(), 
sType.getValueType());
+                       o = parseIntoMap(session, r, m, sType);
                } else if (sType.canCreateNewBean(outer)) {
                        BeanMap m = session.newBeanMap(outer, 
sType.getInnerClass());
                        m = parseIntoBeanMap(session, r, m);
@@ -106,8 +106,7 @@ public class UrlEncodingParser extends UonParser {
                } else {
                        // It could be a non-bean with _type attribute.
                        ObjectMap m = new ObjectMap(session);
-                       ClassMeta<Object> valueType = object();
-                       parseIntoMap(session, r, m, string(), valueType);
+                       parseIntoMap(session, r, m, 
session.getClassMeta(Map.class, String.class, Object.class));
                        if (m.containsKey(session.getBeanTypePropertyName()))
                                o = session.cast(m, null, eType);
                        else if (m.containsKey("_value"))
@@ -145,10 +144,10 @@ public class UrlEncodingParser extends UonParser {
                return (T)o;
        }
 
-       private <K,V> Map<K,V> parseIntoMap(UonParserSession session, 
ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) 
throws Exception {
+       private <K,V> Map<K,V> parseIntoMap(UonParserSession session, 
ParserReader r, Map<K,V> m, ClassMeta<?> type) throws Exception {
 
-               if (keyType == null)
-                       keyType = (ClassMeta<K>)string();
+               ClassMeta<K> keyType = (ClassMeta<K>)type.getKeyType();
+               ClassMeta<V> valueType = (ClassMeta<V>)type.getValueType();
 
                int c = r.peekSkipWs();
                if (c == -1)
@@ -519,7 +518,7 @@ public class UrlEncodingParser extends UonParser {
                UonReader r = s.getReader();
                if (r.peekSkipWs() == '?')
                        r.read();
-               m = parseIntoMap(s, r, m, 
(ClassMeta<K>)session.getClassMeta(keyType), 
(ClassMeta<V>)session.getClassMeta(valueType));
+               m = parseIntoMap(s, r, m, session.getClassMeta(Map.class, 
keyType, valueType));
                return m;
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/10000661/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxy.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxy.java
 
b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxy.java
index ecc26b3..9f8da38 100644
--- 
a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxy.java
+++ 
b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxy.java
@@ -59,6 +59,16 @@ public interface InterfaceProxy {
        Map<String,List<Bean[][][]>> returnBean1d3dListMap();
        Map<Integer,List<Bean>> returnBeanListMapIntegerKeys();
 
+       // Typed beans
+       TypedBean returnTypedBean();
+       TypedBean[][][] returnTypedBean3dArray();
+       List<TypedBean> returnTypedBeanList();
+       List<TypedBean[][][]> returnTypedBean1d3dList();
+       Map<String,TypedBean> returnTypedBeanMap();
+       Map<String,List<TypedBean>> returnTypedBeanListMap();
+       Map<String,List<TypedBean[][][]>> returnTypedBean1d3dListMap();
+       Map<Integer,List<TypedBean>> returnTypedBeanListMapIntegerKeys();
+
        // Swapped POJOs
        SwappedPojo returnSwappedPojo();
        SwappedPojo[][][] returnSwappedPojo3dArray();
@@ -120,6 +130,16 @@ public interface InterfaceProxy {
        void setBean1d3dListMap(Map<String,List<Bean[][][]>> x);
        void setBeanListMapIntegerKeys(Map<Integer,List<Bean>> x);
 
+       // Typed beans
+       void setTypedBean(TypedBean x);
+       void setTypedBean3dArray(TypedBean[][][] x);
+       void setTypedBeanList(List<TypedBean> x);
+       void setTypedBean1d3dList(List<TypedBean[][][]> x);
+       void setTypedBeanMap(Map<String,TypedBean> x);
+       void setTypedBeanListMap(Map<String,List<TypedBean>> x);
+       void setTypedBean1d3dListMap(Map<String,List<TypedBean[][][]>> x);
+       void setTypedBeanListMapIntegerKeys(Map<Integer,List<TypedBean>> x);
+
        // Swapped POJOs
        void setSwappedPojo(SwappedPojo x);
        void setSwappedPojo3dArray(SwappedPojo[][][] x);
@@ -220,4 +240,20 @@ public interface InterfaceProxy {
        public static enum TestEnum {
                ONE,TWO,THREE
        }
+
+       @org.apache.juneau.annotation.Bean(beanDictionary={TypedBeanImpl.class})
+       public static interface TypedBean {
+       }
+
+       @org.apache.juneau.annotation.Bean(typeName="TypedBeanImpl", sort=true)
+       public static class TypedBeanImpl implements TypedBean {
+               public int a;
+               public String b;
+
+               public TypedBeanImpl init() {
+                       this.a = 1;
+                       this.b = "foo";
+                       return this;
+               }
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/10000661/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxyResource.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxyResource.java
 
b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxyResource.java
index ade87a1..a5ade59 100644
--- 
a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxyResource.java
+++ 
b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxyResource.java
@@ -149,6 +149,40 @@ public class InterfaceProxyResource extends 
RestServletJenaDefault {
                                return new 
AMap<Integer,List<Bean>>().append(1,asList(new Bean().init()));
                        }
 
+                       // Typed beans
+                       @Override
+                       public TypedBean returnTypedBean() {
+                               return new TypedBeanImpl().init();
+                       }
+                       @Override
+                       public TypedBean[][][] returnTypedBean3dArray() {
+                               return new TypedBean[][][]{{{new 
TypedBeanImpl().init(),null},null},null};
+                       }
+                       @Override
+                       public List<TypedBean> returnTypedBeanList() {
+                               return asList((TypedBean)new 
TypedBeanImpl().init());
+                       }
+                       @Override
+                       public List<TypedBean[][][]> returnTypedBean1d3dList() {
+                               return new AList<TypedBean[][][]>().append(new 
TypedBean[][][]{{{new TypedBeanImpl().init(),null},null},null}).append(null);
+                       }
+                       @Override
+                       public Map<String,TypedBean> returnTypedBeanMap() {
+                               return new 
AMap<String,TypedBean>().append("foo",new TypedBeanImpl().init());
+                       }
+                       @Override
+                       public Map<String,List<TypedBean>> 
returnTypedBeanListMap() {
+                               return new 
AMap<String,List<TypedBean>>().append("foo",asList((TypedBean)new 
TypedBeanImpl().init()));
+                       }
+                       @Override
+                       public Map<String,List<TypedBean[][][]>> 
returnTypedBean1d3dListMap() {
+                               return new 
AMap<String,List<TypedBean[][][]>>().append("foo", new 
AList<TypedBean[][][]>().append(new TypedBean[][][]{{{new 
TypedBeanImpl().init(),null},null},null}).append(null));
+                       }
+                       @Override
+                       public Map<Integer,List<TypedBean>> 
returnTypedBeanListMapIntegerKeys() {
+                               return new 
AMap<Integer,List<TypedBean>>().append(1,asList((TypedBean)new 
TypedBeanImpl().init()));
+                       }
+
                        // Swapped POJOs
                        @Override
                        public SwappedPojo returnSwappedPojo() {
@@ -349,6 +383,48 @@ public class InterfaceProxyResource extends 
RestServletJenaDefault {
                                assertEquals(Integer.class, 
x.keySet().iterator().next().getClass());
                        }
 
+                       // Typed beans
+                       @Override
+                       public void setTypedBean(TypedBean x) {
+                               
assertObjectEquals("{_type:'TypedBeanImpl',a:1,b:'foo'}", x);
+                               assertEquals(TypedBeanImpl.class, x.getClass());
+                       }
+                       @Override
+                       public void setTypedBean3dArray(TypedBean[][][] x) {
+                               
assertObjectEquals("[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null]", 
x);
+                               assertEquals(TypedBeanImpl.class, 
x[0][0][0].getClass());
+                       }
+                       @Override
+                       public void setTypedBeanList(List<TypedBean> x) {
+                               
assertObjectEquals("[{_type:'TypedBeanImpl',a:1,b:'foo'}]", x);
+                               assertEquals(TypedBeanImpl.class, 
x.get(0).getClass());
+                       }
+                       @Override
+                       public void setTypedBean1d3dList(List<TypedBean[][][]> 
x) {
+                               
assertObjectEquals("[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]",
 x);
+                               assertEquals(TypedBeanImpl.class, 
x.get(0)[0][0][0].getClass());
+                       }
+                       @Override
+                       public void setTypedBeanMap(Map<String,TypedBean> x) {
+                               
assertObjectEquals("{foo:{_type:'TypedBeanImpl',a:1,b:'foo'}}", x);
+                               assertEquals(TypedBeanImpl.class, 
x.get("foo").getClass());
+                       }
+                       @Override
+                       public void 
setTypedBeanListMap(Map<String,List<TypedBean>> x) {
+                               
assertObjectEquals("{foo:[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", x);
+                               assertEquals(TypedBeanImpl.class, 
x.get("foo").get(0).getClass());
+                       }
+                       @Override
+                       public void 
setTypedBean1d3dListMap(Map<String,List<TypedBean[][][]>> x) {
+                               
assertObjectEquals("{foo:[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]}",
 x);
+                               assertEquals(TypedBeanImpl.class, 
x.get("foo").get(0)[0][0][0].getClass());
+                       }
+                       @Override
+                       public void 
setTypedBeanListMapIntegerKeys(Map<Integer,List<TypedBean>> x) {
+                               
assertObjectEquals("{'1':[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", x);  // Note: 
JsonSerializer serializes key as string.
+                               assertEquals(TypedBeanImpl.class, 
x.get(1).get(0).getClass());
+                       }
+
                        // Swapped POJOs
                        @Override
                        public void setSwappedPojo(SwappedPojo x) {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/10000661/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InterfaceProxyTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InterfaceProxyTest.java
 
b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InterfaceProxyTest.java
index 4bdc15a..25df423 100644
--- 
a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InterfaceProxyTest.java
+++ 
b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InterfaceProxyTest.java
@@ -214,6 +214,64 @@ public class InterfaceProxyTest extends RestTestcase {
                assertEquals(Integer.class, 
x.keySet().iterator().next().getClass());
        }
 
+       // Typed beans
+       @Test
+       public void returnTypedBean() {
+               TypedBean x = getProxy().returnTypedBean();
+               assertObjectEquals("{_type:'TypedBeanImpl',a:1,b:'foo'}", x);
+               assertEquals(TypedBeanImpl.class, x.getClass());
+       }
+
+       @Test
+       public void returnTypedBean3dArray() {
+               TypedBean[][][] x = getProxy().returnTypedBean3dArray();
+               
assertObjectEquals("[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null]", 
x);
+               assertEquals(TypedBeanImpl.class, x[0][0][0].getClass());
+       }
+
+       @Test
+       public void returnTypedBeanList() {
+               List<TypedBean> x = getProxy().returnTypedBeanList();
+               assertObjectEquals("[{_type:'TypedBeanImpl',a:1,b:'foo'}]", x);
+               assertEquals(TypedBeanImpl.class, x.get(0).getClass());
+       }
+
+       @Test
+       public void returnTypedBean1d3dList() {
+               List<TypedBean[][][]> x = getProxy().returnTypedBean1d3dList();
+               
assertObjectEquals("[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]",
 x);
+               assertEquals(TypedBeanImpl.class, x.get(0)[0][0][0].getClass());
+       }
+
+       @Test
+       public void returnTypedBeanMap() {
+               Map<String,TypedBean> x = getProxy().returnTypedBeanMap();
+               assertObjectEquals("{foo:{_type:'TypedBeanImpl',a:1,b:'foo'}}", 
x);
+               assertEquals(TypedBeanImpl.class, x.get("foo").getClass());
+       }
+
+       @Test
+       public void returnTypedBeanListMap() {
+               Map<String,List<TypedBean>> x = 
getProxy().returnTypedBeanListMap();
+               
assertObjectEquals("{foo:[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", x);
+               assertEquals(TypedBeanImpl.class, 
x.get("foo").get(0).getClass());
+       }
+
+       @Test
+       public void returnTypedBean1d3dListMap() {
+               Map<String,List<TypedBean[][][]>> x = 
getProxy().returnTypedBean1d3dListMap();
+               
assertObjectEquals("{foo:[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]}",
 x);
+               assertEquals(TypedBeanImpl.class, 
x.get("foo").get(0)[0][0][0].getClass());
+       }
+
+       @Test
+       public void returnTypedBeanListMapIntegerKeys() {
+               // Note: JsonSerializer serializes key as string.
+               Map<Integer,List<TypedBean>> x = 
getProxy().returnTypedBeanListMapIntegerKeys();
+               
assertObjectEquals("{'1':[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", x);
+               assertEquals(TypedBeanImpl.class, x.get(1).get(0).getClass());
+       }
+
        // Swapped POJOs
        @Test
        public void returnSwappedPojo() {
@@ -487,11 +545,21 @@ public class InterfaceProxyTest extends RestTestcase {
        }
 
        @Test
+       public void setBean3dArray() {
+               getProxy().setBean3dArray(new Bean[][][]{{{new 
Bean().init(),null},null},null});
+       }
+
+       @Test
        public void setBeanList() {
                getProxy().setBeanList(Arrays.asList(new Bean().init()));
        }
 
        @Test
+       public void setBean1d3dList() {
+               getProxy().setBean1d3dList(new AList<Bean[][][]>().append(new 
Bean[][][]{{{new Bean().init(),null},null},null}).append(null));
+       }
+
+       @Test
        public void setBeanMap() {
                getProxy().setBeanMap(new AMap<String,Bean>().append("foo",new 
Bean().init()));
        }
@@ -502,10 +570,56 @@ public class InterfaceProxyTest extends RestTestcase {
        }
 
        @Test
+       public void setBean1d3dListMap() {
+               getProxy().setBean1d3dListMap(new 
AMap<String,List<Bean[][][]>>().append("foo",new AList<Bean[][][]>().append(new 
Bean[][][]{{{new Bean().init(),null},null},null}).append(null)));
+       }
+
+       @Test
        public void setBeanListMapIntegerKeys() {
                getProxy().setBeanListMapIntegerKeys(new 
AMap<Integer,List<Bean>>().append(1,Arrays.asList(new Bean().init())));
        }
 
+       // Typed beans
+       @Test
+       public void setTypedBean() {
+               getProxy().setTypedBean(new TypedBeanImpl().init());
+       }
+
+       @Test
+       public void setTypedBean3dArray() {
+               getProxy().setTypedBean3dArray(new TypedBean[][][]{{{new 
TypedBeanImpl().init(),null},null},null});
+       }
+
+       @Test
+       public void setTypedBeanList() {
+               getProxy().setTypedBeanList(Arrays.asList((TypedBean)new 
TypedBeanImpl().init()));
+       }
+
+       @Test
+       public void setTypedBean1d3dList() {
+               getProxy().setTypedBean1d3dList(new 
AList<TypedBean[][][]>().append(new TypedBean[][][]{{{new 
TypedBeanImpl().init(),null},null},null}).append(null));
+       }
+
+       @Test
+       public void setTypedBeanMap() {
+               getProxy().setTypedBeanMap(new 
AMap<String,TypedBean>().append("foo",new TypedBeanImpl().init()));
+       }
+
+       @Test
+       public void setTypedBeanListMap() {
+               getProxy().setTypedBeanListMap(new 
AMap<String,List<TypedBean>>().append("foo",Arrays.asList((TypedBean)new 
TypedBeanImpl().init())));
+       }
+
+       @Test
+       public void setTypedBean1d3dListMap() {
+               getProxy().setTypedBean1d3dListMap(new 
AMap<String,List<TypedBean[][][]>>().append("foo",new 
AList<TypedBean[][][]>().append(new TypedBean[][][]{{{new 
TypedBeanImpl().init(),null},null},null}).append(null)));
+       }
+
+       @Test
+       public void setTypedBeanListMapIntegerKeys() {
+               getProxy().setTypedBeanListMapIntegerKeys(new 
AMap<Integer,List<TypedBean>>().append(1,Arrays.asList((TypedBean)new 
TypedBeanImpl().init())));
+       }
+
        // Swapped POJOs
        @Test
        public void setSwappedPojo() {
@@ -702,4 +816,23 @@ public class InterfaceProxyTest extends RestTestcase {
                Map<TestEnum,List<TestEnum[][][]>> x5n = null;
                getProxy().setMultiParamsEnum(x1, x2, x2n, x3, x3n, x4, x4n, 
x5, x5n);
        }
+//
+//
+//     public static void main(String[] args) {
+//             List<TypedBean[][][]> l = new 
AList<TypedBean[][][]>().append(new TypedBean[][][]{{{new 
TypedBeanImpl().init(),null},null},null}).append(null);
+//             JsonSerializer.DEFAULT_LAX.println(l);
+//             UrlEncodingSerializer.DEFAULT.println(l);
+//             try {
+//                     String r = UrlEncodingSerializer.DEFAULT.serialize(l);
+//                     l = UrlEncodingParser.DEFAULT.parse(r, List.class, 
TypedBean[][][].class);
+//
+//                     l = (List<TypedBean[][][]>) 
UrlEncodingParser.DEFAULT.parse(r, 
InterfaceProxy.class.getMethod("returnTypedBean1d3dListMap").getGenericReturnType());
+//
+//                     JsonSerializer.DEFAULT_LAX.println(l);
+//             } catch (Exception e) {
+//                     // TODO Auto-generated catch block
+//                     e.printStackTrace();
+//             }
+//
+//     }
 }

Reply via email to