Repository: incubator-juneau Updated Branches: refs/heads/master 2bc5f59b9 -> 89e052626
Fold parseArgs() into parseAnything on HtmlParser. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/89e05262 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/89e05262 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/89e05262 Branch: refs/heads/master Commit: 89e05262600163c5da52a57ccd38bab7c64e050e Parents: 2bc5f59 Author: JamesBognar <[email protected]> Authored: Wed Mar 29 14:17:50 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Wed Mar 29 14:17:50 2017 -0400 ---------------------------------------------------------------------- .../java/org/apache/juneau/html/HtmlParser.java | 74 +++++++------------- 1 file changed, 25 insertions(+), 49 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/89e05262/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 c20ed2c..fe85937 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 @@ -209,11 +209,11 @@ public class HtmlParser extends XmlParser { } else if (typeName.equals("array")) { if (sType.isObject()) - o = parseTableIntoCollection(session, r, (Collection)new ObjectList(session), sType.getElementType(), pMeta); + o = parseTableIntoCollection(session, r, (Collection)new ObjectList(session), sType, pMeta); else if (sType.isCollection()) - o = parseTableIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(session)), sType.getElementType(), pMeta); - else if (sType.isArray()) { - ArrayList l = (ArrayList)parseTableIntoCollection(session, r, new ArrayList(), sType.getElementType(), pMeta); + o = parseTableIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(session)), sType, pMeta); + else if (sType.isArray() || sType.isArgs()) { + ArrayList l = (ArrayList)parseTableIntoCollection(session, r, new ArrayList(), sType, pMeta); o = session.toArray(sType, l); } else @@ -231,11 +231,11 @@ public class HtmlParser extends XmlParser { sType = eType = cm; if (sType.isObject()) - o = parseIntoCollection(session, r, (Collection)new ObjectList(session), sType.getElementType(), pMeta); + o = parseIntoCollection(session, r, new ObjectList(session), sType, pMeta); else if (sType.isCollection() || sType.isObject()) - o = parseIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(session)), sType.getElementType(), pMeta); - else if (sType.isArray()) - o = session.toArray(sType, parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), pMeta)); + o = parseIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(session)), sType, pMeta); + else if (sType.isArray() || sType.isArgs()) + o = session.toArray(sType, parseIntoCollection(session, r, new ArrayList(), sType, pMeta)); else isValid = false; skipTag(r, xUL); @@ -340,54 +340,24 @@ 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 <E> Collection<E> parseIntoCollection(HtmlParserSession session, XMLStreamReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception { + private <E> Collection<E> parseIntoCollection(HtmlParserSession session, XMLStreamReader r, Collection<E> l, ClassMeta<?> type, BeanPropertyMeta pMeta) throws Exception { + int argIndex = 0; while (true) { HtmlTag tag = nextTag(r, LI, xUL); if (tag == xUL) break; - l.add(parseAnything(session, elementType, r, l, false, pMeta)); + ClassMeta<?> elementType = type.isArgs() ? type.getArg(argIndex++) : type.getElementType(); + l.add((E)parseAnything(session, elementType, r, l, false, pMeta)); } return l; } /* - * Reads contents of <ul> element into an Object array. - * 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(); - - // Special case: - // Serializing args containing a single bean (or multiple beans of the same type) will end up serialized as a <table _type='array'> - if (tag == TABLE) { - List<Object> l = (List<Object>)parseAnything(session, session.getClassMeta(List.class, argTypes[0]), r, session.getOuter(), true, null); - return l.toArray(new Object[l.size()]); - } - - Object[] o = new Object[argTypes.length]; - int i = 0; - while (true) { - tag = nextTag(r, LI, xUL); - if (tag == xUL) - break; - o[i] = parseAnything(session, argTypes[i], r, session.getOuter(), false, null); - i++; - } - return o; - } - - /* * Reads contents of <ul> element. * Precondition: Must be pointing at event following <ul> event. * Postcondition: Pointing at next START_ELEMENT or END_DOCUMENT event. */ - private <E> Collection<E> parseTableIntoCollection(HtmlParserSession session, XMLStreamReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception { - - if (elementType == null) - elementType = (ClassMeta<E>)object(); + private <E> Collection<E> parseTableIntoCollection(HtmlParserSession session, XMLStreamReader r, Collection<E> l, ClassMeta<E> type, BeanPropertyMeta pMeta) throws Exception { HtmlTag tag = nextTag(r, TR); List<String> keys = new ArrayList<String>(); @@ -398,16 +368,22 @@ public class HtmlParser extends XmlParser { keys.add(session.getElementText(r)); } + int argIndex = 0; + while (true) { r.nextTag(); tag = HtmlTag.forEvent(r); if (tag == xTABLE) break; - String type = getAttribute(r, session.getBeanTypePropertyName(), null); - ClassMeta elementType2 = session.getClassMeta(type, pMeta, null); - if (elementType2 != null) - elementType = elementType2; + ClassMeta elementType = null; + String beanType = getAttribute(r, session.getBeanTypePropertyName(), null); + if (beanType != null) + elementType = session.getClassMeta(beanType, pMeta, null); + if (elementType == null) + elementType = type.isArgs() ? type.getArg(argIndex++) : type.getElementType(); + if (elementType == null) + elementType = session.object(); if (elementType.canCreateNewBean(l)) { BeanMap m = session.newBeanMap(l, elementType.getInnerClass()); @@ -597,12 +573,12 @@ public class HtmlParser extends XmlParser { @Override /* ReaderParser */ protected <E> Collection<E> doParseIntoCollection(ParserSession session, Collection<E> c, Type elementType) throws Exception { HtmlParserSession s = (HtmlParserSession)session; - return parseIntoCollection(s, s.getXmlStreamReader(), c, (ClassMeta<E>)s.getClassMeta(elementType), null); + return parseIntoCollection(s, s.getXmlStreamReader(), c, s.getClassMeta(elementType), null); } @Override /* ReaderParser */ protected Object[] doParseArgs(ParserSession session, ClassMeta<Object[]> args) throws Exception { HtmlParserSession s = (HtmlParserSession)session; - return parseArgs(s, s.getXmlStreamReader(), args); + return parseAnything(s, args, s.getXmlStreamReader(), s.getOuter(), true, null); } }
