HTML and XML serialization support improvements.

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

Branch: refs/heads/master
Commit: 4fb01038a29a86539bf8ea4ca1bbba4ec8c76175
Parents: 615190a
Author: JamesBognar <[email protected]>
Authored: Sat Jan 21 17:24:51 2017 -0500
Committer: JamesBognar <[email protected]>
Committed: Sat Jan 21 17:24:51 2017 -0500

----------------------------------------------------------------------
 .../java/org/apache/juneau/client/package.html  |    2 +-
 .../java/org/apache/juneau/BeanContext.java     |   20 +-
 .../java/org/apache/juneau/BeanDictionary.java  |   88 +-
 .../apache/juneau/BeanDictionaryBuilder.java    |   73 -
 .../main/java/org/apache/juneau/BeanMeta.java   |   55 +-
 .../org/apache/juneau/BeanPropertyMeta.java     |  163 +-
 .../java/org/apache/juneau/BeanRegistry.java    |  144 ++
 .../java/org/apache/juneau/BeanSession.java     |   36 +-
 .../main/java/org/apache/juneau/ClassMeta.java  |   63 +-
 .../main/java/org/apache/juneau/ObjectMap.java  |   12 +-
 .../java/org/apache/juneau/annotation/Bean.java |   15 +
 .../apache/juneau/annotation/BeanProperty.java  |    3 +-
 .../org/apache/juneau/dto/atom/AtomBuilder.java |  224 +++
 .../org/apache/juneau/dto/atom/Category.java    |   23 +-
 .../java/org/apache/juneau/dto/atom/Common.java |   25 +-
 .../org/apache/juneau/dto/atom/CommonEntry.java |  155 +-
 .../org/apache/juneau/dto/atom/Content.java     |   47 +-
 .../java/org/apache/juneau/dto/atom/Entry.java  |  109 +-
 .../java/org/apache/juneau/dto/atom/Feed.java   |  114 +-
 .../org/apache/juneau/dto/atom/Generator.java   |   36 +-
 .../java/org/apache/juneau/dto/atom/Icon.java   |   40 +-
 .../java/org/apache/juneau/dto/atom/Id.java     |   19 +-
 .../java/org/apache/juneau/dto/atom/Link.java   |   34 +-
 .../java/org/apache/juneau/dto/atom/Logo.java   |   41 +-
 .../java/org/apache/juneau/dto/atom/Person.java |   40 +-
 .../java/org/apache/juneau/dto/atom/Source.java |   89 +-
 .../java/org/apache/juneau/dto/atom/Text.java   |   76 +-
 .../java/org/apache/juneau/dto/atom/Utils.java  |   49 +
 .../org/apache/juneau/dto/atom/package.html     |   83 +-
 .../java/org/apache/juneau/dto/html5/A.java     |  118 ++
 .../java/org/apache/juneau/dto/html5/Abbr.java  |   58 +
 .../org/apache/juneau/dto/html5/Address.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Area.java  |  138 ++
 .../org/apache/juneau/dto/html5/Article.java    |   96 +
 .../java/org/apache/juneau/dto/html5/Aside.java |   52 +
 .../java/org/apache/juneau/dto/html5/Audio.java |  127 ++
 .../java/org/apache/juneau/dto/html5/B.java     |   52 +
 .../java/org/apache/juneau/dto/html5/Base.java  |   61 +
 .../java/org/apache/juneau/dto/html5/Bdi.java   |   45 +
 .../java/org/apache/juneau/dto/html5/Bdo.java   |   58 +
 .../org/apache/juneau/dto/html5/Blockquote.java |   63 +
 .../java/org/apache/juneau/dto/html5/Body.java  |  118 ++
 .../java/org/apache/juneau/dto/html5/Br.java    |   39 +
 .../org/apache/juneau/dto/html5/Button.java     |  184 ++
 .../org/apache/juneau/dto/html5/Canvas.java     |   61 +
 .../org/apache/juneau/dto/html5/Caption.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Cite.java  |   52 +
 .../java/org/apache/juneau/dto/html5/Code.java  |   52 +
 .../java/org/apache/juneau/dto/html5/Col.java   |   50 +
 .../org/apache/juneau/dto/html5/Colgroup.java   |   57 +
 .../java/org/apache/juneau/dto/html5/Data.java  |   63 +
 .../org/apache/juneau/dto/html5/Datalist.java   |   46 +
 .../java/org/apache/juneau/dto/html5/Dd.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Del.java   |   74 +
 .../java/org/apache/juneau/dto/html5/Dfn.java   |   52 +
 .../java/org/apache/juneau/dto/html5/Div.java   |   52 +
 .../java/org/apache/juneau/dto/html5/Dl.java    |   46 +
 .../java/org/apache/juneau/dto/html5/Dt.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Em.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Embed.java |   83 +
 .../org/apache/juneau/dto/html5/Fieldset.java   |   85 +
 .../org/apache/juneau/dto/html5/Figcaption.java |   52 +
 .../org/apache/juneau/dto/html5/Figure.java     |   46 +
 .../org/apache/juneau/dto/html5/Footer.java     |   52 +
 .../java/org/apache/juneau/dto/html5/Form.java  |  141 ++
 .../java/org/apache/juneau/dto/html5/H1.java    |   52 +
 .../java/org/apache/juneau/dto/html5/H2.java    |   52 +
 .../java/org/apache/juneau/dto/html5/H3.java    |   52 +
 .../java/org/apache/juneau/dto/html5/H4.java    |   52 +
 .../java/org/apache/juneau/dto/html5/H5.java    |   52 +
 .../java/org/apache/juneau/dto/html5/H6.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Head.java  |   46 +
 .../org/apache/juneau/dto/html5/Header.java     |   52 +
 .../java/org/apache/juneau/dto/html5/Hr.java    |   39 +
 .../java/org/apache/juneau/dto/html5/Html.java  |   57 +
 .../juneau/dto/html5/HtmlBeanDictionary.java    |  139 ++
 .../apache/juneau/dto/html5/HtmlBuilder.java    | 1845 +++++++++++++++++
 .../apache/juneau/dto/html5/HtmlElement.java    |  673 +++++++
 .../juneau/dto/html5/HtmlElementContainer.java  |   59 +
 .../juneau/dto/html5/HtmlElementEmpty.java      |   19 +
 .../juneau/dto/html5/HtmlElementMixed.java      |   62 +
 .../juneau/dto/html5/HtmlElementText.java       |   45 +
 .../java/org/apache/juneau/dto/html5/I.java     |   52 +
 .../org/apache/juneau/dto/html5/Iframe.java     |  118 ++
 .../java/org/apache/juneau/dto/html5/Img.java   |  115 ++
 .../java/org/apache/juneau/dto/html5/Input.java |  391 ++++
 .../java/org/apache/juneau/dto/html5/Ins.java   |   74 +
 .../java/org/apache/juneau/dto/html5/Kbd.java   |   52 +
 .../org/apache/juneau/dto/html5/Keygen.java     |  105 +
 .../java/org/apache/juneau/dto/html5/Label.java |   74 +
 .../org/apache/juneau/dto/html5/Legend.java     |   52 +
 .../java/org/apache/juneau/dto/html5/Li.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Link.java  |  116 ++
 .../java/org/apache/juneau/dto/html5/Main.java  |   46 +
 .../java/org/apache/juneau/dto/html5/Map.java   |   57 +
 .../java/org/apache/juneau/dto/html5/Mark.java  |   52 +
 .../java/org/apache/juneau/dto/html5/Meta.java  |   83 +
 .../java/org/apache/juneau/dto/html5/Meter.java |  118 ++
 .../java/org/apache/juneau/dto/html5/Nav.java   |   52 +
 .../org/apache/juneau/dto/html5/Noscript.java   |   53 +
 .../org/apache/juneau/dto/html5/Object2.java    |  140 ++
 .../java/org/apache/juneau/dto/html5/Ol.java    |   79 +
 .../org/apache/juneau/dto/html5/Optgroup.java   |   68 +
 .../org/apache/juneau/dto/html5/Option.java     |   89 +
 .../org/apache/juneau/dto/html5/Output.java     |   85 +
 .../java/org/apache/juneau/dto/html5/P.java     |   52 +
 .../java/org/apache/juneau/dto/html5/Param.java |   61 +
 .../java/org/apache/juneau/dto/html5/Pre.java   |   52 +
 .../org/apache/juneau/dto/html5/Progress.java   |   74 +
 .../java/org/apache/juneau/dto/html5/Q.java     |   63 +
 .../java/org/apache/juneau/dto/html5/Rb.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Rp.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Rt.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Rtc.java   |   52 +
 .../java/org/apache/juneau/dto/html5/Ruby.java  |   52 +
 .../java/org/apache/juneau/dto/html5/S.java     |   52 +
 .../java/org/apache/juneau/dto/html5/Samp.java  |   52 +
 .../org/apache/juneau/dto/html5/Script.java     |  118 ++
 .../org/apache/juneau/dto/html5/Section.java    |   52 +
 .../org/apache/juneau/dto/html5/Select.java     |  123 ++
 .../java/org/apache/juneau/dto/html5/Small.java |   52 +
 .../org/apache/juneau/dto/html5/Source.java     |   61 +
 .../java/org/apache/juneau/dto/html5/Span.java  |   52 +
 .../org/apache/juneau/dto/html5/Strong.java     |   52 +
 .../java/org/apache/juneau/dto/html5/Style.java |   74 +
 .../java/org/apache/juneau/dto/html5/Sub.java   |   52 +
 .../java/org/apache/juneau/dto/html5/Sup.java   |   52 +
 .../java/org/apache/juneau/dto/html5/Table.java |   57 +
 .../java/org/apache/juneau/dto/html5/Tbody.java |   46 +
 .../java/org/apache/juneau/dto/html5/Td.java    |   85 +
 .../org/apache/juneau/dto/html5/Template.java   |   52 +
 .../org/apache/juneau/dto/html5/Textarea.java   |  210 ++
 .../java/org/apache/juneau/dto/html5/Tfoot.java |   46 +
 .../java/org/apache/juneau/dto/html5/Th.java    |  118 ++
 .../java/org/apache/juneau/dto/html5/Thead.java |   46 +
 .../java/org/apache/juneau/dto/html5/Time.java  |   63 +
 .../java/org/apache/juneau/dto/html5/Title.java |   45 +
 .../java/org/apache/juneau/dto/html5/Tr.java    |   46 +
 .../java/org/apache/juneau/dto/html5/Track.java |   94 +
 .../java/org/apache/juneau/dto/html5/U.java     |   52 +
 .../java/org/apache/juneau/dto/html5/Ul.java    |   52 +
 .../java/org/apache/juneau/dto/html5/Var.java   |   52 +
 .../java/org/apache/juneau/dto/html5/Video.java |  160 ++
 .../java/org/apache/juneau/dto/html5/Wbr.java   |   39 +
 .../org/apache/juneau/dto/html5/package.html    |   41 +
 .../apache/juneau/dto/jsonschema/Schema.java    |    1 +
 .../java/org/apache/juneau/html/HtmlParser.java |  522 ++---
 .../apache/juneau/html/HtmlParserContext.java   |    4 +-
 .../apache/juneau/html/HtmlParserSession.java   |   22 +-
 .../juneau/html/HtmlSchemaDocSerializer.java    |    6 +-
 .../org/apache/juneau/html/HtmlSerializer.java  |  269 ++-
 .../java/org/apache/juneau/html/HtmlWriter.java |    7 +-
 .../org/apache/juneau/html/dto/proto/A.java     |   54 -
 .../org/apache/juneau/html/dto/proto/Abbr.java  |   23 -
 .../apache/juneau/html/dto/proto/Address.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Area.java  |   23 -
 .../apache/juneau/html/dto/proto/Article.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Aside.java |   23 -
 .../org/apache/juneau/html/dto/proto/Audio.java |   23 -
 .../org/apache/juneau/html/dto/proto/B.java     |   23 -
 .../org/apache/juneau/html/dto/proto/Base.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Bdi.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Bdo.java   |   23 -
 .../juneau/html/dto/proto/Blockquote.java       |   23 -
 .../org/apache/juneau/html/dto/proto/Body.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Br.java    |   23 -
 .../apache/juneau/html/dto/proto/Button.java    |   23 -
 .../apache/juneau/html/dto/proto/Canvas.java    |   23 -
 .../apache/juneau/html/dto/proto/Caption.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Cite.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Code.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Col.java   |   23 -
 .../apache/juneau/html/dto/proto/Colgroup.java  |   23 -
 .../apache/juneau/html/dto/proto/Command.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Data.java  |   23 -
 .../apache/juneau/html/dto/proto/Datalist.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Dd.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Del.java   |   23 -
 .../apache/juneau/html/dto/proto/Details.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Dfn.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Div.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Dl.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Dt.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Em.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Embed.java |   23 -
 .../apache/juneau/html/dto/proto/Fieldset.java  |   23 -
 .../juneau/html/dto/proto/Figcaption.java       |   23 -
 .../apache/juneau/html/dto/proto/Figure.java    |   23 -
 .../apache/juneau/html/dto/proto/Footer.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Form.java  |   23 -
 .../org/apache/juneau/html/dto/proto/H1.java    |   23 -
 .../org/apache/juneau/html/dto/proto/H2.java    |   23 -
 .../org/apache/juneau/html/dto/proto/H3.java    |   23 -
 .../org/apache/juneau/html/dto/proto/H4.java    |   23 -
 .../org/apache/juneau/html/dto/proto/H5.java    |   23 -
 .../org/apache/juneau/html/dto/proto/H6.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Head.java  |   23 -
 .../apache/juneau/html/dto/proto/Header.java    |   23 -
 .../apache/juneau/html/dto/proto/Hgroup.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Hr.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Html.java  |   23 -
 .../juneau/html/dto/proto/HtmlElement.java      | 1298 ------------
 .../juneau/html/dto/proto/HtmlSchema.java       |   27 -
 .../org/apache/juneau/html/dto/proto/I.java     |   23 -
 .../apache/juneau/html/dto/proto/IFrame.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Img.java   |   38 -
 .../org/apache/juneau/html/dto/proto/Input.java |   23 -
 .../org/apache/juneau/html/dto/proto/Ins.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Kbd.java   |   23 -
 .../apache/juneau/html/dto/proto/Keygen.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Label.java |   23 -
 .../apache/juneau/html/dto/proto/Legend.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Li.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Link.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Main.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Map.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Mark.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Menu.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Meta.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Meter.java |   23 -
 .../org/apache/juneau/html/dto/proto/Nav.java   |   23 -
 .../apache/juneau/html/dto/proto/Noscript.java  |   23 -
 .../apache/juneau/html/dto/proto/Object.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Ol.java    |   23 -
 .../apache/juneau/html/dto/proto/Optgroup.java  |   23 -
 .../apache/juneau/html/dto/proto/Option.java    |   23 -
 .../apache/juneau/html/dto/proto/Output.java    |   23 -
 .../org/apache/juneau/html/dto/proto/P.java     |   23 -
 .../org/apache/juneau/html/dto/proto/Param.java |   23 -
 .../org/apache/juneau/html/dto/proto/Pre.java   |   23 -
 .../apache/juneau/html/dto/proto/Progress.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Q.java     |   23 -
 .../org/apache/juneau/html/dto/proto/Rb.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Rp.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Rt.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Rtc.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Ruby.java  |   23 -
 .../org/apache/juneau/html/dto/proto/S.java     |   23 -
 .../org/apache/juneau/html/dto/proto/Samp.java  |   23 -
 .../apache/juneau/html/dto/proto/Script.java    |   23 -
 .../apache/juneau/html/dto/proto/Section.java   |   23 -
 .../apache/juneau/html/dto/proto/Select.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Small.java |   23 -
 .../apache/juneau/html/dto/proto/Source.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Span.java  |   23 -
 .../apache/juneau/html/dto/proto/Strong.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Style.java |   23 -
 .../org/apache/juneau/html/dto/proto/Sub.java   |   23 -
 .../apache/juneau/html/dto/proto/Summary.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Sup.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Table.java |   23 -
 .../org/apache/juneau/html/dto/proto/Tbody.java |   23 -
 .../org/apache/juneau/html/dto/proto/Td.java    |   23 -
 .../apache/juneau/html/dto/proto/Template.java  |   23 -
 .../apache/juneau/html/dto/proto/Textarea.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Tfoot.java |   23 -
 .../org/apache/juneau/html/dto/proto/Th.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Thead.java |   23 -
 .../org/apache/juneau/html/dto/proto/Time.java  |   23 -
 .../org/apache/juneau/html/dto/proto/Title.java |   23 -
 .../org/apache/juneau/html/dto/proto/Tr.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Track.java |   23 -
 .../org/apache/juneau/html/dto/proto/U.java     |   23 -
 .../org/apache/juneau/html/dto/proto/Ul.java    |   23 -
 .../org/apache/juneau/html/dto/proto/Var.java   |   23 -
 .../org/apache/juneau/html/dto/proto/Video.java |   23 -
 .../org/apache/juneau/html/dto/proto/Wbr.java   |   23 -
 .../apache/juneau/html/dto/proto/package.html   |   41 -
 .../org/apache/juneau/html/dto/proto/temp.txt   |  154 --
 .../java/org/apache/juneau/html/package.html    |  518 ++++-
 .../org/apache/juneau/internal/ClassUtils.java  |   88 +
 .../apache/juneau/internal/DelegateList.java    |    7 +-
 .../org/apache/juneau/internal/FilteredMap.java |   16 +-
 .../java/org/apache/juneau/jena/RdfParser.java  |    6 +-
 .../apache/juneau/jena/RdfParserSession.java    |    2 +-
 .../org/apache/juneau/jena/RdfSerializer.java   |    4 +-
 .../java/org/apache/juneau/jena/package.html    |    2 +-
 .../java/org/apache/juneau/json/JsonParser.java |   10 +-
 .../juneau/json/JsonSchemaSerializer.java       |    6 +-
 .../org/apache/juneau/json/JsonSerializer.java  |    2 +-
 .../java/org/apache/juneau/json/package.html    |    2 +-
 .../apache/juneau/msgpack/MsgPackParser.java    |   10 +-
 .../main/java/org/apache/juneau/package.html    |    2 -
 .../java/org/apache/juneau/parser/Parser.java   |    2 +-
 .../juneau/plaintext/PlainTextParser.java       |    2 +-
 .../juneau/serializer/SerializerSession.java    |   11 +-
 .../juneau/serializer/SerializerWriter.java     |   13 +
 .../org/apache/juneau/transform/MapSwap.java    |   35 +
 .../org/apache/juneau/transform/PojoSwap.java   |   53 +-
 .../org/apache/juneau/transform/StringSwap.java |   35 +
 .../org/apache/juneau/transform/package.html    |   11 +-
 .../juneau/transforms/BeanStringSwap.java       |    4 +-
 .../juneau/transforms/ByteArrayBase64Swap.java  |    2 +-
 .../apache/juneau/transforms/CalendarSwap.java  |    2 +-
 .../org/apache/juneau/transforms/DateSwap.java  |    2 +-
 .../transforms/XMLGregorianCalendarSwap.java    |    2 +-
 .../apache/juneau/urlencoding/UonParser.java    |   12 +-
 .../juneau/urlencoding/UrlEncodingParser.java   |    6 +-
 .../urlencoding/UrlEncodingParserSession.java   |    2 +-
 .../UrlEncodingSerializerSession.java           |    4 +-
 .../org/apache/juneau/urlencoding/package.html  |    2 +-
 .../java/org/apache/juneau/utils/PojoQuery.java |    8 +-
 .../java/org/apache/juneau/xml/XmlBeanMeta.java |  204 +-
 .../apache/juneau/xml/XmlBeanPropertyMeta.java  |   25 +-
 .../org/apache/juneau/xml/XmlClassMeta.java     |    4 +-
 .../apache/juneau/xml/XmlContentHandler.java    |  137 --
 .../java/org/apache/juneau/xml/XmlParser.java   |  178 +-
 .../org/apache/juneau/xml/XmlParserContext.java |   52 +-
 .../org/apache/juneau/xml/XmlParserSession.java |   64 +-
 .../apache/juneau/xml/XmlSchemaSerializer.java  |  149 +-
 .../org/apache/juneau/xml/XmlSerializer.java    |  411 ++--
 .../apache/juneau/xml/XmlSerializerContext.java |  103 +-
 .../apache/juneau/xml/XmlSerializerSession.java |   42 +-
 .../java/org/apache/juneau/xml/XmlUtils.java    |   47 +-
 .../org/apache/juneau/xml/annotation/Xml.java   |   11 +-
 .../apache/juneau/xml/annotation/XmlFormat.java |   87 +-
 .../java/org/apache/juneau/xml/package.html     | 1849 +++++++++++++-----
 juneau-core/src/main/javadoc/overview.html      |   59 +-
 .../src/main/javadoc/resources/juneau-code.css  |    2 +
 .../java/org/apache/juneau/BeanConfigTest.java  |    6 +-
 .../java/org/apache/juneau/JacocoDummyTest.java |    2 +-
 .../java/org/apache/juneau/PojoSwapTest.java    |    2 +-
 .../test/java/org/apache/juneau/TestUtils.java  |    2 +-
 .../a/rttests/RoundTripAddClassAttrsTest.java   |    2 +-
 .../a/rttests/RoundTripLargeObjectsTest.java    |    4 +-
 .../juneau/a/rttests/RoundTripMapsTest.java     |    6 +-
 .../apache/juneau/a/rttests/RoundTripTest.java  |    4 +-
 .../a/rttests/RoundTripTransformBeansTest.java  |    2 +-
 .../org/apache/juneau/dto/atom/AtomTest.java    |  205 +-
 .../apache/juneau/dto/cognos/CognosXmlTest.java |    9 +-
 .../juneau/dto/html/BasicHtmlSchemaTest.java    |  156 ++
 .../juneau/dto/jsonschema/JsonSchemaTest.java   |  106 +-
 .../org/apache/juneau/html/BasicHtmlTest.java   | 1614 +++++++++++++++
 .../java/org/apache/juneau/html/CommonTest.java |  148 +-
 .../java/org/apache/juneau/html/HtmlTest.java   |   24 +-
 .../org/apache/juneau/json/JsonParserTest.java  |    6 -
 .../apache/juneau/transforms/BeanMapTest.java   |    4 +-
 .../juneau/transforms/CalendarSwapTest.java     |   18 +-
 .../apache/juneau/utils/FilteredMapTest.java    |   11 +-
 .../org/apache/juneau/xml/BasicXmlTest.java     | 1505 ++++++++++++++
 .../org/apache/juneau/xml/CommonParserTest.java |    4 +-
 .../java/org/apache/juneau/xml/CommonTest.java  |   33 +-
 .../org/apache/juneau/xml/CommonXmlTest.java    |    2 +-
 .../apache/juneau/xml/InvalidXmlBeansTest.java  |  230 +++
 .../org/apache/juneau/xml/XmlCollapsedTest.java |   44 +-
 .../org/apache/juneau/xml/XmlContentTest.java   |   84 +-
 .../java/org/apache/juneau/xml/XmlTest.java     |  229 ++-
 .../src/test/resources/dto/atom/test1.xml       |   61 -
 .../src/test/resources/dto/atom/test2.xml       |   61 -
 .../src/test/resources/dto/atom/test3.xml       |   61 -
 .../test/resources/dto/jsonschema/test1.json    |   89 -
 .../test/resources/dto/jsonschema/test2.json    |   32 -
 .../test/resources/json/BrokenCognosOutput.json |   13 -
 juneau-core/src/test/resources/log4j.properties |   40 -
 .../resources/xml/testComparisonWithJson.json   |   29 -
 .../resources/xml/testComparisonWithJson.xml    |   32 -
 .../src/test/resources/xml/testNamespaces.xml   |   32 -
 .../juneau/server/samples/AtomFeedResource.java |   64 +-
 .../server/samples/TumblrParserResource.java    |    4 +-
 .../server/samples/addressbook/ClientTest.java  |    2 +-
 .../apache/juneau/server/samples/TestUtils.java |    2 +-
 .../juneau/server/test/InheritanceResource.java |    6 +-
 .../juneau/server/test/MessagesResource.java    |    2 +-
 .../juneau/server/test/TransformsResource.java  |    6 +-
 .../org/apache/juneau/server/RestRequest.java   |    2 +-
 .../org/apache/juneau/server/RestResponse.java  |    2 +-
 .../org/apache/juneau/server/RestServlet.java   |    2 +-
 .../juneau/server/remoteable/package.html       |    2 +-
 368 files changed, 19604 insertions(+), 7245 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-client/src/main/java/org/apache/juneau/client/package.html
----------------------------------------------------------------------
diff --git a/juneau-client/src/main/java/org/apache/juneau/client/package.html 
b/juneau-client/src/main/java/org/apache/juneau/client/package.html
index aa4a893..54067df 100755
--- a/juneau-client/src/main/java/org/apache/juneau/client/package.html
+++ b/juneau-client/src/main/java/org/apache/juneau/client/package.html
@@ -799,7 +799,7 @@
                </p>
                <ul class='spaced-list'>
                        <li>The method must be public.
-                       <li>The parameter and return types must be <a 
href='../../../../org/apache/juneau/package-summary.html#PojoCategories'>serializable
 and parsable</a>.
+                       <li>The parameter and return types must be <a 
href='../../../../overview-summary.html#Core.PojoCategories'>serializable and 
parsable</a>.
                </ul>
                <p>
                        One significant feature is that the remoteable services 
servlet is a full-blown REST interface.  

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
index 0a6f3d3..69d7542 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
@@ -855,9 +855,8 @@ public class BeanContext extends Context {
         * <p>
         * This list can consist of the following class types:
         * <ul>
-        *      <li>Any bean class that specifies a value for {@link 
Bean#typeName() @Bean.typeName()};
-        *      <li>Any subclass of {@link BeanDictionaryBuilder} that defines 
an entire subset of mappings.
-        *              Note that the subclass MUST implement a no-arg 
constructor so that it can be instantiated.
+        *      <li>Any bean class that specifies a value for {@link 
Bean#typeName() @Bean.typeName()}.
+        *      <li>Any collection of bean classes above.
         * </ul>
         */
        public static final String BEAN_beanDictionary = 
"BeanContext.beanDictionary.list";
@@ -1023,11 +1022,11 @@ public class BeanContext extends Context {
                beanMethodVisibility,
                beanFieldVisibility;
 
-       final Class<?>[] notBeanClasses;
+       final Class<?>[] notBeanClasses, beanDictionaryClasses;
        final String[] notBeanPackageNames, notBeanPackagePrefixes;
        final BeanFilter[] beanFilters;
        final PojoSwap<?,?>[] pojoSwaps;
-       final BeanDictionary beanDictionary;
+       final BeanRegistry beanRegistry;
        final Map<Class<?>,Class<?>> implClasses;
        final Class<?>[] implKeyClasses, implValueClasses;
        final ClassLoader classLoader;
@@ -1148,7 +1147,8 @@ public class BeanContext extends Context {
                this.cmObject = cmCache.get(Object.class);
                this.cmClass = cmCache.get(Class.class);
 
-               beanDictionary = new 
BeanDictionaryBuilder().add(pm.get(BEAN_beanDictionary, Class[].class, new 
Class[0])).setBeanContext(this).build();
+               this.beanDictionaryClasses = pm.get(BEAN_beanDictionary, 
Class[].class, new Class[0]);
+               this.beanRegistry = new BeanRegistry(this, null);
        }
 
        /**
@@ -1794,12 +1794,12 @@ public class BeanContext extends Context {
        }
 
        /**
-        * Returns the bean dictionary defined in this bean context defined by 
{@link BeanContext#BEAN_beanDictionary}.
+        * Returns the bean registry defined in this bean context defined by 
{@link BeanContext#BEAN_beanDictionary}.
         *
-        * @return The bean dictionary defined in this bean context.  Never 
<jk>null</jk>.
+        * @return The bean registry defined in this bean context.  Never 
<jk>null</jk>.
         */
-       protected final BeanDictionary getBeanDictionary() {
-               return beanDictionary;
+       protected final BeanRegistry getBeanRegistry() {
+               return beanRegistry;
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
index 053e021..333ef6d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
@@ -17,87 +17,31 @@ import java.util.*;
 import org.apache.juneau.annotation.*;
 
 /**
- * A lookup table for resolving bean types by name.
- * <p>
- * In a nutshell, provides a simple mapping of bean class objects to 
identifying names.
- * <p>
- * Class names are defined through the {@link Bean#typeName()} annotation.
- * <p>
- * The dictionary is used by the framework in the following ways:
- * <ul>
- *     <li>If a class type cannot be inferred through reflection during 
parsing, then a helper <js>"_type"</js> is added to the serialized output
- *             using the name defined for that class in this dictionary.  This 
helps determine the real class at parse time.
- *     <li>The dictionary name is used as element names when serialized to XML.
- * </ul>
+ * Represents a collection of bean classes that make up a bean dictionary.
  */
-public class BeanDictionary {
-
-       private final Map<String,ClassMeta<?>> map;
-       private final BeanContext beanContext;
-       private final String beanTypePropertyName;
-
-       BeanDictionary(BeanDictionaryBuilder builder) {
-               this.beanContext = builder.beanContext;
-               this.beanTypePropertyName = 
beanContext.getBeanTypePropertyName();
-               Map<String,ClassMeta<?>> m1 = new 
HashMap<String,ClassMeta<?>>();
-               for (Map.Entry<String,Class<?>> e : builder.map.entrySet()) {
-                       ClassMeta<?> cm = 
beanContext.getClassMeta(e.getValue());
-                       if (! cm.isBean())
-                               throw new BeanRuntimeException("Invalid class 
type passed to dictionary.  ''{0}'' is not a bean.", cm);
-                       m1.put(e.getKey(), cm);
-               }
-               this.map = Collections.unmodifiableMap(m1);
-       }
-
-       /**
-        * Converts the specified object map into a bean if it contains a 
<js>"_type"</js> entry in it.
-        *
-        * @param m The object map to convert to a bean if possible.
-        * @return The new bean, or the original <code>ObjectMap</code> if no 
<js>"_type"</js> entry was found.
-        */
-       public Object cast(ObjectMap m) {
-               Object o = m.get(beanTypePropertyName);
-               if (o == null)
-                       return m;
-               String typeName = o.toString();
-               ClassMeta<?> cm = getClassMeta(typeName);
-               BeanMap<?> bm = 
m.getBeanSession().newBeanMap(cm.getInnerClass());
-
-               // Iterate through all the entries in the map and set the 
individual field values.
-               for (Map.Entry<String,Object> e : m.entrySet()) {
-                       String k = e.getKey();
-                       Object v = e.getValue();
-                       if (! k.equals(beanTypePropertyName)) {
-                               // Attempt to recursively cast child maps.
-                               if (v instanceof ObjectMap)
-                                       v = cast((ObjectMap)v);
-                               bm.put(k, v);
-                       }
-               }
-               return bm.getBean();
-       }
+public class BeanDictionary extends ArrayList<Class<?>> {
+       private static final long serialVersionUID = 1L;
 
        /**
-        * Gets the class metadata for the specified bean type name.
+        * Constructor.
         *
-        * @param typeName The bean type name as defined by {@link 
Bean#typeName()}.
-        * @return The class metadata for the bean.
-        * @throws BeanRuntimeException If name wasn't found in this dictionary.
+        * @param c The list of bean classes to add to this dictionary.
+        *      Classes must either specify a {@link Bean#typeName()} value or 
be another subclass of <code>BeanDictionary</code>.
         */
-       public ClassMeta<?> getClassMeta(String typeName) {
-               ClassMeta<?> cm = map.get(typeName);
-               if (cm == null)
-                       throw new BeanRuntimeException("Could not find bean 
type ''{0}'' in dictionary.", typeName);
-               return cm;
+       public BeanDictionary(Class<?>...c) {
+               append(c);
        }
 
        /**
-        * Returns <jk>true</jk> if this dictionary has an entry for the 
specified type name.
+        * Append one or more bean classes to this bean dictionary.
         *
-        * @param typeName The bean type name.
-        * @return <jk>true</jk> if this dictionary has an entry for the 
specified type name.
+        * @param c The list of bean classes to add to this dictionary.
+        *      Classes must either specify a {@link Bean#typeName()} value or 
be another subclass of <code>BeanDictionary</code>.
+        * @return This object (for method chaining).
         */
-       public boolean hasName(String typeName) {
-               return map.containsKey(typeName);
+       public BeanDictionary append(Class<?>...c) {
+               for (Class<?> cc : c)
+                       add(cc);
+               return this;
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
deleted file mode 100644
index 349ca80..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
+++ /dev/null
@@ -1,73 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau;
-
-import java.util.*;
-
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.internal.*;
-
-/**
- * Utility class for creating {@link BeanDictionary} objects.
- * <p>
- * This class is a programmatic equivalent to the {@link 
BeanProperty#beanDictionary()} annotation and {@link 
BeanContext#BEAN_beanDictionary} property.
- * It allows bean dictionaries to be constructed
- */
-public class BeanDictionaryBuilder {
-
-       Map<String,Class<?>> map = new HashMap<String,Class<?>>();
-       BeanContext beanContext;
-
-       /**
-        * Add the specified classes to this type dictionary.
-        * <p>
-        * Classes can be of the following types:
-        * <ul>
-        *      <li>Bean classes.
-        *      <li>Subclasses of {@link BeanDictionaryBuilder} that identify 
an entire set of mappings.
-        * </ul>
-        *
-        * @param classes The classes to add to this dictionary builder.
-        * @return This object (for method chaining).
-        */
-       public BeanDictionaryBuilder add(Class<?>...classes) {
-               for (Class<?> c : classes) {
-                       if (c != null) {
-                               if 
(ClassUtils.isParentClass(BeanDictionaryBuilder.class, c)) {
-                                       try {
-                                               BeanDictionaryBuilder l2 = 
(BeanDictionaryBuilder)c.newInstance();
-                                               for (Map.Entry<String,Class<?>> 
e : l2.map.entrySet())
-                                                       map.put(e.getKey(), 
e.getValue());
-                                       } catch (Exception e) {
-                                               throw new 
BeanRuntimeException(e);
-                                       }
-                               } else {
-                                       Bean b = c.getAnnotation(Bean.class);
-                                       if (b == null || b.typeName().isEmpty())
-                                               throw new 
BeanRuntimeException("Class ''{0}'' was passed to TypeDictionaryBuilder but it 
doesn't have a @Bean.typeName() annotation defined.", c.getName());
-                                       map.put(b.typeName(), c);
-                               }
-                       }
-               }
-               return this;
-       }
-
-       BeanDictionaryBuilder setBeanContext(BeanContext beanContext) {
-               this.beanContext = beanContext;
-               return this;
-       }
-
-       BeanDictionary build() {
-               return new BeanDictionary(this);
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
index 6ab27a5..6b1b63d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
@@ -92,6 +92,7 @@ public class BeanMeta<T> {
        private final BeanPropertyMeta typeProperty;                        // 
"_type" mock bean property.
        private final String dictionaryName;                                // 
The @Bean.typeName() annotation defined on this bean class.
        final String notABeanReason;                                        // 
Readable string explaining why this class wasn't a bean.
+       final BeanRegistry beanRegistry;
 
        /**
         * Constructor.
@@ -119,10 +120,10 @@ public class BeanMeta<T> {
                this.constructorArgs = b.constructorArgs;
                this.extMeta = b.extMeta;
                this.subTypeProperty = b.subTypeIdProperty;
-               this.typeProperty = new BeanPropertyMeta(this, 
ctx.getBeanTypePropertyName(), ctx.string());
+               this.beanRegistry = b.beanRegistry;
+               this.typeProperty = new BeanPropertyMeta(this, 
ctx.getBeanTypePropertyName(), ctx.string(), beanRegistry);
        }
 
-
        private static final class Builder<T> {
                ClassMeta<T> classMeta;
                BeanContext ctx;
@@ -137,6 +138,7 @@ public class BeanMeta<T> {
                MetadataMap extMeta = new MetadataMap();
                BeanPropertyMeta subTypeIdProperty;
                PropertyNamer propertyNamer;
+               BeanRegistry beanRegistry;
 
                private Builder(ClassMeta<T> classMeta, BeanContext ctx, 
BeanFilter beanFilter, String[] pNames) {
                        this.classMeta = classMeta;
@@ -156,6 +158,15 @@ public class BeanMeta<T> {
                                        mVis = ctx.beanMethodVisibility,
                                        fVis = ctx.beanFieldVisibility;
 
+                               List<Class<?>> bdClasses = new 
ArrayList<Class<?>>();
+                               Bean bean = 
classMeta.innerClass.getAnnotation(Bean.class);
+                               if (bean != null) {
+                                       
bdClasses.addAll(Arrays.asList(bean.beanDictionary()));
+                                       if (! bean.typeName().isEmpty())
+                                               
bdClasses.add(classMeta.innerClass);
+                               }
+                               this.beanRegistry = new BeanRegistry(ctx, null, 
bdClasses.toArray(new Class<?>[bdClasses.size()]));
+
                                // If @Bean.interfaceClass is specified on the 
parent class, then we want
                                // to use the properties defined on that class, 
not the subclass.
                                Class<?> c2 = (beanFilter != null && 
beanFilter.getInterfaceClass() != null ? beanFilter.getInterfaceClass() : c);
@@ -287,7 +298,7 @@ public class BeanMeta<T> {
                                for (Iterator<BeanPropertyMeta> i = 
normalProps.values().iterator(); i.hasNext();) {
                                        BeanPropertyMeta p = i.next();
                                        try {
-                                               if (p.validate(ctx, 
typeVarImpls)) {
+                                               if (p.validate(ctx, 
beanRegistry, typeVarImpls)) {
 
                                                        if (p.getGetter() != 
null)
                                                                
getterProps.put(p.getGetter(), p.getName());
@@ -326,7 +337,7 @@ public class BeanMeta<T> {
 
                                if (beanFilter != null && 
beanFilter.getSubTypeProperty() != null) {
                                        String subTypeProperty = 
beanFilter.getSubTypeProperty();
-                                       this.subTypeIdProperty = new 
SubTypePropertyMeta(beanMeta, subTypeProperty, beanFilter.getSubTypes(), 
normalProps.remove(subTypeProperty));
+                                       this.subTypeIdProperty = new 
SubTypePropertyMeta(beanMeta, subTypeProperty, beanFilter.getSubTypes(), 
normalProps.remove(subTypeProperty), beanRegistry);
                                        properties.put(subTypeProperty, 
this.subTypeIdProperty);
                                }
 
@@ -518,7 +529,7 @@ public class BeanMeta<T> {
                for (Class<?> c2 : findClasses(c, stopClass)) {
                        for (Method m : c2.getDeclaredMethods()) {
                                int mod = m.getModifiers();
-                               if (Modifier.isStatic(mod) || 
Modifier.isTransient(mod))
+                               if (Modifier.isStatic(mod))
                                        continue;
                                if (m.isAnnotationPresent(BeanIgnore.class))
                                        continue;
@@ -530,19 +541,29 @@ public class BeanMeta<T> {
                                Class<?>[] pt = m.getParameterTypes();
                                Class<?> rt = m.getReturnType();
                                boolean isGetter = false, isSetter = false;
-                               if (pt.length == 1 && n.startsWith("set") && 
(isParentClass(rt, c) || rt.equals(Void.TYPE))) {
-                                       isSetter = true;
-                                       n = n.substring(3);
-                               } else if (pt.length == 0 && 
n.startsWith("get") && (! rt.equals(Void.TYPE))) {
-                                       isGetter = true;
-                                       n = n.substring(3);
-                               } else if (pt.length == 0 && n.startsWith("is") 
&& (rt.equals(Boolean.TYPE) || rt.equals(Boolean.class))) {
-                                       isGetter = true;
-                                       n = n.substring(2);
+                               BeanProperty bp = 
m.getAnnotation(BeanProperty.class);
+                               if (pt.length == 0) {
+                                       if (n.startsWith("get") && (! 
rt.equals(Void.TYPE))) {
+                                               isGetter = true;
+                                               n = n.substring(3);
+                                       } else if (n.startsWith("is") && 
(rt.equals(Boolean.TYPE) || rt.equals(Boolean.class))) {
+                                               isGetter = true;
+                                               n = n.substring(2);
+                                       } else if (bp != null && ! 
bp.name().isEmpty()) {
+                                               isGetter = true;
+                                               n = bp.name();
+                                       }
+                               } else if (pt.length == 1) {
+                                       if (n.startsWith("set") && 
(isParentClass(rt, c) || rt.equals(Void.TYPE))) {
+                                               isSetter = true;
+                                               n = n.substring(3);
+                                       } else if (bp != null && ! 
bp.name().isEmpty()) {
+                                               isSetter = true;
+                                               n = bp.name();
+                                       }
                                }
                                n = pn.getPropertyName(n);
                                if (isGetter || isSetter) {
-                                       BeanProperty bp = 
m.getAnnotation(BeanProperty.class);
                                        if (bp != null && ! 
bp.name().equals("")) {
                                                n = bp.name();
                                                if (! fixedBeanProps.isEmpty())
@@ -728,8 +749,8 @@ public class BeanMeta<T> {
                private BeanPropertyMeta realProperty;  // Bean property if 
bean actually has a real subtype field.
                private BeanMeta<?> beanMeta;
 
-               SubTypePropertyMeta(BeanMeta beanMeta, String subTypeAttr, 
Map<Class<?>,String> subTypes, BeanPropertyMeta realProperty) {
-                       super(beanMeta, subTypeAttr, beanMeta.ctx.string());
+               SubTypePropertyMeta(BeanMeta beanMeta, String subTypeAttr, 
Map<Class<?>,String> subTypes, BeanPropertyMeta realProperty, BeanRegistry 
beanRegistry) {
+                       super(beanMeta, subTypeAttr, beanMeta.ctx.string(), 
beanRegistry);
                        this.subTypes = subTypes;
                        this.realProperty = realProperty;
                        this.beanMeta = beanMeta;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 6d3a8cd..ce7fdb5 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -57,7 +57,7 @@ public class BeanPropertyMeta {
        private PojoSwap swap;                     // PojoSwap defined only via 
@BeanProperty annotation.
 
        private MetadataMap extMeta = new MetadataMap();  // Extended metadata
-       private BeanDictionary beanDictionary;
+       BeanRegistry beanRegistry;
 
        /**
         * Constructor.
@@ -71,9 +71,10 @@ public class BeanPropertyMeta {
                this.name = name;
        }
 
-       BeanPropertyMeta(BeanMeta<?> beanMeta, String name, ClassMeta<?> 
rawTypeMeta) {
+       BeanPropertyMeta(BeanMeta<?> beanMeta, String name, ClassMeta<?> 
rawTypeMeta, BeanRegistry beanRegistry) {
                this(beanMeta, name);
                this.rawTypeMeta = rawTypeMeta;
+               this.beanRegistry = beanRegistry;
        }
 
        BeanPropertyMeta(BeanMeta<?> beanMeta, String name, Method getter, 
Method setter) {
@@ -150,11 +151,10 @@ public class BeanPropertyMeta {
         *      <li>Dictionary defined via {@link 
BeanProperty#beanDictionary()}.
         *      <li>Dictionary defined via {@link 
BeanContext#BEAN_beanDictionary} context property.
         * </ol>
-        *
         * @return The bean dictionary in use for this bean property.  Never 
<jk>null</jk>.
         */
-       public BeanDictionary getBeanDictionary() {
-               return beanDictionary == null ? beanContext.getBeanDictionary() 
: beanDictionary;
+       public BeanRegistry getBeanRegistry() {
+               return beanRegistry;
        }
 
        /**
@@ -239,7 +239,9 @@ public class BeanPropertyMeta {
                return extMeta.get(c, this);
        }
 
-       boolean validate(BeanContext f, Map<Class<?>,Class<?>[]> typeVarImpls) 
throws Exception {
+       boolean validate(BeanContext f, BeanRegistry parentBeanRegistry, 
Map<Class<?>,Class<?>[]> typeVarImpls) throws Exception {
+
+               List<Class<?>> bdClasses = new ArrayList<Class<?>>();
 
                if (field == null && getter == null)
                        return false;
@@ -255,8 +257,7 @@ public class BeanPropertyMeta {
                                swap = getPropertyPojoSwap(p);
                                if (! p.properties().isEmpty())
                                        properties = 
StringUtils.split(p.properties(), ',');
-                               if (p.beanDictionary().length > 0)
-                                       this.beanDictionary = new 
BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(beanContext).build();
+                               
bdClasses.addAll(Arrays.asList(p.beanDictionary()));
                        }
                }
 
@@ -270,8 +271,7 @@ public class BeanPropertyMeta {
                                        swap = getPropertyPojoSwap(p);
                                if (properties != null && ! 
p.properties().isEmpty())
                                        properties = 
StringUtils.split(p.properties(), ',');
-                               if (p.beanDictionary().length > 0)
-                                       this.beanDictionary = new 
BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(beanContext).build();
+                               
bdClasses.addAll(Arrays.asList(p.beanDictionary()));
                        }
                }
 
@@ -285,14 +285,15 @@ public class BeanPropertyMeta {
                                swap = getPropertyPojoSwap(p);
                                if (properties != null && ! 
p.properties().isEmpty())
                                        properties = 
StringUtils.split(p.properties(), ',');
-                               if (p.beanDictionary().length > 0)
-                                       this.beanDictionary = new 
BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(beanContext).build();
+                               
bdClasses.addAll(Arrays.asList(p.beanDictionary()));
                        }
                }
 
                if (rawTypeMeta == null)
                        return false;
 
+               this.beanRegistry = new BeanRegistry(beanContext, 
parentBeanRegistry, bdClasses.toArray(new Class<?>[0]));
+
                // Do some annotation validation.
                Class<?> c = rawTypeMeta.getInnerClass();
                if (getter != null && ! isParentClass(getter.getReturnType(), 
c))
@@ -327,9 +328,6 @@ public class BeanPropertyMeta {
         */
        public Object get(BeanMap<?> m) {
                try {
-
-                       BeanSession session = m.getBeanSession();
-
                        // Read-only beans have their properties stored in a 
cache until getBean() is called.
                        Object bean = m.bean;
                        if (bean == null)
@@ -346,13 +344,31 @@ public class BeanPropertyMeta {
                        else if (field != null)
                                o = field.get(bean);
 
+                       return toSerializedForm(m.getBeanSession(), o);
+
+               } catch (Throwable e) {
+                       if (beanContext.ignoreInvocationExceptionsOnGetters) {
+                               if (rawTypeMeta.isPrimitive())
+                                       return 
rawTypeMeta.getPrimitiveDefault();
+                               return null;
+                       }
+                       throw new BeanRuntimeException(beanMeta.c, "Exception 
occurred while getting property ''{0}''", name).initCause(e);
+               }
+       }
+
+       /**
+        * Converts a raw bean property value to serialized form.
+        * Applies transforms and child property filters.
+        */
+       final Object toSerializedForm(BeanSession session, Object o) {
+               try {
                        o = transform(session, o);
                        if (o == null)
                                return null;
                        if (properties != null) {
                                if (rawTypeMeta.isArray()) {
                                        Object[] a = (Object[])o;
-                                       List l = new ArrayList(a.length);
+                                       List l = new DelegateList(rawTypeMeta);
                                        ClassMeta childType = 
rawTypeMeta.getElementType();
                                        for (Object c : a)
                                                
l.add(applyChildPropertiesFilter(session, childType, c));
@@ -371,13 +387,6 @@ public class BeanPropertyMeta {
                        return o;
                } catch (SerializeException e) {
                        throw new BeanRuntimeException(e);
-               } catch (Throwable e) {
-                       if (beanContext.ignoreInvocationExceptionsOnGetters) {
-                               if (rawTypeMeta.isPrimitive())
-                                       return 
rawTypeMeta.getPrimitiveDefault();
-                               return null;
-                       }
-                       throw new BeanRuntimeException(beanMeta.c, "Exception 
occurred while getting property ''{0}''", name).initCause(e);
                }
        }
 
@@ -685,9 +694,9 @@ public class BeanPropertyMeta {
                                        // Copy any existing array values into 
the temporary list.
                                        Object oldArray;
                                if (getter != null)
-                                               oldArray = getter.invoke(bean, 
(Object[])null);
+                                       oldArray = getter.invoke(bean, 
(Object[])null);
                                else if (field != null)
-                                               oldArray = field.get(bean);
+                                       oldArray = field.get(bean);
                                else
                                        throw new 
BeanRuntimeException(beanMeta.c, "Attempt to append to array property ''{0}'', 
but no getter or field defined.", name);
                                        ArrayUtils.copyToList(oldArray, l);
@@ -705,6 +714,106 @@ public class BeanPropertyMeta {
        }
 
        /**
+        * Adds a value to a {@link Map} or bean property.
+        *
+        * @param m The bean of the field being set.
+        * @param key The key to add to the field.
+        * @param value The value to add to the field.
+        * @throws BeanRuntimeException If field is not a map or array.
+        */
+       public void add(BeanMap<?> m, String key, Object value) throws 
BeanRuntimeException {
+
+               // Read-only beans get their properties stored in a cache.
+               if (m.bean == null) {
+                       if (! m.propertyCache.containsKey(name))
+                               m.propertyCache.put(name, new 
ObjectMap(m.getBeanSession()));
+                       
((ObjectMap)m.propertyCache.get(name)).append(key.toString(), value);
+                       return;
+               }
+
+               BeanSession session = m.getBeanSession();
+
+               boolean isMap = rawTypeMeta.isMap();
+               boolean isBean = rawTypeMeta.isBean();
+
+               if (! (isBean || isMap))
+                       throw new BeanRuntimeException(beanMeta.c, "Attempt to 
add key/value to property ''{0}'' which is not a map or bean", name);
+
+               Object bean = m.getBean(true);
+
+               ClassMeta<?> elementType = rawTypeMeta.getElementType();
+
+               try {
+                       Object v = session.convertToType(value, elementType);
+
+                       if (isMap) {
+                               Map map = null;
+                               if (getter != null) {
+                                       map = (Map)getter.invoke(bean, 
(Object[])null);
+                               } else if (field != null) {
+                                       map = (Map)field.get(bean);
+                               } else {
+                                       throw new 
BeanRuntimeException(beanMeta.c, "Attempt to append to map property ''{0}'', 
but no getter or field defined.", name);
+                               }
+
+                               if (map != null) {
+                                       map.put(key, v);
+                                       return;
+                               }
+
+                               if (rawTypeMeta.canCreateNewInstance())
+                                       map = (Map)rawTypeMeta.newInstance();
+                               else
+                                       map = new ObjectMap(session);
+
+                               map.put(key, v);
+
+                               if (setter != null)
+                                       setter.invoke(bean, map);
+                               else if (field != null)
+                                       field.set(bean, map);
+                               else
+                                       throw new 
BeanRuntimeException(beanMeta.c, "Attempt to initialize map property ''{0}'', 
but no setter or field defined.", name);
+
+                       } else /* isBean() */ {
+
+                               Object b = null;
+                               if (getter != null) {
+                                       b = getter.invoke(bean, (Object[])null);
+                               } else if (field != null) {
+                                       b = field.get(bean);
+                               } else {
+                                       throw new 
BeanRuntimeException(beanMeta.c, "Attempt to append to bean property ''{0}'', 
but no getter or field defined.", name);
+                               }
+
+                               if (b != null) {
+                                       BeanMap bm = session.toBeanMap(b);
+                                       bm.put(key, v);
+                                       return;
+                               }
+
+                               if 
(rawTypeMeta.canCreateNewInstance(m.getBean(false))) {
+                                       b = rawTypeMeta.newInstance();
+                                       BeanMap bm = session.toBeanMap(b);
+                                       bm.put(key, v);
+                               }
+
+                               if (setter != null)
+                                       setter.invoke(bean, b);
+                               else if (field != null)
+                                       field.set(bean, b);
+                               else
+                                       throw new 
BeanRuntimeException(beanMeta.c, "Attempt to initialize bean property ''{0}'', 
but no setter or field defined.", name);
+                       }
+
+               } catch (BeanRuntimeException e) {
+                       throw e;
+               } catch (Exception e) {
+                       throw new BeanRuntimeException(e);
+               }
+       }
+
+       /**
         * Returns all instances of the specified annotation in the hierarchy 
of this bean property.
         * <p>
         * Searches through the class hierarchy (e.g. superclasses, interfaces, 
packages) for all
@@ -769,10 +878,10 @@ public class BeanPropertyMeta {
                if (cm.isBean())
                        return new BeanMap(session, o, new 
BeanMetaFiltered(cm.getBeanMeta(), properties));
                if (cm.isMap())
-                       return new FilteredMap((Map)o, properties);
+                       return new FilteredMap(cm, (Map)o, properties);
                if (cm.isObject()) {
                        if (o instanceof Map)
-                               return new FilteredMap((Map)o, properties);
+                               return new FilteredMap(cm, (Map)o, properties);
                        BeanMeta bm = beanContext.getBeanMeta(o.getClass());
                        if (bm != null)
                                return new BeanMap(session, o, new 
BeanMetaFiltered(cm.getBeanMeta(), properties));

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
new file mode 100644
index 0000000..679a3e5
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
@@ -0,0 +1,144 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau;
+
+import java.lang.reflect.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.internal.*;
+
+/**
+ * A lookup table for resolving bean types by name.
+ * <p>
+ * In a nutshell, provides a simple mapping of bean class objects to 
identifying names.
+ * <p>
+ * Class names are defined through the {@link Bean#typeName()} annotation.
+ * <p>
+ * The dictionary is used by the framework in the following ways:
+ * <ul>
+ *     <li>If a class type cannot be inferred through reflection during 
parsing, then a helper <js>"_type"</js> is added to the serialized output
+ *             using the name defined for that class in this dictionary.  This 
helps determine the real class at parse time.
+ *     <li>The dictionary name is used as element names when serialized to XML.
+ * </ul>
+ */
+public class BeanRegistry {
+
+       private final Map<String,ClassMeta<?>> map;
+       private final BeanContext beanContext;
+       private final String beanTypePropertyName;
+       private final boolean isEmpty;
+
+       BeanRegistry(BeanContext beanContext, BeanRegistry parent, 
Class<?>...classes) {
+               this.beanContext = beanContext;
+               this.beanTypePropertyName = 
beanContext.getBeanTypePropertyName();
+               this.map = new ConcurrentHashMap<String,ClassMeta<?>>();
+               for (Class<?> c : beanContext.beanDictionaryClasses)
+                       addClass(c);
+               if (parent != null)
+                       this.map.putAll(parent.map);
+               for (Class<?> c : classes)
+                       addClass(c);
+               isEmpty = map.isEmpty();
+       }
+
+       private void addClass(Class<?> c) {
+               if (c != null) {
+                       if (ClassUtils.isParentClass(Collection.class, c)) {
+                               try {
+                                       @SuppressWarnings("rawtypes")
+                                       Collection cc = 
(Collection)c.newInstance();
+                                       for (Object o : cc) {
+                                               if (o instanceof Class)
+                                                       addClass((Class<?>)o);
+                                               else
+                                                       throw new 
BeanRuntimeException("Collection class passed to BeanRegistry does not contain 
Class objects.", c.getName());
+                                       }
+                               } catch (Exception e) {
+                                       throw new BeanRuntimeException(e);
+                               }
+                       } else {
+                               Bean b = c.getAnnotation(Bean.class);
+                               if (b == null || b.typeName().isEmpty())
+                                       throw new BeanRuntimeException("Class 
''{0}'' was passed to BeanRegistry but it doesn't have a @Bean.typeName() 
annotation defined.", c.getName());
+                               map.put(b.typeName(), 
beanContext.getClassMeta(c));
+                       }
+               }
+       }
+
+       /**
+        * Converts the specified object map into a bean if it contains a 
<js>"_type"</js> entry in it.
+        *
+        * @param m The object map to convert to a bean if possible.
+        * @return The new bean, or the original <code>ObjectMap</code> if no 
<js>"_type"</js> entry was found.
+        */
+       public Object cast(ObjectMap m) {
+               if (isEmpty)
+                       return m;
+               Object o = m.get(beanTypePropertyName);
+               if (o == null)
+                       return m;
+               String typeName = o.toString();
+               ClassMeta<?> cm = getClassMeta(typeName);
+               BeanMap<?> bm = 
m.getBeanSession().newBeanMap(cm.getInnerClass());
+
+               // Iterate through all the entries in the map and set the 
individual field values.
+               for (Map.Entry<String,Object> e : m.entrySet()) {
+                       String k = e.getKey();
+                       Object v = e.getValue();
+                       if (! k.equals(beanTypePropertyName)) {
+                               // Attempt to recursively cast child maps.
+                               if (v instanceof ObjectMap)
+                                       v = cast((ObjectMap)v);
+                               bm.put(k, v);
+                       }
+               }
+               return bm.getBean();
+       }
+
+       /**
+        * Gets the class metadata for the specified bean type name.
+        *
+        * @param typeName The bean type name as defined by {@link 
Bean#typeName()}.
+        *      Can include multi-dimensional array type names (e.g. 
<js>"X^^"</js>).
+        * @return The class metadata for the bean.
+        */
+       public ClassMeta<?> getClassMeta(String typeName) {
+               if (isEmpty)
+                       return null;
+               if (typeName == null)
+                       return null;
+               ClassMeta<?> cm = map.get(typeName);
+               if (cm != null)
+                       return cm;
+               if (typeName.charAt(typeName.length()-1) == '^') {
+                       cm = getClassMeta(typeName.substring(0, 
typeName.length()-1));
+                       if (cm != null)
+                               cm = 
beanContext.getClassMeta(Array.newInstance(cm.innerClass, 1).getClass());
+                       map.put(typeName, cm);
+                       return cm;
+               }
+               return null;
+       }
+
+       /**
+        * Returns <jk>true</jk> if this dictionary has an entry for the 
specified type name.
+        *
+        * @param typeName The bean type name.
+        * @return <jk>true</jk> if this dictionary has an entry for the 
specified type name.
+        */
+       public boolean hasName(String typeName) {
+               return getClassMeta(typeName) != null;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/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 3f01b95..e22f028 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
@@ -39,6 +39,7 @@ public class BeanSession extends Session {
        private final Locale locale;
        private final TimeZone timeZone;
        private final boolean debug;
+       private Stack<StringBuilder> sbStack = new Stack<StringBuilder>();
 
        /**
         * Create a new session using properties specified in the context.
@@ -515,7 +516,7 @@ public class BeanSession extends Session {
                        }
 
                        if (type.isString()) {
-                               if (vt.isArray() || vt.isMap() || 
vt.isCollection() || vt.isBean()) {
+                               if (vt.isMapOrBean() || 
vt.isCollectionOrArray()) {
                                        if (JsonSerializer.DEFAULT_LAX != null)
                                                return 
(T)JsonSerializer.DEFAULT_LAX.serialize(value);
                                } else if (vt.isClass()) {
@@ -985,12 +986,37 @@ public class BeanSession extends Session {
        }
 
        /**
-        * Returns the bean dictionary defined in this bean context defined by 
{@link BeanContext#BEAN_beanDictionary}.
+        * Returns the bean registry defined in this bean context defined by 
{@link BeanContext#BEAN_beanDictionary}.
         *
-        * @return The bean dictionary defined in this bean context.  Never 
<jk>null</jk>.
+        * @return The bean registry defined in this bean context.  Never 
<jk>null</jk>.
         */
-       public final BeanDictionary getBeanDictionary() {
-               return ctx.beanDictionary;
+       public final BeanRegistry getBeanRegistry() {
+               return ctx.beanRegistry;
+       }
+
+       /**
+        * Creates a reusable {@link StringBuilder} object from an internal 
pool.
+        * <p>
+        * String builders are returned to the pool by calling {@link 
#returnStringBuilder(StringBuilder)}.
+        *
+        * @return A new or previously returned string builder.
+        */
+       public final StringBuilder getStringBuilder() {
+               if (sbStack.isEmpty())
+                       return new StringBuilder();
+               return sbStack.pop();
+       }
+
+       /**
+        * Returns a {@link StringBuilder} object back into the internal reuse 
pool.
+        *
+        * @param sb The string builder to return to the pool.  No-op if 
<jk>null</jk>.
+        */
+       public final void returnStringBuilder(StringBuilder sb) {
+               if (sb == null)
+                       return;
+               sb.setLength(0);
+               sbStack.push(sb);
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/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 3461af4..38ee551 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
@@ -63,7 +63,8 @@ public final class ClassMeta<T> implements Type {
                keyType = null,                                // If MAP, the 
key class type.
                valueType = null;                              // If MAP, the 
value class type.
        InvocationHandler invocationHandler;              // The invocation 
handler for this class (if it has one).
-       volatile BeanMeta<T> beanMeta;                    // The bean meta for 
this bean class (if it's a bean).
+       BeanMeta<T> beanMeta;                             // The bean meta for 
this bean class (if it's a bean).
+       String dictionaryName, resolvedDictionaryName;    // The dictionary 
name of this class if it has one.
        Method fromStringMethod;                          // The static 
valueOf(String) or fromString(String) method (if it has one).
        Constructor<? extends T> noArgConstructor;        // The no-arg 
constructor for this class (if it has one).
        Constructor<T> stringConstructor;                 // The X(String) 
constructor (if it has one).
@@ -226,8 +227,8 @@ public final class ClassMeta<T> implements Type {
                        try {
                                if (c == TimeZone.class)
                                        this.fromStringMethod = 
c.getMethod("getTimeZone", String.class);
-                               else if (c == Locale.class) 
-                                       this.fromStringMethod = 
LocaleAsString.class.getMethod("fromString", String.class);  
+                               else if (c == Locale.class)
+                                       this.fromStringMethod = 
LocaleAsString.class.getMethod("fromString", String.class);
                        } catch (NoSuchMethodException e1) {}
 
                        // Find toObjectMap() method if present.
@@ -378,6 +379,15 @@ public final class ClassMeta<T> implements Type {
                if (remoteableMethods != null)
                        remoteableMethods = 
Collections.unmodifiableMap(remoteableMethods);
 
+               if (isBean())
+                       dictionaryName = resolvedDictionaryName = 
getBeanMeta().getDictionaryName();
+
+               if (isArray()) {
+                       resolvedDictionaryName = 
getElementType().getResolvedDictionaryName();
+                       if (resolvedDictionaryName != null)
+                               resolvedDictionaryName += "^";
+               }
+
                return this;
        }
 
@@ -389,9 +399,19 @@ public final class ClassMeta<T> implements Type {
         * @return The type name associated with this bean class, or 
<jk>null</jk> if there is no type name defined or this isn't a bean.
         */
        public String getDictionaryName() {
-               if (beanMeta != null)
-                       return beanMeta.getDictionaryName();
-               return null;
+               return dictionaryName;
+       }
+
+       /**
+        * Returns the resolved bean dictionary name associated with this class.
+        * <p>
+        * Unlike {@link #getDictionaryName()}, this method automatically 
resolves multidimensional arrays
+        *  (e.g. <js>"X^^"</js> and returns array class metas accordingly if 
the base class has a type name.
+        *
+        * @return The type name associated with this bean class, or 
<jk>null</jk> if there is no type name defined or this isn't a bean.
+        */
+       public String getResolvedDictionaryName() {
+               return resolvedDictionaryName;
        }
 
        /**
@@ -604,6 +624,15 @@ public final class ClassMeta<T> implements Type {
        }
 
        /**
+        * Returns <jk>true</jk> if this class is a subclass of {@link Map} or 
it's a bean.
+        *
+        * @return <jk>true</jk> if this class is a subclass of {@link Map} or 
it's a bean.
+        */
+       public boolean isMapOrBean() {
+               return classCategory == MAP || classCategory == BEANMAP || 
classCategory == BEAN;
+       }
+
+       /**
         * Returns <jk>true</jk> if this class is a subclass of {@link BeanMap}.
         *
         * @return <jk>true</jk> if this class is a subclass of {@link BeanMap}.
@@ -622,6 +651,15 @@ public final class ClassMeta<T> implements Type {
        }
 
        /**
+        * Returns <jk>true</jk> if this class is a subclass of {@link 
Collection} or is an array.
+        *
+        * @return <jk>true</jk> if this class is a subclass of {@link 
Collection} or is an array.
+        */
+       public boolean isCollectionOrArray() {
+               return classCategory == COLLECTION || classCategory == ARRAY;
+       }
+
+       /**
         * Returns <jk>true</jk> if this class is {@link Class}.
         *
         * @return <jk>true</jk> if this class is {@link Class}.
@@ -1228,6 +1266,19 @@ public final class ClassMeta<T> implements Type {
                return t2.getInnerClass() == this.getInnerClass();
        }
 
+       /**
+        * Similar to {@link #equals(Object)} except primitive and Object types 
that are similar
+        * are considered the same. (e.g. <jk>boolean</jk> == 
<code>Boolean</code>).
+        *
+        * @param cm The class meta to compare to.
+        * @return <jk>true</jk> if the specified class-meta is equivalent to 
this one.
+        */
+       public boolean same(ClassMeta<?> cm) {
+               if (equals(cm))
+                       return true;
+               return (isPrimitive() && classCategory == cm.classCategory);
+       }
+
        @Override /* Object */
        public String toString() {
                return toString(false);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java 
b/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java
index c8af10e..b090829 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java
@@ -1157,18 +1157,18 @@ public class ObjectMap extends 
LinkedHashMap<String,Object> {
         *      same object if entry does not exist.
         */
        public Object cast() {
-               return cast((BeanDictionary)null);
+               return cast((BeanRegistry)null);
        }
 
        /**
         * Same as {@link #cast()}, but first do a lookup for the name in the 
specified dictionary.
         *
-        * @param typeDictionary
+        * @param beanRegistry
         *      The class lexicon to resolve the name.  Can be <jk>null</jk>.
         * @return The new Java object of type specified by the 
<js>"_type"</js> entry value, or this
         *      same object if entry does not exist.
         */
-       public Object cast(BeanDictionary typeDictionary) {
+       public Object cast(BeanRegistry beanRegistry) {
                String c = (String)get(session.getBeanTypePropertyName());
                if (c == null) {
                        return this;
@@ -1266,7 +1266,7 @@ public class ObjectMap extends 
LinkedHashMap<String,Object> {
 
                                                // Attempt to recursively cast 
child maps.
                                                if (v instanceof ObjectMap)
-                                                       v = 
((ObjectMap)v).cast(session.getBeanDictionary());
+                                                       v = 
((ObjectMap)v).cast(session.getBeanRegistry());
 
                                                k = (kType.isString() ? k : 
session.convertToType(k, kType));
                                                v = (vType.isObject() ? v : 
session.convertToType(v, vType));
@@ -1287,7 +1287,7 @@ public class ObjectMap extends 
LinkedHashMap<String,Object> {
 
                                                // Attempt to recursively cast 
child maps.
                                                if (v instanceof ObjectMap)
-                                                       v = 
((ObjectMap)v).cast(session.getBeanDictionary());
+                                                       v = 
((ObjectMap)v).cast(session.getBeanRegistry());
 
                                                bm.put(k, v);
                                        }
@@ -1295,7 +1295,7 @@ public class ObjectMap extends 
LinkedHashMap<String,Object> {
 
                                return bm.getBean();
 
-                       } else if (cm.isArray() || cm.isCollection()) {
+                       } else if (cm.isCollectionOrArray()) {
                                List items = (List)get("items");
                                return session.convertToType(items, cm);
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java 
b/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
index b769ddf..b6c6d8f 100644
--- a/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
+++ b/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
@@ -270,4 +270,19 @@ public @interface Bean {
         * </p>
         */
        Class<?> stopClass() default Object.class;
+
+
+       /**
+        * The list of classes that make up the bean dictionary for all 
properties of this bean.
+        * <p>
+        * This is a shorthand for setting the {@link 
BeanProperty#beanDictionary()} on all properties of the bean.
+        * <p>
+        * This list can consist of the following class types:
+        * <ul>
+        *      <li>Any bean class that specifies a value for {@link 
Bean#typeName() @Bean.name()};
+        *      <li>Any subclass of {@link BeanDictionary} that defines an 
entire set of mappings.
+        *              Note that the subclass MUST implement a no-arg 
constructor so that it can be instantiated.
+        * </ul>
+        */
+       Class<?>[] beanDictionary() default {};
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java 
b/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java
index 55922d6..bd68408 100644
--- a/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java
+++ b/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java
@@ -158,10 +158,9 @@ public @interface BeanProperty {
         * This list can consist of the following class types:
         * <ul>
         *      <li>Any bean class that specifies a value for {@link 
Bean#typeName() @Bean.name()};
-        *      <li>Any subclass of {@link BeanDictionaryBuilder} that defines 
an entire set of mappings.
+        *      <li>Any subclass of {@link BeanDictionary} that defines an 
entire set of mappings.
         *              Note that the subclass MUST implement a no-arg 
constructor so that it can be instantiated.
         * </ul>
         */
        Class<?>[] beanDictionary() default {};
 }
-

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
new file mode 100644
index 0000000..f51eb45
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
@@ -0,0 +1,224 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.dto.atom;
+
+import java.net.*;
+import java.util.*;
+
+/**
+ * Various useful static methods for creating ATOM elements.
+ * <p>
+ * Typically, you'll want to do a static import on this class and then call 
the methods like so...
+ * <p class='bcode'>
+ *     <jk>import static</jk> org.apache.juneau.dto.atom.AtomBuilder.*;
+ *
+ *     Feed feed =
+ *             feed(<js>"tag:juneau.sample.com,2013:1"</js>, <js>"Juneau ATOM 
specification"</js>, <js>"2013-05-08T12:29:29Z"</js>)
+ *             .subtitle(text(<js>"html"</js>).children(<js>"A 
&lt;em&gt;lot&lt;/em&gt; of effort went into making this effortless"</js>))
+ *             .links(
+ *                     link(<js>"alternate"</js>, <js>"text/html"</js>, 
<js>"http://www.sample.com/";</js>).hreflang(<js>"en"</js>),
+ *                     link(<js>"self"</js>, <js>"application/atom+xml"</js>, 
<js>"http://www.sample.com/feed.atom";</js>)
+ *             );
+ * </p>
+ * <p>
+ * Refer to {@link org.apache.juneau.dto.atom} for further information about 
ATOM support.
+ */
+public class AtomBuilder {
+
+       /**
+        * Creates a {@link Category} element with the specified {@link 
Category#term(String)} attribute.
+        *
+        * @param term The {@link Category#term(String)} attribute.
+        * @return The new element.
+        */
+       public static final Category category(String term) {
+               return new Category(term);
+       }
+
+       /**
+        * Creates a {@link Content} element with the specified {@link 
Content#type(String)} attribute.
+        *
+        * @return The new element.
+        */
+       public static final Content content() {
+               return new Content();
+       }
+
+       /**
+        * Creates a {@link Content} element.
+        *
+        * @param type The {@link Content#type(String)} attribute.
+        * @return The new element.
+        */
+       public static final Content content(String type) {
+               return new Content(type);
+       }
+
+       /**
+        * Creates an {@link Entry} element with the specified {@link 
Entry#id(Id)}, {@link Entry#title(Text)}, and {@link Entry#updated(Calendar)} 
attributes.
+        *
+        * @param id The {@link Entry#id(Id)} attribute.
+        * @param title The {@link Entry#title(Text)} attribute.
+        * @param updated The {@link Entry#updated(Calendar)} attribute.
+        * @return The new element.
+        */
+       public static final Entry entry(Id id, Text title, Calendar updated) {
+               return new Entry(id, title, updated);
+       }
+
+       /**
+        * Creates an {@link Entry} element with the specified {@link 
Entry#id(Id)}, {@link Entry#title(Text)}, and {@link Entry#updated(Calendar)} 
attributes.
+        *
+        * @param id The {@link Entry#id(Id)} attribute.
+        * @param title The {@link Entry#title(Text)} attribute.
+        * @param updated The {@link Entry#updated(Calendar)} attribute.
+        * @return The new element.
+        */
+       public static final Entry entry(String id, String title, String 
updated) {
+               return new Entry(id, title, updated);
+       }
+
+       /**
+        * Creates a {@link Feed} element with the specified {@link 
Feed#id(Id)}, {@link Entry#title(Text)}, and {@link Feed#updated(Calendar)} 
attributes.
+        *
+        * @param id The {@link Feed#id(Id)} attribute.
+        * @param title The {@link Feed#title(Text)} attribute.
+        * @param updated The {@link Feed#updated(Calendar)} attribute.
+        * @return The new element.
+        */
+       public static final Feed feed(Id id, Text title, Calendar updated) {
+               return new Feed(id, title, updated);
+       }
+
+       /**
+        * Creates a {@link Feed} element with the specified {@link 
Feed#id(Id)}, {@link Entry#title(Text)}, and {@link Feed#updated(Calendar)} 
attributes.
+        *
+        * @param id The {@link Feed#id(Id)} attribute.
+        * @param title The {@link Feed#title(Text)} attribute.
+        * @param updated The {@link Feed#updated(Calendar)} attribute.
+        * @return The new element.
+        */
+       public static final Feed feed(String id, String title, String updated) {
+               return new Feed(id, title, updated);
+       }
+
+       /**
+        * Creates a {@link Generator} element with the specified {@link 
Generator#text(String)} child node.
+        *
+        * @param text The {@link Generator#text(String)} child node.
+        * @return The new element.
+        */
+       public static final Generator generator(String text) {
+               return new Generator(text);
+       }
+
+       /**
+        * Creates an {@link Icon} element with the specified {@link 
Icon#uri(URI)} attribute.
+        *
+        * @param uri The {@link Icon#uri(URI)} attribute.
+        * @return The new element.
+        */
+       public static final Icon icon(String uri) {
+               return icon(uri);
+       }
+
+       /**
+        * Creates an {@link Icon} element with the specified {@link 
Icon#uri(URI)} attribute.
+        *
+        * @param uri The {@link Icon#uri(URI)} attribute.
+        * @return The new element.
+        */
+       public static final Icon icon(URI uri) {
+               return new Icon(uri);
+       }
+
+       /**
+        * Creates an {@link Id} element with the specified {@link 
Id#text(String)} child node.
+        *
+        * @param text The {@link Id#text(String)} child node.
+        * @return The new element.
+        */
+       public static final Id id(String text) {
+               return new Id(text);
+       }
+
+       /**
+        * Creates a {@link Link} element with the specified {@link 
Link#rel(String)}, {@link Link#type(String)}, and {@link Link#href(String)} 
attributes.
+        *
+        * @param rel The {@link Link#rel(String)} attribute.
+        * @param type The {@link Link#type(String)} attribute.
+        * @param href The {@link Link#href(String)} attribute.
+        * @return The new element.
+        */
+       public static final Link link(String rel, String type, String href) {
+               return new Link(rel, type, href);
+       }
+
+       /**
+        * Creates a {@link Logo} element with the specified {@link 
Logo#uri(URI)} attribute.
+        *
+        * @param uri The {@link Logo#uri(URI)} attribute.
+        * @return The new element.
+        */
+       public static final Logo logo(String uri) {
+               return logo(uri);
+       }
+
+       /**
+        * Creates a {@link Logo} element with the specified {@link 
Logo#uri(URI)} attribute.
+        *
+        * @param uri The {@link Logo#uri(URI)} attribute.
+        * @return The new element.
+        */
+       public static final Logo logo(URI uri) {
+               return logo(uri);
+       }
+
+       /**
+        * Creates a {@link Person} element with the specified {@link 
Person#name(String)} attribute.
+        *
+        * @param name The {@link Person#name(String)} attribute.
+        * @return The new element.
+        */
+       public static final Person person(String name) {
+               return new Person(name);
+       }
+
+       /**
+        * Creates a {@link Source} element.
+        *
+        * @return The new element.
+        */
+       public static final Source source() {
+               return new Source();
+       }
+
+       /**
+        * Creates a {@link Text} element.
+        *
+        * @return The new element.
+        */
+       public static final Text text() {
+               return new Text();
+       }
+
+       /**
+        * Creates a {@link Text} element with the specified {@link 
Text#type(String)} attribute.
+        *
+        * @param type The {@link Text#type(String)} attribute.
+        * @return The new element.
+        */
+       public static final Text text(String type) {
+               return new Text(type);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java
index 0d8060b..37b45d6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java
@@ -34,10 +34,10 @@ import org.apache.juneau.xml.annotation.*;
  *             }
  * </p>
  * <p>
- *     Refer to {@link org.apache.juneau.dto.atom} for further information 
about ATOM support.
- * </p>
+ * Refer to {@link org.apache.juneau.dto.atom} for further information about 
ATOM support.
  */
 @Bean(typeName="category")
+@SuppressWarnings("hiding")
 public class Category extends Common {
 
        private String term;
@@ -49,7 +49,7 @@ public class Category extends Common {
         * @param term The category term.
         */
        public Category(String term) {
-               this.term = term;
+               term(term);
        }
 
        /** Bean constructor. */
@@ -74,7 +74,8 @@ public class Category extends Common {
         * @param term The category term.
         * @return This object (for method chaining).
         */
-       public Category setTerm(String term) {
+       @BeanProperty(name="term")
+       public Category term(String term) {
                this.term = term;
                return this;
        }
@@ -95,7 +96,8 @@ public class Category extends Common {
         * @param scheme The category scheme.
         * @return This object (for method chaining).
         */
-       public Category setScheme(URI scheme) {
+       @BeanProperty(name="scheme")
+       public Category scheme(URI scheme) {
                this.scheme = scheme;
                return this;
        }
@@ -116,7 +118,8 @@ public class Category extends Common {
         * @param label The category label.
         * @return This object (for method chaining).
         */
-       public Category setLabel(String label) {
+       @BeanProperty(name="label")
+       public Category label(String label) {
                this.label = label;
                return this;
        }
@@ -127,14 +130,14 @@ public class Category extends Common {
        
//--------------------------------------------------------------------------------
 
        @Override /* Common */
-       public Category setBase(URI base) {
-               super.setBase(base);
+       public Category base(URI base) {
+               super.base(base);
                return this;
        }
 
        @Override /* Common */
-       public Category setLang(String lang) {
-               super.setLang(lang);
+       public Category lang(String lang) {
+               super.lang(lang);
                return this;
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java
index ef27722..c3a57ec 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java
@@ -14,9 +14,11 @@ package org.apache.juneau.dto.atom;
 
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
-import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
+import static org.apache.juneau.dto.atom.Utils.*;
 
 /**
  * Represents an <code>atomCommonAttributes</code> construct in the RFC4287 
specification.
@@ -29,9 +31,9 @@ import org.apache.juneau.xml.annotation.*;
  *             undefinedAttribute*
  * </p>
  * <p>
- *     Refer to {@link org.apache.juneau.dto.atom} for further information 
about ATOM support.
- * </p>
+ * Refer to {@link org.apache.juneau.dto.atom} for further information about 
ATOM support.
  */
+@SuppressWarnings("hiding")
 public abstract class Common {
 
        private URI base;
@@ -58,12 +60,24 @@ public abstract class Common {
         * @param base The URI base of this object.
         * @return This object (for method chaining).
         */
-       public Common setBase(URI base) {
+       @BeanProperty(name="base")
+       public Common base(URI base) {
                this.base = base;
                return this;
        }
 
        /**
+        * Sets the URI base of this object.
+        *
+        * @param base The URI base of this object.
+        * @return This object (for method chaining).
+        */
+       public Common base(String base) {
+               this.base = toURI(base);
+               return this;
+       }
+
+       /**
         * Returns the language of this object.
         *
         * @return The language of this object.
@@ -79,7 +93,8 @@ public abstract class Common {
         * @param lang The language of this object.
         * @return This object (for method chaining).
         */
-       public Common setLang(String lang) {
+       @BeanProperty(name="lang")
+       public Common lang(String lang) {
                this.lang = lang;
                return this;
        }

Reply via email to