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(); +// } +// +// } }
