Repository: incubator-juneau
Updated Branches:
  refs/heads/master 21f238a42 -> 07dc72995


Introduce Args ClassMeta object to simplify parsers.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/07dc7299
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/07dc7299
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/07dc7299

Branch: refs/heads/master
Commit: 07dc7299571ebd8ed694fefc61b872ffce7e6894
Parents: 21f238a
Author: JamesBognar <[email protected]>
Authored: Tue Mar 28 19:56:54 2017 -0400
Committer: JamesBognar <[email protected]>
Committed: Tue Mar 28 19:56:54 2017 -0400

----------------------------------------------------------------------
 .../java/org/apache/juneau/jena/RdfParser.java  |  2 +-
 .../org/apache/juneau/XmlValidatorParser.java   |  2 +-
 .../java/org/apache/juneau/BeanSession.java     | 14 ++--
 .../main/java/org/apache/juneau/ClassMeta.java  | 83 +++++++++++++++++++-
 .../java/org/apache/juneau/html/HtmlParser.java |  7 +-
 .../java/org/apache/juneau/json/JsonParser.java | 66 +++-------------
 .../apache/juneau/msgpack/MsgPackParser.java    |  9 ++-
 .../java/org/apache/juneau/parser/Parser.java   | 29 +------
 .../java/org/apache/juneau/uon/UonParser.java   |  7 +-
 .../juneau/urlencoding/UrlEncodingParser.java   |  7 +-
 .../apache/juneau/utils/PojoIntrospector.java   |  4 +-
 .../java/org/apache/juneau/xml/XmlParser.java   |  7 +-
 .../rest/remoteable/RemoteableServlet.java      |  3 +-
 13 files changed, 128 insertions(+), 112 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java 
b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
index 3534c7b..ae7b12a 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
@@ -463,7 +463,7 @@ public class RdfParser extends ReaderParser {
        }
 
        @Override /* Parser */
-       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+       protected Object[] doParseArgs(ParserSession session, 
ClassMeta<Object[]> args) throws Exception {
                throw new UnsupportedOperationException("Parser 
'"+getClass().getName()+"' does not support this method.");
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/juneau-core-test/src/test/java/org/apache/juneau/XmlValidatorParser.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/XmlValidatorParser.java 
b/juneau-core-test/src/test/java/org/apache/juneau/XmlValidatorParser.java
index ed182dd..29304a1 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/XmlValidatorParser.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/XmlValidatorParser.java
@@ -55,7 +55,7 @@ public class XmlValidatorParser extends XmlParser {
        }
 
        @Override /* ReaderParser */
-       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+       protected Object[] doParseArgs(ParserSession session, 
ClassMeta<Object[]> args) throws Exception {
                return (Object[])validate(session.getReader());
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
index 1fb0464..0f9e79b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
@@ -596,7 +596,7 @@ public class BeanSession extends Session {
        public final Object toArray(ClassMeta<?> type, Collection<?> list) {
                if (list == null)
                        return null;
-               ClassMeta<?> componentType = type.getElementType();
+               ClassMeta<?> componentType = type.isArgs() ? object() : 
type.getElementType();
                Object array = Array.newInstance(componentType.getInnerClass(), 
list.size());
                int i = 0;
                for (Object o : list) {
@@ -843,18 +843,18 @@ public class BeanSession extends Session {
        }
 
        /**
-        * Given an array of {@link Type} objects, returns an array of 
corresponding {@link ClassMeta} objects.
-        * Constructs a new array on each call.
+        * Given an array of {@link Type} objects, returns a {@link ClassMeta} 
representing those arguments.
+        * Constructs a new meta on each call.
         *
         * @param classes The array of classes to get class metas for.
-        * @return An array of {@link ClassMeta} objects corresponding to the 
classes.  Never <jk>null</jk>.
+        * @return The args {@link ClassMeta} object corresponding to the 
classes.  Never <jk>null</jk>.
         */
-       public final ClassMeta<?>[] getClassMetas(Type[] classes) {
+       public final ClassMeta<Object[]> getArgsClassMeta(Type[] classes) {
                assertFieldNotNull(classes, "classes");
-               ClassMeta<?>[] cm = new ClassMeta<?>[classes.length];
+               ClassMeta[] cm = new ClassMeta<?>[classes.length];
                for (int i = 0; i < classes.length; i++)
                        cm[i] = getClassMeta(classes[i]);
-               return cm;
+               return new ClassMeta(cm);
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java 
b/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
index fa3fed1..397e4e0 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
@@ -54,7 +54,7 @@ public final class ClassMeta<T> implements Type {
 
        /** Class categories. */
        enum ClassCategory {
-               MAP, COLLECTION, CLASS, NUMBER, DECIMAL, BOOLEAN, CHAR, DATE, 
ARRAY, ENUM, OTHER, CHARSEQ, STR, OBJ, URI, BEANMAP, READER, INPUTSTREAM, VOID
+               MAP, COLLECTION, CLASS, NUMBER, DECIMAL, BOOLEAN, CHAR, DATE, 
ARRAY, ENUM, OTHER, CHARSEQ, STR, OBJ, URI, BEANMAP, READER, INPUTSTREAM, VOID, 
ARGS
        }
 
        final Class<T> innerClass;                              // The class 
being wrapped.
@@ -106,6 +106,7 @@ public final class ClassMeta<T> implements Type {
        private final Throwable initException;                  // Any 
exceptions thrown in the init() method.
        private final InvocationHandler invocationHandler;      // The 
invocation handler for this class (if it has one).
        private final BeanRegistry beanRegistry;                // The bean 
registry of this class meta (if it has one).
+       private final ClassMeta<?>[] args;                      // Arg types if 
this is an array of args.
 
        private static final Boolean BOOLEAN_DEFAULT = false;
        private static final Character CHARACTER_DEFAULT = (char)0;
@@ -181,6 +182,7 @@ public final class ClassMeta<T> implements Type {
                this.childUnswapMap = builder.childUnswapMap;
                this.childSwapMap = builder.childSwapMap;
                this.childPojoSwaps = builder.childPojoSwaps;
+               this.args = null;
        }
 
        /**
@@ -227,6 +229,54 @@ public final class ClassMeta<T> implements Type {
                this.extMeta = mainType.extMeta;
                this.initException = mainType.initException;
                this.beanRegistry = mainType.beanRegistry;
+               this.args = null;
+       }
+
+       /**
+        * Constructor for args-arrays.
+        */
+       @SuppressWarnings("unchecked")
+       ClassMeta(ClassMeta<?>[] args) {
+               this.innerClass = (Class<T>) Object[].class;
+               this.args = args;
+               this.implClass = null;
+               this.childPojoSwaps = null;
+               this.childSwapMap = null;
+               this.childUnswapMap = null;
+               this.cc = ARGS;
+               this.fromStringMethod = null;
+               this.noArgConstructor = null;
+               this.stringConstructor = null;
+               this.numberConstructor = null;
+               this.swapConstructor = null;
+               this.swapMethodType = null;
+               this.numberConstructorType = null;
+               this.swapMethod = null;
+               this.unswapMethod = null;
+               this.namePropertyMethod = null;
+               this.parentPropertyMethod = null;
+               this.isDelegate = false;
+               this.isAbstract = false;
+               this.isMemberClass = false;
+               this.primitiveDefault = null;
+               this.remoteableMethods = null;
+               this.proxyableMethods = null;
+               this.publicMethods = null;
+               this.beanContext = null;
+               this.serializedClassMeta = this;
+               this.elementType = null;
+               this.keyType = null;
+               this.valueType = null;
+               this.invocationHandler = null;
+               this.beanMeta = null;
+               this.dictionaryName = null;
+               this.resolvedDictionaryName = null;
+               this.notABeanReason = null;
+               this.pojoSwap = null;
+               this.beanFilter = null;
+               this.extMeta = new MetadataMap();
+               this.initException = null;
+               this.beanRegistry = null;
        }
 
        @SuppressWarnings({"unchecked","rawtypes","hiding"})
@@ -1066,6 +1116,37 @@ public final class ClassMeta<T> implements Type {
        }
 
        /**
+        * Returns <jk>true</jk> if this metadata represents an array of 
argument types.
+        *
+        * @return <jk>true</jk> if this metadata represents an array of 
argument types.
+        */
+       public boolean isArgs() {
+               return cc == ARGS;
+       }
+
+       /**
+        * Returns the argument types of this meta.
+        *
+        * @return The argument types of this meta, or <jk>null</jk> if this 
isn't an array of argument types.
+        */
+       public ClassMeta<?>[] getArgs() {
+               return args;
+       }
+
+       /**
+        * Returns the argument metadata at the specified index if this is an 
args metadata object.
+        *
+        * @param index The argument index.
+        * @return The The argument metadata.  Never <jk>null</jk>.
+        * @throws BeanRuntimeException If this metadata object is not a list 
of arguments, or the index is out of range.
+        */
+       public ClassMeta<?> getArg(int index) {
+               if (args != null && index >= 0 && index < args.length)
+                       return args[index];
+               throw new BeanRuntimeException("Invalid argument index 
specified:  {0}.  Only {1} arguments are defined.", index, args == null ? 0 : 
args.length);
+       }
+
+       /**
         * Returns <jk>true</jk> if instance of this object can be 
<jk>null</jk>.
         * <p>
         * Objects can be <jk>null</jk>, but primitives cannot, except for 
chars which can be represented

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/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 94132e6..8ff0ffc 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,8 +355,9 @@ public class HtmlParser extends XmlParser {
         * Precondition:  Must be pointing at event following <ul> event.
         * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
         */
-       private Object[] parseArgs(HtmlParserSession session, XMLStreamReader 
r, ClassMeta<?>[] argTypes) throws Exception {
+       private Object[] parseArgs(HtmlParserSession session, XMLStreamReader 
r, ClassMeta<Object[]> args) throws Exception {
                HtmlTag tag = HtmlTag.forEvent(r);
+               ClassMeta<?>[] argTypes = args.getArgs();
 
                // Special case:
                // Serializing args containing a single bean (or multiple beans 
of the same type) will end up serialized as a <table _type='array'>
@@ -599,8 +600,8 @@ public class HtmlParser extends XmlParser {
        }
 
        @Override /* ReaderParser */
-       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+       protected Object[] doParseArgs(ParserSession session, 
ClassMeta<Object[]> args) throws Exception {
                HtmlParserSession s = (HtmlParserSession)session;
-               return parseArgs(s, s.getXmlStreamReader(), argTypes);
+               return parseArgs(s, s.getXmlStreamReader(), args);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
index 173a5ec..080e073 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
@@ -194,7 +194,7 @@ public class JsonParser extends ReaderParser {
                                o = session.cast(m, pMeta, eType);
                        } else {
                                Collection l = 
(sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new 
ObjectList(session));
-                               o = parseIntoCollection2(session, r, l, 
sType.getElementType(), pMeta);
+                               o = parseIntoCollection2(session, r, l, sType, 
pMeta);
                        }
                } else if (sType.canCreateNewBean(outer)) {
                        BeanMap m = session.newBeanMap(outer, 
sType.getInnerClass());
@@ -203,13 +203,13 @@ public class JsonParser extends ReaderParser {
                        o = sType.newInstanceFromString(outer, 
parseString(session, r));
                } else if (sType.canCreateNewInstanceFromNumber(outer) && 
StringUtils.isFirstNumberChar((char)c)) {
                        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);
                                parseIntoMap2(session, r, m, string(), 
object(), pMeta);
                                o = session.cast(m, pMeta, eType);
                        } else {
-                               ArrayList l = 
(ArrayList)parseIntoCollection2(session, r, new ArrayList(), 
sType.getElementType(), pMeta);
+                               ArrayList l = 
(ArrayList)parseIntoCollection2(session, r, new ArrayList(), sType, pMeta);
                                o = session.toArray(sType, l);
                        }
                } else if (c == '{') {
@@ -399,13 +399,15 @@ public class JsonParser extends ReaderParser {
                throw new ParseException(session, "Could not find the end of 
the field name.");
        }
 
-       private <E> Collection<E> parseIntoCollection2(JsonParserSession 
session, ParserReader r, Collection<E> l, ClassMeta<E> elementType, 
BeanPropertyMeta pMeta) throws Exception {
+       private <E> Collection<E> parseIntoCollection2(JsonParserSession 
session, ParserReader r, Collection<E> l, ClassMeta<?> type, BeanPropertyMeta 
pMeta) throws Exception {
 
                int S0=0; // Looking for outermost [
                int S1=1; // Looking for starting [ or { or " or ' or LITERAL 
or ]
                int S2=2; // Looking for , or ]
                int S3=3; // Looking for starting [ or { or " or ' or LITERAL
 
+               int argIndex = 0;
+
                int state = S0;
                int c = 0;
                while (c != -1) {
@@ -419,7 +421,7 @@ public class JsonParser extends ReaderParser {
                                } else if (session.isCommentOrWhitespace(c)) {
                                        skipCommentsAndSpace(session, 
r.unread());
                                } else if (c != -1) {
-                                       l.add(parseAnything(session, 
elementType, r.unread(), l, pMeta));
+                                       l.add((E)parseAnything(session, 
type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), r.unread(), l, 
pMeta));
                                        state = S2;
                                }
                        } else if (state == S2) {
@@ -438,7 +440,7 @@ public class JsonParser extends ReaderParser {
                                } else if (c == ']') {
                                        break;
                                } else if (c != -1) {
-                                       l.add(parseAnything(session, 
elementType, r.unread(), l, pMeta));
+                                       l.add((E)parseAnything(session, 
type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), r.unread(), l, 
pMeta));
                                        state = S2;
                                }
                        }
@@ -455,52 +457,6 @@ public class JsonParser extends ReaderParser {
                return null;  // Unreachable.
        }
 
-       private Object[] parseArgs(JsonParserSession session, ParserReader r, 
ClassMeta<?>[] argTypes) throws Exception {
-
-               int S0=0; // Looking for outermost [
-               int S1=1; // Looking for starting [ or { or " or ' or LITERAL
-               int S2=2; // Looking for , or ]
-
-               Object[] o = new Object[argTypes.length];
-               int i = 0;
-
-               int state = S0;
-               int c = 0;
-               while (c != -1) {
-                       c = r.read();
-                       if (state == S0) {
-                               if (c == '[')
-                                       state = S1;
-                       } else if (state == S1) {
-                               if (c == ']') {
-                                       return o;
-                               } else if (session.isCommentOrWhitespace(c)) {
-                                       skipCommentsAndSpace(session, 
r.unread());
-                               } else {
-                                       o[i] = parseAnything(session, 
argTypes[i], r.unread(), session.getOuter(), null);
-                                       i++;
-                                       state = S2;
-                               }
-                       } else if (state == S2) {
-                               if (c == ',') {
-                                       state = S1;
-                               } else if (session.isCommentOrWhitespace(c)) {
-                                       skipCommentsAndSpace(session, 
r.unread());
-                               } else if (c == ']') {
-                                       return o;
-                               }
-                       }
-               }
-               if (state == S0)
-                       throw new ParseException(session, "Expected '[' at 
beginning of JSON array.");
-               if (state == S1)
-                       throw new ParseException(session, "Expected one of the 
following characters: {,[,',\",LITERAL.");
-               if (state == S2)
-                       throw new ParseException(session, "Expected ',' or 
']'.");
-
-               return null;  // Unreachable.
-       }
-
        private <T> BeanMap<T> parseIntoBeanMap2(JsonParserSession session, 
ParserReader r, BeanMap<T> m) throws Exception {
 
                int S0=0; // Looking for outer {
@@ -835,16 +791,16 @@ public class JsonParser extends ReaderParser {
        protected <E> Collection<E> doParseIntoCollection(ParserSession 
session, Collection<E> c, Type elementType) throws Exception {
                JsonParserSession s = (JsonParserSession)session;
                ParserReader r = s.getReader();
-               c = parseIntoCollection2(s, r, c, 
(ClassMeta<E>)s.getClassMeta(elementType), null);
+               c = parseIntoCollection2(s, r, c, s.getClassMeta(elementType), 
null);
                validateEnd(s, r);
                return c;
        }
 
        @Override /* ReaderParser */
-       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+       protected Object[] doParseArgs(ParserSession session, 
ClassMeta<Object[]> args) throws Exception {
                JsonParserSession s = (JsonParserSession)session;
                ParserReader r = s.getReader();
-               Object[] a = parseArgs(s, r, argTypes);
+               Object[] a = parseAnything(s, args, r, session.getOuter(), 
null);
                validateEnd(s, r);
                return a;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/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 77e0b9c..9abc288 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
@@ -196,8 +196,9 @@ public class MsgPackParser extends InputStreamParser {
                return (T)o;
        }
 
-       private Object[] parseArgs(MsgPackParserSession session, 
MsgPackInputStream is, ClassMeta<?>[] argTypes) throws Exception {
+       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();
@@ -213,7 +214,7 @@ public class MsgPackParser extends InputStreamParser {
                return o;
        }
 
-       
+
        
//--------------------------------------------------------------------------------
        // Entry point methods
        
//--------------------------------------------------------------------------------
@@ -232,10 +233,10 @@ public class MsgPackParser extends InputStreamParser {
        }
 
        @Override /* ReaderParser */
-       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+       protected Object[] doParseArgs(ParserSession session, 
ClassMeta<Object[]> args) throws Exception {
                MsgPackParserSession s = (MsgPackParserSession)session;
                MsgPackInputStream is = s.getInputStream();
-               Object[] a = parseArgs(s, is, argTypes);
+               Object[] a = parseArgs(s, is, args);
                return a;
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java 
b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
index bb79146..d338c97 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
@@ -482,35 +482,12 @@ public abstract class Parser extends CoreObject {
         * @return An array of parsed objects.
         * @throws ParseException If the input contains a syntax error or is 
malformed, or is not valid for the specified type.
         */
-       public final Object[] parseArgs(Object input, ClassMeta<?>[] argTypes) 
throws ParseException {
-               if (argTypes == null || argTypes.length == 0)
-                       return new Object[0];
-               ParserSession session = createSession(input);
-               try {
-                       return doParseArgs(session, argTypes);
-               } catch (ParseException e) {
-                       throw e;
-               } catch (Exception e) {
-                       throw new ParseException(session, e);
-               } finally {
-                       session.close();
-               }
-       }
-
-       /**
-        * Same as {@link #parseArgs(Object, ClassMeta[])} except allows you to 
pass in {@link Class} objects.
-        *
-        * @param input The input.  Subclasses can support different input 
types.
-        * @param argTypes Specifies the type of objects to create for each 
entry in the array.
-        * @return An array of parsed objects.
-        * @throws ParseException If the input contains a syntax error or is 
malformed, or is not valid for the specified type.
-        */
        public final Object[] parseArgs(Object input, Type[] argTypes) throws 
ParseException {
                if (argTypes == null || argTypes.length == 0)
                        return new Object[0];
                ParserSession session = createSession(input);
                try {
-                       return doParseArgs(session, 
session.getClassMetas(argTypes));
+                       return doParseArgs(session, 
session.getArgsClassMeta(argTypes));
                } catch (ParseException e) {
                        throw e;
                } catch (Exception e) {
@@ -525,12 +502,12 @@ public abstract class Parser extends CoreObject {
         * Default implementation throws an {@link 
UnsupportedOperationException}.
         * @param session The runtime session object returned by {@link 
#createSession(Object, ObjectMap, Method, Object, Locale, TimeZone, MediaType)}.
         * If <jk>null</jk>, one will be created using {@link 
#createSession(Object)}.
-        * @param argTypes Specifies the type of objects to create for each 
entry in the array.
+        * @param args Specifies the metadata on the type of objects to create 
for each entry in the array.
         *
         * @return An array of parsed objects.
         * @throws Exception If thrown from underlying stream, or if the input 
contains a syntax error or is malformed.
         */
-       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+       protected Object[] doParseArgs(ParserSession session, 
ClassMeta<Object[]> args) throws Exception {
                throw new UnsupportedOperationException("Parser 
'"+getClass().getName()+"' does not support this method.");
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/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 817811d..a884ccc 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
@@ -703,11 +703,12 @@ public class UonParser extends ReaderParser {
                }
        }
 
-       private Object[] parseArgs(UonParserSession session, ParserReader r, 
ClassMeta<?>[] argTypes) throws Exception {
+       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;
 
@@ -797,10 +798,10 @@ public class UonParser extends ReaderParser {
        }
 
        @Override /* ReaderParser */
-       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+       protected Object[] doParseArgs(ParserSession session, 
ClassMeta<Object[]> args) throws Exception {
                UonParserSession s = (UonParserSession)session;
                UonReader r = s.getReader();
-               Object[] a = parseArgs(s, r, argTypes);
+               Object[] a = parseArgs(s, r, args);
                return a;
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/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 89d68ea..290a977 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
@@ -412,12 +412,13 @@ public class UrlEncodingParser extends UonParser {
                }
        }
 
-       private Object[] parseArgs(UrlEncodingParserSession session, 
ParserReader r, ClassMeta<?>[] argTypes) throws Exception {
+       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.
@@ -581,10 +582,10 @@ public class UrlEncodingParser extends UonParser {
        }
 
        @Override /* ReaderParser */
-       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+       protected Object[] doParseArgs(ParserSession session, 
ClassMeta<Object[]> args) throws Exception {
                UrlEncodingParserSession uctx = 
(UrlEncodingParserSession)session;
                UonReader r = uctx.getReader();
-               Object[] a = parseArgs(uctx, r, argTypes);
+               Object[] a = parseArgs(uctx, r, args);
                return a;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/juneau-core/src/main/java/org/apache/juneau/utils/PojoIntrospector.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/utils/PojoIntrospector.java 
b/juneau-core/src/main/java/org/apache/juneau/utils/PojoIntrospector.java
index 415e203..f7eb6d4 100644
--- a/juneau-core/src/main/java/org/apache/juneau/utils/PojoIntrospector.java
+++ b/juneau-core/src/main/java/org/apache/juneau/utils/PojoIntrospector.java
@@ -15,7 +15,6 @@ package org.apache.juneau.utils;
 import java.io.*;
 import java.lang.reflect.*;
 
-import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
@@ -79,8 +78,7 @@ public final class PojoIntrospector {
        public Object invokeMethod(Method method, Reader args) throws 
InvocationTargetException, IllegalArgumentException, IllegalAccessException, 
ParseException, IOException {
                if (o == null)
                        return null;
-               ClassMeta<?>[] argTypes = 
p.getBeanContext().createSession().getClassMetas(method.getParameterTypes());
-               Object[] params = args == null ? null : p.parseArgs(args, 
argTypes);
+               Object[] params = args == null ? null : p.parseArgs(args, 
method.getGenericParameterTypes());
                return method.invoke(o, params);
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/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 69d3da1..c2a0c07 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
@@ -244,8 +244,9 @@ public class XmlParser extends ReaderParser {
                return l;
        }
 
-       private Object[] doParseArgs(XmlParserSession session, XMLStreamReader 
r, ClassMeta<?>[] argTypes) throws Exception {
+       private Object[] doParseArgs(XmlParserSession session, XMLStreamReader 
r, ClassMeta<Object[]> args) throws Exception {
                int depth = 0;
+               ClassMeta<?>[] argTypes = args.getArgs();
                Object[] o = new Object[argTypes.length];
                int i = 0;
                do {
@@ -536,8 +537,8 @@ public class XmlParser extends ReaderParser {
        }
 
        @Override /* ReaderParser */
-       protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] 
argTypes) throws Exception {
+       protected Object[] doParseArgs(ParserSession session, 
ClassMeta<Object[]> args) throws Exception {
                XmlParserSession s = (XmlParserSession)session;
-               return doParseArgs(s, s.getXmlStreamReader(), argTypes);
+               return doParseArgs(s, s.getXmlStreamReader(), args);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/07dc7299/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java
 
b/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java
index c6bc0f4..55f3c8d 100644
--- 
a/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java
+++ 
b/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java
@@ -115,8 +115,7 @@ public abstract class RemoteableServlet extends 
RestServletDefault {
                        throw new RestException(SC_NOT_FOUND, "Method not 
found"); //$NON-NLS-1$
 
                // Parse the args and invoke the method.
-               ClassMeta<?>[] argTypes = 
req.getBeanSession().getClassMetas(m.getGenericParameterTypes());
-               Object[] params = p.parseArgs(req.getReader(), argTypes);
+               Object[] params = p.parseArgs(req.getReader(), 
m.getGenericParameterTypes());
                return m.invoke(service, params);
        }
 

Reply via email to