Repository: incubator-juneau Updated Branches: refs/heads/master 07dc72995 -> 2bc5f59b9
Fold doParseArgs() methods into parseAnything() methods. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/2bc5f59b Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/2bc5f59b Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/2bc5f59b Branch: refs/heads/master Commit: 2bc5f59b9ddb0c69273b9d6a72c68bd205a7a6e3 Parents: 07dc729 Author: JamesBognar <[email protected]> Authored: Tue Mar 28 20:29:39 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Tue Mar 28 20:29:39 2017 -0400 ---------------------------------------------------------------------- .../java/org/apache/juneau/html/HtmlParser.java | 1 + .../apache/juneau/msgpack/MsgPackParser.java | 24 +---- .../java/org/apache/juneau/uon/UonParser.java | 57 +++--------- .../juneau/urlencoding/UrlEncodingParser.java | 94 +++----------------- .../java/org/apache/juneau/xml/XmlParser.java | 14 +-- 5 files changed, 36 insertions(+), 154 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/2bc5f59b/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 8ff0ffc..c20ed2c 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 @@ -355,6 +355,7 @@ public class HtmlParser extends XmlParser { * Precondition: Must be pointing at event following <ul> event. * Postcondition: Pointing at next START_ELEMENT or END_DOCUMENT event. */ + // TODO - Fold this into parseAnything(). private Object[] parseArgs(HtmlParserSession session, XMLStreamReader r, ClassMeta<Object[]> args) throws Exception { HtmlTag tag = HtmlTag.forEvent(r); ClassMeta<?>[] argTypes = args.getArgs(); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/2bc5f59b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java index 9abc288..75dd45c 100644 --- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java @@ -160,7 +160,7 @@ public class MsgPackParser extends InputStreamParser { } else { throw new ParseException(session, "Invalid data type {0} encountered for parse type {1}", dt, sType); } - } else if (sType.isArray()) { + } else if (sType.isArray() || sType.isArgs()) { if (dt == MAP) { ObjectMap m = new ObjectMap(session); for (int i = 0; i < length; i++) @@ -169,7 +169,7 @@ public class MsgPackParser extends InputStreamParser { } else if (dt == ARRAY) { Collection l = (sType.isCollection() && sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(session)); for (int i = 0; i < length; i++) - l.add(parseAnything(session, sType.getElementType(), is, l, pMeta)); + l.add(parseAnything(session, sType.isArgs() ? sType.getArg(i) : sType.getElementType(), is, l, pMeta)); o = session.toArray(sType, l); } else { throw new ParseException(session, "Invalid data type {0} encountered for parse type {1}", dt, sType); @@ -196,24 +196,6 @@ public class MsgPackParser extends InputStreamParser { return (T)o; } - private Object[] parseArgs(MsgPackParserSession session, MsgPackInputStream is, ClassMeta<Object[]> args) throws Exception { - - ClassMeta<?>[] argTypes = args.getArgs(); - Object[] o = new Object[argTypes.length]; - DataType dt = is.readDataType(); - int length = (int)is.readLength(); - - if (dt != ARRAY) - throw new ParseException("Expected ARRAY but was {0}", dt); - if (length != argTypes.length) - throw new ParseException("Expected array length {0} but was {1}", argTypes.length, length); - - for (int i = 0; i < length; i++) - o[i] = parseAnything(session, argTypes[i], is, null, null); - - return o; - } - //-------------------------------------------------------------------------------- // Entry point methods @@ -236,7 +218,7 @@ public class MsgPackParser extends InputStreamParser { protected Object[] doParseArgs(ParserSession session, ClassMeta<Object[]> args) throws Exception { MsgPackParserSession s = (MsgPackParserSession)session; MsgPackInputStream is = s.getInputStream(); - Object[] a = parseArgs(s, is, args); + Object[] a = parseAnything(s, args, is, session.getOuter(), null); return a; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/2bc5f59b/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 a884ccc..707c759 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 @@ -136,7 +136,7 @@ public class UonParser extends ReaderParser { o = session.cast(m, pMeta, eType); } else if (c == '@') { Collection l = new ObjectList(session); - o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue, pMeta); + o = parseIntoCollection(session, r, l, sType, isUrlParamValue, pMeta); } else { String s = parseString(session, r, isUrlParamValue); if (c != '\'') { @@ -179,7 +179,7 @@ public class UonParser extends ReaderParser { } } else { Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance(outer) : new ObjectList(session)); - o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue, pMeta); + o = parseIntoCollection(session, r, l, sType, isUrlParamValue, pMeta); } } else if (sType.canCreateNewBean(outer)) { BeanMap m = session.newBeanMap(outer, sType.getInnerClass()); @@ -191,7 +191,7 @@ public class UonParser extends ReaderParser { o = sType.newInstanceFromString(outer, s); } else if (sType.canCreateNewInstanceFromNumber(outer)) { o = sType.newInstanceFromNumber(session, outer, parseNumber(session, r, sType.getNewInstanceFromNumberClass())); - } else if (sType.isArray()) { + } else if (sType.isArray() || sType.isArgs()) { if (c == '(') { ObjectMap m = new ObjectMap(session); parseIntoMap(session, r, m, string(), object(), pMeta); @@ -205,7 +205,7 @@ public class UonParser extends ReaderParser { o = session.toArray(sType, l); } } else { - ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), isUrlParamValue, pMeta); + ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType, isUrlParamValue, pMeta); o = session.toArray(sType, l); } } else if (c == '(') { @@ -315,7 +315,7 @@ public class UonParser extends ReaderParser { return null; // Unreachable. } - private <E> Collection<E> parseIntoCollection(UonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType, boolean isUrlParamValue, BeanPropertyMeta pMeta) throws Exception { + private <E> Collection<E> parseIntoCollection(UonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> type, boolean isUrlParamValue, BeanPropertyMeta pMeta) throws Exception { int c = r.readSkipWs(); if (c == -1 || c == AMP) @@ -323,6 +323,8 @@ public class UonParser extends ReaderParser { if (c == 'n') return (Collection<E>)parseNull(session, r); + int argIndex = 0; + // If we're parsing a top-level parameter, we're allowed to have comma-delimited lists outside parenthesis (e.g. "&foo=1,2,3&bar=a,b,c") // This is not allowed at lower levels since we use comma's as end delimiters. boolean isInParens = (c == '@'); @@ -346,14 +348,14 @@ public class UonParser extends ReaderParser { if (state == S1 || state == S2) { if (c == ')') { if (state == S2) { - l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta)); + l.add((E)parseAnything(session, type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), r.unread(), l, false, pMeta)); r.read(); } return l; } else if (Character.isWhitespace(c)) { skipSpace(r); } else { - l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta)); + l.add((E)parseAnything(session, type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), r.unread(), l, false, pMeta)); state = S3; } } else if (state == S3) { @@ -380,7 +382,7 @@ public class UonParser extends ReaderParser { if (Character.isWhitespace(c)) { skipSpace(r); } else { - l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta)); + l.add((E)parseAnything(session, type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), r.unread(), l, false, pMeta)); state = S2; } } else if (state == S2) { @@ -703,43 +705,6 @@ public class UonParser extends ReaderParser { } } - private Object[] parseArgs(UonParserSession session, ParserReader r, ClassMeta<Object[]> args) throws Exception { - - final int S1=1; // Looking for start of entry - final int S2=2; // Looking for , or ) - - ClassMeta<?>[] argTypes = args.getArgs(); - Object[] o = new Object[argTypes.length]; - int i = 0; - - int c = r.readSkipWs(); - if (c == -1 || c == AMP) - return null; - if (c != '@') - throw new ParseException(session, "Expected '@' at beginning of args array."); - c = r.read(); - - int state = S1; - while (c != -1 && c != AMP) { - c = r.read(); - if (state == S1) { - if (c == ')') - return o; - o[i] = parseAnything(session, argTypes[i], r.unread(), session.getOuter(), false, null); - i++; - state = S2; - } else if (state == S2) { - if (c == ',') { - state = S1; - } else if (c == ')') { - return o; - } - } - } - - throw new ParseException(session, "Did not find ')' at the end of args array."); - } - private static void skipSpace(ParserReader r) throws Exception { int c = 0; while ((c = r.read()) != -1) { @@ -801,7 +766,7 @@ public class UonParser extends ReaderParser { protected Object[] doParseArgs(ParserSession session, ClassMeta<Object[]> args) throws Exception { UonParserSession s = (UonParserSession)session; UonReader r = s.getReader(); - Object[] a = parseArgs(s, r, args); + Object[] a = parseAnything(s, args, r, session.getOuter(), true, null); return a; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/2bc5f59b/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 290a977..d4a8a65 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 @@ -112,17 +112,23 @@ public class UrlEncodingParser extends UonParser { o = session.cast(m, null, eType); else if (m.containsKey("_value")) o = session.convertToType(m.get("_value"), sType); - else if (sType.isCollection() || sType.isArray()) { + else if (sType.isCollection() || sType.isArray() || sType.isArgs()) { // ?1=foo&2=bar... - Collection c2 = (sType.isArray() || ! sType.canCreateNewInstance(outer)) ? new ObjectList(session) : (Collection)sType.newInstance(); + 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.getElementType())); + t.put(Integer.valueOf(k), session.convertToType(e.getValue(), sType.isArgs() ? sType.getArg(argIndex++) : sType.getElementType())); } c2.addAll(t.values()); - o = (sType.isArray() ? ArrayUtils.toArray(c2, sType.getElementType().getInnerClass()) : c2); + 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()); @@ -412,80 +418,6 @@ public class UrlEncodingParser extends UonParser { } } - private Object[] parseArgs(UrlEncodingParserSession session, ParserReader r, ClassMeta<Object[]> args) throws Exception { - - int c = r.peekSkipWs(); - if (c == '?') - r.read(); - - ClassMeta<?>[] argTypes = args.getArgs(); - Object[] vals = new Object[argTypes.length]; - - final int S1=1; // Looking for attrName start. - final int S2=2; // Found attrName end, looking for =. - final int S3=3; // Found =, looking for valStart. - final int S4=4; // Looking for & or end. - boolean isInEscape = false; - - int state = S1; - Integer currIdx = 0; - while (c != -1) { - c = r.read(); - if (! isInEscape) { - if (state == S1) { - if (c == -1) - return vals; - r.unread(); - Object attr = parseAttr(session, r, true); - currIdx = Integer.parseInt(attr.toString()); - if (currIdx >= vals.length) - throw new ParseException(session, "Out-of-range index encountered. args length={0}, index={1}", vals.length, currIdx); - state = S2; - c = 0; // Avoid isInEscape if c was '\' - } else if (state == S2) { - if (c == '\u0002') - state = S3; - else if (c == -1 || c == '\u0001') { - vals[currIdx] = null; - if (c == -1) - return vals; - state = S1; - } - } else if (state == S3) { - if (c == -1 || c == '\u0001') { - vals[currIdx] = convertAttrToType(session, null, "", argTypes[currIdx]); - if (c == -1) - return vals; - state = S1; - } else { - // For performance, we bypass parseAnything for string values. - vals[currIdx] = argTypes[currIdx].isString() ? super.parseString(session, r.unread(), true) : super.parseAnything(session, argTypes[currIdx], r.unread(), null, true, null); - - state = S4; - c = 0; // Avoid isInEscape if c was '\' - } - } else if (state == S4) { - if (c == '\u0001') - state = S1; - else if (c == -1) { - return vals; - } - } - } - isInEscape = (c == '\\' && ! isInEscape); - } - if (state == S1) - throw new ParseException(session, "Could not find attribute name on object."); - if (state == S2) - throw new ParseException(session, "Could not find '=' following attribute name on object."); - if (state == S3) - throw new ParseException(session, "Dangling '=' found in object entry"); - if (state == S4) - throw new ParseException(session, "Could not find end of object."); - - return null; // Unreachable. - } - /** * Parses a single query parameter value into the specified class type. * @@ -583,9 +515,9 @@ public class UrlEncodingParser extends UonParser { @Override /* ReaderParser */ protected Object[] doParseArgs(ParserSession session, ClassMeta<Object[]> args) throws Exception { - UrlEncodingParserSession uctx = (UrlEncodingParserSession)session; - UonReader r = uctx.getReader(); - Object[] a = parseArgs(uctx, r, args); + UrlEncodingParserSession s = (UrlEncodingParserSession)session; + UonReader r = s.getReader(); + Object[] a = parseAnything(s, args, r, session.getOuter()); return a; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/2bc5f59b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java index c2a0c07..69c5baf 100644 --- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java @@ -127,7 +127,7 @@ public class XmlParser extends ReaderParser { m = new ObjectMap(session).append(wrapperAttr, m); o = session.cast(m, pMeta, eType); } else if (jsonType == ARRAY) - o = parseIntoCollection(session, r, new ObjectList(session), object(), pMeta); + o = parseIntoCollection(session, r, new ObjectList(session), null, pMeta); else if (jsonType == STRING) { o = session.getElementText(r); if (sType.isChar()) @@ -153,7 +153,7 @@ public class XmlParser extends ReaderParser { o = new ObjectMap(session).append(wrapperAttr, m); } else if (sType.isCollection()) { Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance(outer) : new ObjectList(session)); - o = parseIntoCollection(session, r, l, sType.getElementType(), pMeta); + o = parseIntoCollection(session, r, l, sType, pMeta); } else if (sType.isNumber()) { o = parseNumber(session.getElementText(r), (Class<? extends Number>)sType.getInnerClass()); } else if (sType.canCreateNewBean(outer)) { @@ -170,8 +170,8 @@ public class XmlParser extends ReaderParser { BeanMap m = session.newBeanMap(outer, sType.getInnerClass()); o = parseIntoBean(session, r, m).getBean(); } - } else if (sType.isArray()) { - ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), pMeta); + } else if (sType.isArray() || sType.isArgs()) { + ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType, pMeta); o = session.toArray(sType, l); } else if (sType.canCreateNewInstanceFromString(outer)) { o = sType.newInstanceFromString(outer, session.getElementText(r)); @@ -228,13 +228,14 @@ public class XmlParser extends ReaderParser { return m; } - private <E> Collection<E> parseIntoCollection(XmlParserSession session, XMLStreamReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception { + private <E> Collection<E> parseIntoCollection(XmlParserSession session, XMLStreamReader r, Collection<E> l, ClassMeta<E> type, BeanPropertyMeta pMeta) throws Exception { int depth = 0; do { + int argIndex = 0; int event = r.nextTag(); if (event == START_ELEMENT) { depth++; - E value = parseAnything(session, elementType, null, r, l, false, pMeta); + E value = (E)parseAnything(session, type == null ? object() : type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), null, r, l, false, pMeta); l.add(value); } else if (event == END_ELEMENT) { depth--; @@ -540,5 +541,6 @@ public class XmlParser extends ReaderParser { protected Object[] doParseArgs(ParserSession session, ClassMeta<Object[]> args) throws Exception { XmlParserSession s = (XmlParserSession)session; return doParseArgs(s, s.getXmlStreamReader(), args); + //return parseAnything(s, args, null, s.getXmlStreamReader(), session.getOuter(), true, null); } }
