Repository: incubator-juneau Updated Branches: refs/heads/master 100006611 -> 8995e2ab1
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/8995e2ab Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/8995e2ab Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/8995e2ab Branch: refs/heads/master Commit: 8995e2ab1e52430f565caa42cb09968035ab3f5a Parents: 1000066 Author: JamesBognar <[email protected]> Authored: Sun Apr 2 15:40:08 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Sun Apr 2 15:40:08 2017 -0400 ---------------------------------------------------------------------- .../urlencoding/UrlEncodingParserTest.java | 6 --- .../java/org/apache/juneau/uon/UonParser.java | 2 + .../juneau/urlencoding/UrlEncodingParser.java | 49 +++++++++----------- .../apache/juneau/rest/test/ContentTest.java | 48 +++++-------------- .../juneau/rest/test/InterfaceProxyTest.java | 11 ++++- 5 files changed, 46 insertions(+), 70 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8995e2ab/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java index 474c467..3fd318e 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java @@ -120,12 +120,6 @@ public class UrlEncodingParserTest { // Empty array // Top level - t = "_value=@()"; - l = (List)p.parse(t, Object.class); - assertTrue(l.isEmpty()); - t = "_value= @( ) "; - l = p.parse(t, List.class); - assertTrue(l.isEmpty()); t = "@()"; l = (List)p.parseParameter(t, Object.class); assertTrue(l.isEmpty()); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8995e2ab/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 347f0a3..52ff871 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 @@ -223,6 +223,8 @@ public class UonParser extends ReaderParser { throw new ParseException(session, "Class ''{0}'' could not be instantiated. Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason()); } + if (o == null && sType.isPrimitive()) + o = sType.getPrimitiveDefault(); if (transform != null && o != null) o = transform.unswap(session, o, eType); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8995e2ab/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 953d004..5fd9647 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,43 +91,38 @@ public class UrlEncodingParser extends UonParser { if (sType.isObject()) { ObjectMap m = new ObjectMap(session); - parseIntoMap(session, r, m, session.getClassMeta(Map.class, String.class, Object.class)); + parseIntoMap(session, r, m, session.getClassMeta(Map.class, String.class, Object.class), outer); 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); + o = parseIntoMap(session, r, m, sType, m); } else if (sType.canCreateNewBean(outer)) { BeanMap m = session.newBeanMap(outer, sType.getInnerClass()); m = parseIntoBeanMap(session, r, m); o = m == null ? null : m.getBean(); + } else if (sType.isCollection() || sType.isArray() || sType.isArgs()) { + // ?1=foo&2=bar... + Collection c2 = ((sType.isArray() || sType.isArgs()) || ! sType.canCreateNewInstance(outer)) ? new ObjectList(session) : (Collection)sType.newInstance(); + Map<Integer,Object> m = new TreeMap<Integer,Object>(); + parseIntoMap(session, r, m, sType, c2); + c2.addAll(m.values()); + if (sType.isArray()) + o = ArrayUtils.toArray(c2, sType.getElementType().getInnerClass()); + else if (sType.isArgs()) + o = c2.toArray(new Object[c2.size()]); + else + o = c2; } else { // It could be a non-bean with _type attribute. ObjectMap m = new ObjectMap(session); - parseIntoMap(session, r, m, session.getClassMeta(Map.class, String.class, Object.class)); + parseIntoMap(session, r, m, session.getClassMeta(Map.class, String.class, Object.class), outer); if (m.containsKey(session.getBeanTypePropertyName())) o = session.cast(m, null, eType); - else if (m.containsKey("_value")) + else if (m.containsKey("_value")) { o = session.convertToType(m.get("_value"), sType); - else if (sType.isCollection() || sType.isArray() || sType.isArgs()) { - // ?1=foo&2=bar... - Collection c2 = ((sType.isArray() || sType.isArgs()) || ! sType.canCreateNewInstance(outer)) ? new ObjectList(session) : (Collection)sType.newInstance(); - Map<Integer,Object> t = new TreeMap<Integer,Object>(); - int argIndex = 0; - for (Map.Entry<String,Object> e : m.entrySet()) { - String k = e.getKey(); - if (StringUtils.isNumeric(k)) - t.put(Integer.valueOf(k), session.convertToType(e.getValue(), sType.isArgs() ? sType.getArg(argIndex++) : sType.getElementType())); - } - c2.addAll(t.values()); - if (sType.isArray()) - o = ArrayUtils.toArray(c2, sType.getElementType().getInnerClass()); - else if (sType.isArgs()) - o = c2.toArray(new Object[c2.size()]); - else - o = c2; } else { if (sType.getNotABeanReason() != null) throw new ParseException(session, "Class ''{0}'' could not be instantiated as application/x-www-form-urlencoded. Reason: ''{1}''", sType, sType.getNotABeanReason()); @@ -144,10 +139,9 @@ public class UrlEncodingParser extends UonParser { return (T)o; } - private <K,V> Map<K,V> parseIntoMap(UonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<?> type) throws Exception { + private <K,V> Map<K,V> parseIntoMap(UonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<?> type, Object outer) throws Exception { - ClassMeta<K> keyType = (ClassMeta<K>)type.getKeyType(); - ClassMeta<V> valueType = (ClassMeta<V>)type.getValueType(); + ClassMeta<K> keyType = (ClassMeta<K>)(type.isArgs() || type.isCollectionOrArray() ? session.getClassMeta(Integer.class) : type.getKeyType()); int c = r.peekSkipWs(); if (c == -1) @@ -160,6 +154,7 @@ public class UrlEncodingParser extends UonParser { boolean isInEscape = false; int state = S1; + int argIndex = 0; K currAttr = null; while (c != -1) { c = r.read(); @@ -183,6 +178,7 @@ public class UrlEncodingParser extends UonParser { } } else if (state == S3) { if (c == -1 || c == '\u0001') { + ClassMeta<V> valueType = (ClassMeta<V>)(type.isArgs() ? type.getArg(argIndex++) : type.isCollectionOrArray() ? type.getElementType() : type.getValueType()); V value = convertAttrToType(session, m, "", valueType); m.put(currAttr, value); if (c == -1) @@ -190,7 +186,8 @@ public class UrlEncodingParser extends UonParser { state = S1; } else { // For performance, we bypass parseAnything for string values. - V value = (V)(valueType.isString() ? super.parseString(session, r.unread(), true) : super.parseAnything(session, valueType, r.unread(), m, true, null)); + ClassMeta<V> valueType = (ClassMeta<V>)(type.isArgs() ? type.getArg(argIndex++) : type.isCollectionOrArray() ? type.getElementType() : type.getValueType()); + V value = (V)(valueType.isString() ? super.parseString(session, r.unread(), true) : super.parseAnything(session, valueType, r.unread(), outer, true, null)); // If we already encountered this parameter, turn it into a list. if (m.containsKey(currAttr) && valueType.isObject()) { @@ -518,7 +515,7 @@ public class UrlEncodingParser extends UonParser { UonReader r = s.getReader(); if (r.peekSkipWs() == '?') r.read(); - m = parseIntoMap(s, r, m, session.getClassMeta(Map.class, keyType, valueType)); + m = parseIntoMap(s, r, m, session.getClassMeta(Map.class, keyType, valueType), null); return m; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8995e2ab/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java index 386aad1..c5f637d 100644 --- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java +++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java @@ -43,12 +43,8 @@ public class ContentTest extends RestTestcase { assertEquals("true", r); r = c.doPost(URL + "/boolean?body=false", null).getResponseAsString(); assertEquals("false", r); - try { - r = c.doPost(URL + "/boolean?body=null&noTrace=true", null).getResponseAsString(); - fail("Exception expected!"); - } catch (RestCallException e) { - assertEquals(400, e.getResponseCode()); - } + r = c.doPost(URL + "/boolean?body=null", null).getResponseAsString(); + assertEquals("false", r); try { r = c.doPost(URL + "/boolean?body=bad&noTrace=true", null).getResponseAsString(); fail("Exception expected!"); @@ -80,12 +76,8 @@ public class ContentTest extends RestTestcase { // } r = c.doPost(URL + "/int?body=-123", null).getResponseAsString(); assertEquals("-123", r); - try { - r = c.doPost(URL + "/int?body=null&noTrace=true", null).getResponseAsString(); - fail("Exception expected!"); - } catch (RestCallException e) { - assertEquals(400, e.getResponseCode()); - } + r = c.doPost(URL + "/int?body=null", null).getResponseAsString(); + assertEquals("0", r); try { r = c.doPost(URL + "/int?body=bad&noTrace=true", null).getResponseAsString(); fail("Exception expected!"); @@ -114,12 +106,8 @@ public class ContentTest extends RestTestcase { // } r = c.doPost(URL + "/float?body=-1.23", null).getResponseAsString(); assertEquals("-1.23", r); - try { - r = c.doPost(URL + "/float?body=null&noTrace=true", null).getResponseAsString(); - fail("Exception expected!"); - } catch (RestCallException e) { - assertEquals(400, e.getResponseCode()); - } + r = c.doPost(URL + "/float?body=null", null).getResponseAsString(); + assertEquals("0.0", r); try { r = c.doPost(URL + "/float?body=bad&noTrace=true", null).getResponseAsString(); fail("Exception expected!"); @@ -341,12 +329,8 @@ public class ContentTest extends RestTestcase { assertEquals("true", r); r = c.doPost(URL + "/boolean", "false").getResponseAsString(); assertEquals("false", r); - try { - r = c.doPost(URL + "/boolean?noTrace=true", "null").getResponseAsString(); - fail("Exception expected!"); - } catch (RestCallException e) { - assertEquals(400, e.getResponseCode()); - } + r = c.doPost(URL + "/boolean", "null").getResponseAsString(); + assertEquals("false", r); try { r = c.doPost(URL + "/boolean?noTrace=true", "bad").getResponseAsString(); fail("Exception expected!"); @@ -378,12 +362,8 @@ public class ContentTest extends RestTestcase { // } r = c.doPost(URL + "/int", "-123").getResponseAsString(); assertEquals("-123", r); - try { - r = c.doPost(URL + "/int?noTrace=true", "null").getResponseAsString(); - fail("Exception expected!"); - } catch (RestCallException e) { - assertEquals(400, e.getResponseCode()); - } + r = c.doPost(URL + "/int", "null").getResponseAsString(); + assertEquals("0", r); try { r = c.doPost(URL + "/int?noTrace=true", "bad").getResponseAsString(); fail("Exception expected!"); @@ -412,12 +392,8 @@ public class ContentTest extends RestTestcase { // } r = c.doPost(URL + "/float", "-1.23").getResponseAsString(); assertEquals("-1.23", r); - try { - r = c.doPost(URL + "/float?noTrace=true", "null").getResponseAsString(); - fail("Exception expected!"); - } catch (RestCallException e) { - assertEquals(400, e.getResponseCode()); - } + r = c.doPost(URL + "/float", "null").getResponseAsString(); + assertEquals("0.0", r); try { r = c.doPost(URL + "/float?noTrace=true", "bad").getResponseAsString(); fail("Exception expected!"); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/8995e2ab/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 25df423..4cf5f50 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 @@ -816,19 +816,26 @@ 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); +// List<TypedBean[][][]> l = new AList<TypedBean[][][]>().append(new TypedBean[][][]{{{new TypedBeanImpl().init()}}}); // JsonSerializer.DEFAULT_LAX.println(l); // UrlEncodingSerializer.DEFAULT.println(l); // try { // String r = UrlEncodingSerializer.DEFAULT.serialize(l); +// System.err.println("***Test1***"); // l = UrlEncodingParser.DEFAULT.parse(r, List.class, TypedBean[][][].class); +// JsonSerializer.DEFAULT_LAX.println(l); +// System.err.println(l.get(0)[0][0][0].getClass()); // +// System.err.println("***Test2***"); // l = (List<TypedBean[][][]>) UrlEncodingParser.DEFAULT.parse(r, InterfaceProxy.class.getMethod("returnTypedBean1d3dListMap").getGenericReturnType()); +// JsonSerializer.DEFAULT_LAX.println(l); +// System.err.println(l.get(0)[0][0][0].getClass()); // // JsonSerializer.DEFAULT_LAX.println(l); +// System.err.println(l.get(0)[0][0][0].getClass()); // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace();
