You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/03/29 00:29:43 UTC
incubator-juneau git commit: Fold doParseArgs() methods into
parseAnything() methods.
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 <ja...@apache.org>
Authored: Tue Mar 28 20:29:39 2017 -0400
Committer: JamesBognar <ja...@apache.org>
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);
}
}