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);
 	}
 }