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