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

Reply via email to