This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new d89daa8  Remove deprecated code.
d89daa8 is described below

commit d89daa8f50ad2aba9a57b1cafbd18ec44bf6d32f
Author: JamesBognar <[email protected]>
AuthorDate: Tue Oct 13 14:55:44 2020 -0400

    Remove deprecated code.
---
 .../main/java/org/apache/juneau/config/Config.java |   54 -
 .../main/java/org/apache/juneau/BeanSession.java   |    9 -
 .../main/java/org/apache/juneau/ObjectList.java    |  858 ---------
 .../src/main/java/org/apache/juneau/ObjectMap.java | 1840 --------------------
 .../java/org/apache/juneau/collections/OList.java  |   61 +-
 .../java/org/apache/juneau/collections/OMap.java   |  109 +-
 .../java/org/apache/juneau/utils/PojoRest.java     |    2 +-
 .../org/apache/juneau/rest/RequestProperties.java  |    2 +-
 .../apache/juneau/rest/RestMethodProperties.java   |    2 +-
 .../org/apache/juneau/rest/SwaggerGenerator.java   |    2 +-
 10 files changed, 86 insertions(+), 2853 deletions(-)

diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java
index 4c08f4d..326d662 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java
@@ -1259,19 +1259,6 @@ public final class Config extends Context implements 
ConfigEventListener, Writab
        }
 
        /**
-        * Convenience method for returning a config entry as an {@link 
ObjectMap}.
-        *
-        * @param key The key.
-        * @return The value, or <jk>null</jk> if the section or key does not 
exist.
-        * @throws ParseException Malformed input encountered.
-        * @deprecated Use {@link #getMap(String)}
-        */
-       @Deprecated
-       public ObjectMap getObjectMap(String key) throws ParseException {
-               return getObject(key, ObjectMap.class);
-       }
-
-       /**
         * Convenience method for returning a config entry as an {@link OMap}.
         *
         * @param key The key.
@@ -1283,20 +1270,6 @@ public final class Config extends Context implements 
ConfigEventListener, Writab
        }
 
        /**
-        * Convenience method for returning a config entry as an {@link 
ObjectMap}.
-        *
-        * @param key The key.
-        * @param def The default value.
-        * @return The value, or the default value if the section or key does 
not exist.
-        * @throws ParseException Malformed input encountered.
-        * @deprecated Use {@link #getMap(String,OMap)}
-        */
-       @Deprecated
-       public ObjectMap getObjectMap(String key, ObjectMap def) throws 
ParseException {
-               return getObjectWithDefault(key, def, ObjectMap.class);
-       }
-
-       /**
         * Convenience method for returning a config entry as an {@link OMap}.
         *
         * @param key The key.
@@ -1309,19 +1282,6 @@ public final class Config extends Context implements 
ConfigEventListener, Writab
        }
 
        /**
-        * Convenience method for returning a config entry as an {@link 
ObjectList}.
-        *
-        * @param key The key.
-        * @return The value, or <jk>null</jk> if the section or key does not 
exist.
-        * @throws ParseException Malformed input encountered.
-        * @deprecated Use {@link #getList(String)}.
-        */
-       @Deprecated
-       public ObjectList getObjectList(String key) throws ParseException {
-               return getList(key);
-       }
-
-       /**
         * Convenience method for returning a config entry as an {@link OList}.
         *
         * @param key The key.
@@ -1333,20 +1293,6 @@ public final class Config extends Context implements 
ConfigEventListener, Writab
        }
 
        /**
-        * Convenience method for returning a config entry as an {@link 
ObjectList}.
-        *
-        * @param key The key.
-        * @param def The default value.
-        * @return The value, or the default value if the section or key does 
not exist.
-        * @throws ParseException Malformed input encountered.
-        * @deprecated Use {@link #getList(String, OList)}.
-        */
-       @Deprecated
-       public ObjectList getObjectList(String key, ObjectList def) throws 
ParseException {
-               return getObjectWithDefault(key, def, ObjectList.class);
-       }
-
-       /**
         * Convenience method for returning a config entry as an {@link OList}.
         *
         * @param key The key.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
index f9f67e4..3fbb500 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
@@ -625,15 +625,6 @@ public class BeanSession extends Session {
                                                        return (T)m2.cast(cm);
                                        }
                                }
-                               if (value instanceof ObjectMap && builder == 
null) {
-                                       ObjectMap m2 = (ObjectMap)value;
-                                       String typeName = 
m2.getString(getBeanTypePropertyName(to));
-                                       if (typeName != null) {
-                                               ClassMeta cm = 
to.getBeanRegistry().getClassMeta(typeName);
-                                               if (cm != null && 
to.info.isParentOf(cm.innerClass))
-                                                       return (T)m2.cast(cm);
-                                       }
-                               }
                                if (builder != null) {
                                        BeanMap m = 
toBeanMap(builder.create(this, to));
                                        m.load((Map<?,?>) value);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectList.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectList.java
deleted file mode 100644
index 5d12fb7..0000000
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectList.java
+++ /dev/null
@@ -1,858 +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 static org.apache.juneau.internal.StringUtils.*;
-
-import java.io.*;
-import java.lang.reflect.*;
-import java.util.*;
-
-import org.apache.juneau.json.*;
-import org.apache.juneau.parser.*;
-import org.apache.juneau.serializer.*;
-import org.apache.juneau.utils.*;
-
-/**
- * Java implementation of a JSON array.
- *
- * <p>
- * An extension of {@link LinkedList}, so all methods available to in that 
class are also available to this class.
- *
- * <p>
- * Note that the use of this class is optional.
- * The serializers will accept any objects that implement the {@link 
Collection} interface.
- * But this class provides some useful additional functionality when working 
with JSON models constructed from Java
- * Collections Framework objects.
- * For example, a constructor is provided for converting a JSON array string 
directly into a {@link List}.
- * It also contains accessor methods for to avoid common typecasting when 
accessing elements in a list.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- *     <jc>// Construct an empty List</jc>
- *     List l = <jk>new</jk> ObjectList();
- *
- *     <jc>// Construct a list of objects using various methods</jc>
- *     l = <jk>new</jk> 
ObjectList().append(<js>"foo"</js>).append(123).append(<jk>true</jk>);
- *     l = <jk>new</jk> ObjectList().append(<js>"foo"</js>, 123, 
<jk>true</jk>);  <jc>// Equivalent</jc>
- *     l = <jk>new</jk> ObjectList(<js>"foo"</js>, 123, <jk>true</jk>);  
<jc>// Equivalent</jc>
- *
- *     <jc>// Construct a list of integers from JSON</jc>
- *     l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
- *
- *     <jc>// Construct a list of generic ObjectMap objects from JSON</jc>
- *     l = <jk>new</jk> ObjectList(<js>"[{foo:'bar'},{baz:'bing'}]"</js>);
- *
- *     <jc>// Construct a list of integers from XML</jc>
- *     String xml = 
<js>"&lt;array&gt;&lt;number&gt;1&lt;/number&gt;&lt;number&gt;2&lt;/number&gt;&lt;number&gt;3&lt;/number&gt;&lt;/array&gt;"</js>;
- *     l = <jk>new</jk> ObjectList(xml, DataFormat.<jsf>XML</jsf>);
- *     l = (List)XmlParser.<jsf>DEFAULT</jsf>.parse(xml);  <jc>// 
Equivalent</jc>
- *     l = (List)XmlParser.<jsf>DEFAULT</jsf>.parse(Object.<jk>class</jk>, 
xml);  <jc>// Equivalent</jc>
- *     l = XmlParser.<jsf>DEFAULT</jsf>.parse(List.<jk>class</jk>, xml);  
<jc>// Equivalent</jc>
- *     l = XmlParser.<jsf>DEFAULT</jsf>.parse(ObjectList.<jk>class</jk>, xml); 
 <jc>// Equivalent</jc>
- *
- *     <jc>// Construct JSON from ObjectList</jc>
- *     l = <jk>new</jk> ObjectList(<js>"[{foo:'bar'},{baz:'bing'}]"</js>);
- *     String json = l.toString();  <jc>// Produces 
"[{foo:'bar'},{baz:'bing'}]"</jc>
- *     json = l.toString(JsonSerializer.<jsf>DEFAULT_CONDENSED</jsf>);  <jc>// 
Equivalent</jc>
- *     json = JsonSerializer.<jsf>DEFAULT_CONDENSED</jsf>.serialize(l);  
<jc>// Equivalent</jc>
- *
- *     <jc>// Get one of the entries in the list as an Integer</jc>
- *     l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
- *     Integer i = l.getInt(1);
- *     i = l.get(Integer.<jk>class</jk>, 1);  <jc>// Equivalent</jc>
- *
- *     <jc>// Get one of the entries in the list as an Float</jc>
- *     l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
- *     Float f = l.getFloat(1); <jc>// Returns 2f </jc>
- *     f = l.get(Float.<jk>class</jk>, 1);  <jc>// Equivalent</jc>
- *
- *     <jc>// Same as above, except converted to a String</jc>
- *     l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
- *     String s = l.getString(1); <jc>// Returns "2" </jc>
- *     s = l.get(String.<jk>class</jk>, 1);  <jc>// Equivalent</jc>
- *
- *     <jc>// Get one of the entries in the list as a bean (converted to a 
bean if it isn't already one)</jc>
- *     l = <jk>new</jk> ObjectList(<js>"[{name:'John Smith',age:45}]"</js>);
- *     Person p = l.get(Person.<jk>class</jk>, 0);
- *
- *     <jc>// Iterate over a list of beans using the elements() method</jc>
- *     ObjectList ObjectList = <jk>new</jk> ObjectList(<js>"[{name:'John 
Smith',age:45}]"</js>);
- *     <jk>for</jk> (Person p : ObjectList.elements(Person.<jk>class</jk>) {
- *             <jc>// Do something with p</jc>
- *     }
- * </p>
- *
- * <p>
- * This class is not thread safe.
- */
-public class ObjectList extends LinkedList<Object> {
-       private static final long serialVersionUID = 1L;
-
-       transient BeanSession session = null;
-       private transient PojoRest pojoRest;
-
-       /**
-        * An empty read-only ObjectList.
-        */
-       public static final ObjectList EMPTY_LIST = new ObjectList() {
-               private static final long serialVersionUID = 1L;
-
-               @Override /* List */
-               public void add(int location, Object object) {
-                       throw new UnsupportedOperationException();
-               }
-
-               @Override /* List */
-               public ListIterator<Object> listIterator(final int location) {
-                       return Collections.emptyList().listIterator(location);
-               }
-
-               @Override /* List */
-               public Object remove(int location) {
-                       throw new UnsupportedOperationException();
-               }
-
-               @Override /* List */
-               public Object set(int location, Object object) {
-                       throw new UnsupportedOperationException();
-               }
-
-               @Override /* List */
-               public List<Object> subList(int start, int end) {
-                       return Collections.emptyList().subList(start, end);
-               }
-       };
-
-       /**
-        * Static constructor from JSON string.
-        *
-        * @param s JSON initialization string.  Can be <jk>null</jk>.
-        * @return A new {@link ObjectList} object, or <jk>null</jk> if the 
input is <jk>null</jk>.
-        * @throws ParseException Invalid JSON string.
-        */
-       public static ObjectList parse(CharSequence s) throws ParseException {
-               return s == null ? null : new ObjectList(s);
-       }
-
-       /**
-        * Construct a JSON array directly from text using the specified parser.
-        *
-        * @param s The string being parsed.
-        * @param p The parser to use to parse the input.
-        * @throws ParseException Malformed input encountered.
-        */
-       public ObjectList(CharSequence s, Parser p) throws ParseException {
-               this(p == null ? null : p.createBeanSession());
-               if (p == null)
-                       p = JsonParser.DEFAULT;
-               if (s != null)
-                       p.parseIntoCollection(s, this, bs2().object());
-       }
-
-       /**
-        * Shortcut for <code><jk>new</jk> 
ObjectList(String,JsonParser.<jsf>DEFAULT</jsf>);</code>
-        *
-        * @param s The string being parsed.
-        * @throws ParseException Malformed input encountered.
-        */
-       public ObjectList(CharSequence s) throws ParseException {
-               this(s, null);
-       }
-
-       /**
-        * Construct a JSON array directly from a reader using the specified 
parser.
-        *
-        * @param r
-        *      The reader to read from.
-        *      Will automatically be wrapped in a {@link BufferedReader} if it 
isn't already a BufferedReader.
-        * @param p The parser to use to parse the input.
-        * @throws ParseException Malformed input encountered.
-        * @throws IOException If a problem occurred trying to read from the 
reader.
-        */
-       public ObjectList(Reader r, Parser p) throws ParseException, 
IOException {
-               this(p == null ? null : p.createBeanSession());
-               parseReader(r, p);
-       }
-
-       /**
-        * Shortcut for <code><jk>new</jk> ObjectList(reader, 
JsonParser.<jsf>DEFAULT</jsf>)</code>.
-        *
-        * @param r
-        *      The reader to read from.
-        *      The reader will be wrapped in a {@link BufferedReader} if it 
isn't already.
-        * @throws ParseException Malformed input encountered.
-        * @throws IOException If a problem occurred trying to read from the 
reader.
-        */
-       public ObjectList(Reader r) throws ParseException, IOException {
-               parseReader(r, JsonParser.DEFAULT);
-       }
-
-       private void parseReader(Reader r, Parser p) throws ParseException {
-               if (p == null)
-                       p = JsonParser.DEFAULT;
-               p.parseIntoCollection(r, this, bs2().object());
-       }
-
-       /**
-        * Construct an empty JSON array (an empty {@link LinkedList}).
-        */
-       public ObjectList() {
-       }
-
-       /**
-        * Construct an empty JSON array (an empty {@link LinkedList}) with the 
specified bean context.
-        *
-        * @param session The bean context to associate with this object list 
for creating beans.
-        */
-       public ObjectList(BeanSession session) {
-               super();
-               this.session = session;
-       }
-
-       /**
-        * Construct a JSON array and fill it with the specified objects.
-        *
-        * @param o A list of objects to add to this list.
-        */
-       public ObjectList(Object... o) {
-               super();
-               Collections.addAll(this, o);
-       }
-
-       /**
-        * Construct a JSON array and fill it with the specified collection of 
objects.
-        *
-        * @param c A list of objects to add to this list.
-        */
-       public ObjectList(Collection<?> c) {
-               super(c);
-       }
-
-       /**
-        * Override the default bean session used for converting POJOs.
-        *
-        * <p>
-        * Default is {@link BeanContext#DEFAULT}, which is sufficient in most 
cases.
-        *
-        * <p>
-        * Useful if you're serializing/parsing beans with transforms defined.
-        *
-        * @param session The new bean session.
-        * @return This object (for method chaining).
-        */
-       public ObjectList setBeanSession(BeanSession session) {
-               this.session = session;
-               return this;
-       }
-
-       /**
-        * Returns the {@link BeanSession} currently associated with this list.
-        *
-        * @return The {@link BeanSession} currently associated with this list.
-        */
-       public BeanSession getBeanSession() {
-               return session;
-       }
-
-       /**
-        * Convenience method for adding multiple objects to this list.
-        *
-        * @param o The objects to add to the list.
-        * @return This object (for method chaining).
-        */
-       public ObjectList append(Object...o) {
-               for (Object o2 : o)
-                       add(o2);
-               return this;
-       }
-
-       /**
-        * Convenience method for appending another list to this list.
-        *
-        * @param l
-        *      The list containing the elements to append to this list.
-        *      <br>Can be <jk>null</jk>.
-        * @return This object (for method chaining).
-        */
-       public ObjectList appendAll(ObjectList l) {
-               if (l != null)
-                       addAll(l);
-               return this;
-       }
-
-       /**
-        * Convenience method for adding multiple objects to this list.
-        *
-        * <p>
-        * <jk>null</jk> and empty strings are skipped.
-        *
-        * @param o The objects to add to the list.
-        * @return This object (for method chaining).
-        */
-       public ObjectList appendIfNotEmpty(String...o) {
-               for (String s : o)
-                       if (isNotEmpty(s))
-                               add(s);
-               return this;
-       }
-
-       /**
-        * Convenience method for adding multiple objects to this list.
-        *
-        * <p>
-        * <jk>null</jk> values are skipped.
-        *
-        * @param o The objects to add to the list.
-        * @return This object (for method chaining).
-        */
-       public ObjectList appendIfNotNull(Object...o) {
-               for (Object o2 : o)
-                       if (o2 != null)
-                               add(o2);
-               return this;
-       }
-
-       /**
-        * Get the entry at the specified index, converted to the specified 
type.
-        *
-        * <p>
-        * This is the preferred get method for simple types.
-        *
-        * <h5 class='section'>Examples:</h5>
-        * <p class='bcode w800'>
-        *      ObjectList l = <jk>new</jk> ObjectList(<js>"..."</js>);
-        *
-        *      <jc>// Value converted to a string.</jc>
-        *      String s = l.get(1, String.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a bean.</jc>
-        *      MyBean b = l.get(2, MyBean.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a bean array.</jc>
-        *      MyBean[] ba = l.get(3, MyBean[].<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a linked-list of objects.</jc>
-        *      List l1 = l.get(4, LinkedList.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a map of object keys/values.</jc>
-        *      Map m1 = l.get(5, TreeMap.<jk>class</jk>);
-        * </p>
-        *
-        * <p>
-        * See {@link BeanSession#convertToType(Object, ClassMeta)} for the 
list of valid data conversions.
-        *
-        * @param index The index into this list.
-        * @param type The type of object to convert the entry to.
-        * @param <T> The type of object to convert the entry to.
-        * @return The converted entry.
-        */
-       public <T> T get(int index, Class<T> type) {
-               return bs2().convertToType(get(index), type);
-       }
-
-       /**
-        * Get the entry at the specified index, converted to the specified 
type.
-        *
-        * <p>
-        * The type can be a simple type (e.g. beans, strings, numbers) or 
parameterized type (collections/maps).
-        *
-        * <h5 class='section'>Examples:</h5>
-        * <p class='bcode w800'>
-        *      ObjectList l = <jk>new</jk> ObjectList(<js>"..."</js>);
-        *
-        *      <jc>// Value converted to a linked-list of strings.</jc>
-        *      List&lt;String&gt; l1 = l.get(1, LinkedList.<jk>class</jk>, 
String.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a linked-list of beans.</jc>
-        *      List&lt;MyBean&gt; l2 = l.get(2, LinkedList.<jk>class</jk>, 
MyBean.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a linked-list of linked-lists of 
strings.</jc>
-        *      List&lt;List&lt;String&gt;&gt; l3 = l.get(3, 
LinkedList.<jk>class</jk>, LinkedList.<jk>class</jk>, String.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a map of string keys/values.</jc>
-        *      Map&lt;String,String&gt; m1 = l.get(4, TreeMap.<jk>class</jk>, 
String.<jk>class</jk>, String.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a map containing string keys and 
values of lists containing beans.</jc>
-        *      Map&lt;String,List&lt;MyBean&gt;&gt; m2 = l.get(5, 
TreeMap.<jk>class</jk>, String.<jk>class</jk>, List.<jk>class</jk>, 
MyBean.<jk>class</jk>);
-        * </p>
-        *
-        * <p>
-        * <c>Collection</c> classes are assumed to be followed by zero or one 
objects indicating the element type.
-        *
-        * <p>
-        * <c>Map</c> classes are assumed to be followed by zero or two meta 
objects indicating the key and value types.
-        *
-        * <p>
-        * The array can be arbitrarily long to indicate arbitrarily complex 
data structures.
-        *
-        * <p>
-        * See {@link BeanSession#convertToType(Object, ClassMeta)} for the 
list of valid data conversions.
-        *
-        * @param index The index into this list.
-        * @param type The type of object to convert the entry to.
-        * @param args The type arguments of the type to convert the entry to.
-        * @param <T> The type of object to convert the entry to.
-        * @return The converted entry.
-        */
-       public <T> T get(int index, Type type, Type...args) {
-               return bs2().convertToType(get(index), type, args);
-       }
-
-       /**
-        * Shortcut for calling <code>get(index, String.<jk>class</jk>)</code>.
-        *
-        * @param index The index.
-        * @return The converted value.
-        */
-       public String getString(int index) {
-               return get(index, String.class);
-       }
-
-       /**
-        * Shortcut for calling <code>get(index, Integer.<jk>class</jk>)</code>.
-        *
-        * @param index The index.
-        * @return The converted value.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Integer getInt(int index) {
-               return get(index, Integer.class);
-       }
-
-       /**
-        * Shortcut for calling <code>get(index, Boolean.<jk>class</jk>)</code>.
-        *
-        * @param index The index.
-        * @return The converted value.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Boolean getBoolean(int index) {
-               return get(index, Boolean.class);
-       }
-
-       /**
-        * Shortcut for calling <code>get(index, Long.<jk>class</jk>)</code>.
-        *
-        * @param index The index.
-        * @return The converted value.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Long getLong(int index) {
-               return get(index, Long.class);
-       }
-
-       /**
-        * Shortcut for calling <code>get(index, Map.<jk>class</jk>)</code>.
-        *
-        * @param index The index.
-        * @return The converted value.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Map<?,?> getMap(int index) {
-               return get(index, Map.class);
-       }
-
-       /**
-        * Same as {@link #getMap(int)} except converts the keys and values to 
the specified types.
-        *
-        * @param index The index.
-        * @param keyType The key type class.
-        * @param valType The value type class.
-        * @return The converted value.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public <K,V> Map<K,V> getMap(int index, Class<K> keyType, Class<V> 
valType) {
-               return bs2().convertToType(get(index), Map.class, keyType, 
valType);
-       }
-
-       /**
-        * Shortcut for calling <code>get(index, List.<jk>class</jk>)</code>.
-        *
-        * @param index The index.
-        * @return The converted value.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public List<?> getList(int index) {
-               return get(index, List.class);
-       }
-
-       /**
-        * Same as {@link #getList(int)} except converts the elements to the 
specified types.
-        *
-        * @param index The index.
-        * @param elementType The element type class.
-        * @return The converted value.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public <E> List<E> getList(int index, Class<E> elementType) {
-               return bs2().convertToType(get(index), List.class, elementType);
-       }
-
-       /**
-        * Shortcut for calling <code>get(index, 
ObjectMap.<jk>class</jk>)</code>.
-        *
-        * @param index The index.
-        * @return The converted value.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectMap getObjectMap(int index) {
-               return get(index, ObjectMap.class);
-       }
-
-       /**
-        * Shortcut for calling <code>get(index, 
ObjectList.<jk>class</jk>)</code>.
-        *
-        * @param index The index.
-        * @return The converted value.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectList getObjectList(int index) {
-               return get(index, ObjectList.class);
-       }
-
-       /**
-        * Same as {@link #get(int,Class) get(int,Class)}, but the key is a 
slash-delimited path used to traverse entries in
-        * this POJO.
-        *
-        * <p>
-        * For example, the following code is equivalent:
-        * </p>
-        * <p class='bcode w800'>
-        *      ObjectMap m = getObjectMap();
-        *
-        *      <jc>// Long way</jc>
-        *      <jk>long</jk> l = 
m.getObjectMap(<js>"foo"</js>).getObjectList(<js>"bar"</js>).getObjectMap(<js>"0"</js>).getLong(<js>"baz"</js>);
-        *
-        *      <jc>// Using this method</jc>
-        *      <jk>long</jk> l = m.getAt(<js>"foo/bar/0/baz"</js>, 
<jk>long</jk>.<jk>class</jk>);
-        * </p>
-        *
-        * <p>
-        * This method uses the {@link PojoRest} class to perform the lookup, 
so the map can contain any of the various
-        * class types that the {@link PojoRest} class supports (e.g. beans, 
collections, arrays).
-        *
-        * @param path The path to the entry.
-        * @param type The class type.
-        *
-        * @param <T> The class type.
-        * @return The value, or <jk>null</jk> if the entry doesn't exist.
-        */
-       public <T> T getAt(String path, Class<T> type) {
-               return getPojoRest().get(path, type);
-       }
-
-       /**
-        * Same as {@link #getAt(String,Class)}, but allows for conversion to 
complex maps and collections.
-        *
-        * @param path The path to the entry.
-        * @param type The class type.
-        * @param args The class parameter types.
-        *
-        * @param <T> The class type.
-        * @return The value, or <jk>null</jk> if the entry doesn't exist.
-        */
-       public <T> T getAt(String path, Type type, Type...args) {
-               return getPojoRest().get(path, type, args);
-       }
-
-       /**
-        * Same as {@link #set(int,Object) set(int,Object)}, but the key is a 
slash-delimited path used to traverse entries
-        * in this POJO.
-        *
-        * <p>
-        * For example, the following code is equivalent:
-        * </p>
-        * <p class='bcode w800'>
-        *      ObjectMap m = getObjectMap();
-        *
-        *      <jc>// Long way</jc>
-        *      
m.getObjectMap(<js>"foo"</js>).getObjectList(<js>"bar"</js>).getObjectMap(<js>"0"</js>).put(<js>"baz"</js>,
 123);
-        *
-        *      <jc>// Using this method</jc>
-        *      m.putAt(<js>"foo/bar/0/baz"</js>, 123);
-        * </p>
-        *
-        * <p>
-        * This method uses the {@link PojoRest} class to perform the lookup, 
so the map can contain any of the various
-        * class types that the {@link PojoRest} class supports (e.g. beans, 
collections, arrays).
-        *
-        * @param path The path to the entry.
-        * @param o The new value.
-        * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
-        */
-       public Object putAt(String path, Object o) {
-               return getPojoRest().put(path, o);
-       }
-
-       /**
-        * Similar to {@link #putAt(String,Object) putAt(String,Object)}, but 
used to append to collections and arrays.
-        *
-        * <p>
-        * For example, the following code is equivalent:
-        * </p>
-        * <p class='bcode w800'>
-        *      ObjectMap m = getObjectMap();
-        *
-        *      <jc>// Long way</jc>
-        *      
m.getObjectMap(<js>"foo"</js>).getObjectList(<js>"bar"</js>).append(123);
-        *
-        *      <jc>// Using this method</jc>
-        *      m.postAt(<js>"foo/bar"</js>, 123);
-        * </p>
-        *
-        * <p>
-        * This method uses the {@link PojoRest} class to perform the lookup, 
so the map can contain any of the various
-        * class types that the {@link PojoRest} class supports (e.g. beans, 
collections, arrays).
-        *
-        * @param path The path to the entry.
-        * @param o The new value.
-        * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
-        */
-       public Object postAt(String path, Object o) {
-               return getPojoRest().post(path, o);
-       }
-
-       /**
-        * Similar to {@link #remove(int) remove(int)},but the key is a 
slash-delimited path used to traverse entries in
-        * this POJO.
-        *
-        * <p>
-        * For example, the following code is equivalent:
-        * </p>
-        * <p class='bcode w800'>
-        *      ObjectMap m = getObjectMap();
-        *
-        *      <jc>// Long way</jc>
-        *      
m.getObjectMap(<js>"foo"</js>).getObjectList(<js>"bar"</js>).getObjectMap(1).remove(<js>"baz"</js>);
-        *
-        *      <jc>// Using this method</jc>
-        *      m.deleteAt(<js>"foo/bar/0/baz"</js>);
-        * </p>
-        *
-        * <p>
-        * This method uses the {@link PojoRest} class to perform the lookup, 
so the map can contain any of the various
-        * class types that the {@link PojoRest} class supports (e.g. beans, 
collections, arrays).
-        *
-        * @param path The path to the entry.
-        * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
-        */
-       public Object deleteAt(String path) {
-               return getPojoRest().delete(path);
-       }
-
-       /**
-        * Creates an {@link Iterable} with elements of the specified child 
type.
-        *
-        * <p>
-        * Attempts to convert the child objects to the correct type if they 
aren't already the correct type.
-        *
-        * <p>
-        * The <c>next()</c> method on the returned iterator may throw a {@link 
InvalidDataConversionException} if
-        * the next element cannot be converted to the specified type.
-        *
-        * <p>
-        * See {@link BeanSession#convertToType(Object, ClassMeta)} for a 
description of valid conversions.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jc>// Iterate over a list of ObjectMaps.</jc>
-        *      ObjectList l = <jk>new</jk> 
ObjectList(<js>"[{foo:'bar'},{baz:123}]"</js>);
-        *      for (ObjectMap m : l.elements(ObjectMap.<jk>class</jk>)) {
-        *              <jc>// Do something with m.</jc>
-        *      }
-        *
-        *      <jc>// Iterate over a list of ints.</jc>
-        *      ObjectList l = <jk>new</jk> ObjectList(<js>"[1,2,3]"</js>);
-        *      for (Integer i : l.elements(Integer.<jk>class</jk>)) {
-        *              <jc>// Do something with i.</jc>
-        *      }
-        *
-        *      <jc>// Iterate over a list of beans.</jc>
-        *      <jc>// Automatically converts to beans.</jc>
-        *      ObjectList l = <jk>new</jk> ObjectList(<js>"[{name:'John 
Smith',age:45}]"</js>);
-        *      for (Person p : l.elements(Person.<jk>class</jk>)) {
-        *              <jc>// Do something with p.</jc>
-        *      }
-        * </p>
-        *
-        * @param <E> The child object type.
-        * @param childType The child object type.
-        * @return A new <c>Iterable</c> object over this list.
-        */
-       public <E> Iterable<E> elements(final Class<E> childType) {
-               final Iterator<?> i = iterator();
-               return new Iterable<E>() {
-
-                       @Override /* Iterable */
-                       public Iterator<E> iterator() {
-                               return new Iterator<E>() {
-
-                                       @Override /* Iterator */
-                                       public boolean hasNext() {
-                                               return i.hasNext();
-                                       }
-
-                                       @Override /* Iterator */
-                                       public E next() {
-                                               return 
bs2().convertToType(i.next(), childType);
-                                       }
-
-                                       @Override /* Iterator */
-                                       public void remove() {
-                                               i.remove();
-                                       }
-
-                               };
-                       }
-               };
-       }
-
-       /**
-        * Returns the {@link ClassMeta} of the class of the object at the 
specified index.
-        *
-        * @param index An index into this list, zero-based.
-        * @return The data type of the object at the specified index, or 
<jk>null</jk> if the value is null.
-        */
-       public ClassMeta<?> getClassMeta(int index) {
-               return bs2().getClassMetaForObject(get(index));
-       }
-
-       private PojoRest getPojoRest() {
-               if (pojoRest == null)
-                       pojoRest = new PojoRest(this);
-               return pojoRest;
-       }
-
-       /**
-        * Serialize this array to a string using the specified serializer.
-        *
-        * @param serializer The serializer to use to convert this object to a 
string.
-        * @return This object as a serialized string.
-        * @throws SerializeException If a problem occurred trying to convert 
the output.
-        */
-       public String toString(WriterSerializer serializer) throws 
SerializeException {
-               return serializer.serialize(this);
-       }
-
-       /**
-        * Returns <jk>true</jk> if this list is unmodifiable.
-        *
-        * @return <jk>true</jk> if this list is unmodifiable.
-        */
-       public boolean isUnmodifiable() {
-               return false;
-       }
-
-       /**
-        * Returns a modifiable copy of this list if it's unmodifiable.
-        *
-        * @return A modifiable copy of this list if it's unmodifiable, or this 
list if it is already modifiable.
-        */
-       public ObjectList modifiable() {
-               if (isUnmodifiable())
-                       return new ObjectList(this);
-               return this;
-       }
-
-       /**
-        * Returns an unmodifiable copy of this list if it's modifiable.
-        *
-        * @return An unmodifiable copy of this list if it's modifiable, or 
this list if it is already unmodifiable.
-        */
-       public ObjectList unmodifiable() {
-               if (this instanceof UnmodifiableObjectList)
-                       return this;
-               return new UnmodifiableObjectList(this);
-       }
-
-       /**
-        * Serialize this array to JSON using the {@link 
JsonSerializer#DEFAULT} serializer.
-        */
-       @Override /* Object */
-       public String toString() {
-               try {
-                       return this.toString(SimpleJsonSerializer.DEFAULT);
-               } catch (SerializeException e) {
-                       return e.getLocalizedMessage();
-               }
-       }
-
-       /**
-        * Convenience method for serializing this ObjectList to the specified 
Writer using the JsonSerializer.DEFAULT
-        * serializer.
-        *
-        * @param w The writer to send the serialized contents of this object.
-        * @throws IOException If a problem occurred trying to write to the 
writer.
-        * @throws SerializeException If a problem occurred trying to convert 
the output.
-        */
-       public void serializeTo(Writer w) throws IOException, 
SerializeException {
-               JsonSerializer.DEFAULT.serialize(this);
-       }
-
-       /**
-        * Converts this object into the specified class type.
-        *
-        * <p>
-        * TODO - The current implementation is very inefficient.
-        *
-        * @param cm The class type to convert this object to.
-        * @return A converted object.
-        */
-       public Object cast(ClassMeta<?> cm) {
-               try {
-                       return 
JsonParser.DEFAULT.parse(SimpleJsonSerializer.DEFAULT.serialize(this), cm);
-               } catch (ParseException | SerializeException e) {
-                       throw new RuntimeException(e);
-               }
-       }
-
-       private static final class UnmodifiableObjectList extends ObjectList {
-               private static final long serialVersionUID = 1L;
-
-               UnmodifiableObjectList(ObjectList contents) {
-                       super();
-                       if (contents != null) {
-                               for (Object e : this) {
-                                       super.add(e);
-                               }
-                       }
-               }
-
-               @Override /* List */
-               public void add(int location, Object object) {
-                       throw new UnsupportedOperationException("ObjectList is 
read-only.");
-               }
-
-               @Override /* List */
-               public Object remove(int location) {
-                       throw new UnsupportedOperationException("ObjectList is 
read-only.");
-               }
-
-               @Override /* List */
-               public Object set(int location, Object object) {
-                       throw new UnsupportedOperationException("ObjectList is 
read-only.");
-               }
-
-               @Override
-               public final boolean isUnmodifiable() {
-                       return true;
-               }
-       }
-
-       BeanSession bs2() {
-               if (session == null)
-                       session = BeanContext.DEFAULT.createBeanSession();
-               return session;
-       }
-}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java
deleted file mode 100644
index 8194cfc..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java
+++ /dev/null
@@ -1,1840 +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 static org.apache.juneau.internal.StringUtils.*;
-
-import java.io.*;
-import java.lang.reflect.*;
-import java.util.*;
-
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.*;
-import org.apache.juneau.parser.*;
-import org.apache.juneau.serializer.*;
-import org.apache.juneau.transform.*;
-import org.apache.juneau.utils.*;
-
-/**
- * Java implementation of a JSON object.
- *
- * <p>
- * An extension of {@link LinkedHashMap}, so all methods available in that 
class are also available to this class.
- * <p>
- * Note that the use of this class is optional.
- * The serializers will accept any objects that implement the {@link 
java.util.Map} interface.
- * But this class provides some useful additional functionality when working 
with JSON models constructed from Java
- * Collections Framework objects.
- * For example, a constructor is provided for converting a JSON object string 
directly into a {@link Map}.
- * It also contains accessor methods for to avoid common typecasting when 
accessing elements in a list.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- *     <jc>// Construct an empty Map</jc>
- *     Map m = <jk>new</jk> ObjectMap();
- *
- *     <jc>// Construct a Map from JSON</jc>
- *     String json = <js>"{a:'A',b:{c:'C',d:123}}"</js>;
- *     m = <jk>new</jk> ObjectMap(json);
- *
- *     <jc>// Construct a Map using the append method</jc>
- *     m = <jk>new</jk> 
ObjectMap().append(<js>"foo"</js>,<js>"x"</js>).append(<js>"bar"</js>,123)
- *             .append(<js>"baz"</js>,<jk>true</jk>);
- *
- *     <jc>// Construct a Map from XML generated by XmlSerializer</jc>
- *     String xml = <js>"&lt;object&gt;&lt;a type='string'&gt;A&lt;/a&gt;&lt;b 
type='object'&gt;&lt;c type='string'&gt;C&lt;/c&gt;&lt;d 
type='number'&gt;123&lt;/d&gt;&lt;/b&gt;&lt;/object&gt;"</js>;
- *     m = <jk>new</jk> ObjectMap(xml, DataFormat.<jsf>XML</jsf>);
- *     m = (Map)XmlParser.<jsf>DEFAULT</jsf>.parse(xml); <jc>// Equivalent</jc>
- *     m = (Map)XmlParser.<jsf>DEFAULT</jsf>.parse(Object.<jk>class</jk>, 
xml); <jc>// Equivalent</jc>
- *     m = XmlParser.<jsf>DEFAULT</jsf>.parse(Map.<jk>class</jk>, xml); <jc>// 
Equivalent</jc>
- *     m = XmlParser.<jsf>DEFAULT</jsf>.parse(ObjectMap.<jk>class</jk>, xml); 
<jc>// Equivalent</jc>
- *
- *     <jc>// Construct a Map from a URL GET parameter string generated by 
UrlEncodingParser</jc>
- *     String urlParams = <js>"?a='A'&amp;b={c:'C',d:123}"</js>;
- *     m = <jk>new</jk> ObjectMap(urlParams, DataFormat.<jsf>URLPARAM</jsf>);
- *     m = 
(Map)UrlEncodingParser.<jsf>DEFAULT</jsf>.parse(Object.<jk>class</jk>, xml); 
<jc>// Equivalent</jc>
- *     m = UrlEncodingParser.<jsf>DEFAULT</jsf>.parse(Map.<jk>class</jk>, 
xml); <jc>// Equivalent</jc>
- *     m = 
UrlEncodingParser.<jsf>DEFAULT</jsf>.parse(ObjectMap.<jk>class</jk>, xml); 
<jc>// Equivalent</jc>
- *
- *     <jc>// Construct JSON from ObjectMap</jc>
- *     m = <jk>new</jk> ObjectMap(<js>"{foo:'bar'},{baz:[123,true]}"</js>);
- *     json = m.toString();  <jc>// Produces 
"{foo:'bar'},{baz:[123,true]}"</jc>
- *     json = m.toString(JsonSerializer.<jsf>DEFAULT_CONDENSED</jsf>);  <jc>// 
Equivalent</jc>
- *     json = JsonSerializer.<jsf>DEFAULT_CONDENSED</jsf>.serialize(m);  
<jc>// Equivalent</jc>
- *
- *     <jc>// Get a map entry as an Integer</jc>
- *     m = <jk>new</jk> ObjectMap(<js>"{foo:123}"</js>);
- *     Integer i = m.getInt(<js>"foo"</js>);
- *     i = m.get(Integer.<jk>class</jk>, <js>"foo"</js>);  <jc>// 
Equivalent</jc>
- *
- *     <jc>// Get a map entry as a Float</jc>
- *     m = <jk>new</jk> ObjectMap(<js>"{foo:123}"</js>);
- *     Float f = m.getFloat(<js>"foo"</js>);
- *     f = m.get(Float.<jk>class</jk>, <js>"foo"</js>);  <jc>// Equivalent</jc>
- *
- *     <jc>// Same as above, except converted to a String</jc>
- *     m = <jk>new</jk> ObjectMap(<js>"{foo:123}"</js>);
- *     String s = m.getString(<js>"foo"</js>); <jc>// Returns "123"</jc>
- *     s = m.get(String.<jk>class</jk>, <js>"foo"</js>);  <jc>// 
Equivalent</jc>
- *
- *     <jc>// Get one of the entries in the list as a bean (converted to a 
bean if it isn't already one)</jc>
- *     m = <jk>new</jk> ObjectMap(<js>"{person:{name:'John 
Smith',age:45}}"</js>);
- *     Person p = m.get(Person.<jk>class</jk>, <js>"person"</js>);
- *
- *     <jc>// Add an inner map</jc>
- *     ObjectMap m1 = <jk>new</jk> ObjectMap(<js>"{a:1}"</js>);
- *     ObjectMap m2 = <jk>new</jk> ObjectMap(<js>"{b:2}"</js>).setInner(m1);
- *     <jk>int</jk> a = m2.getInt(<js>"a"</js>);  <jc>// a == 1 </jc>
- * </p>
- *
- * <p>
- * This class is not thread safe.
- */
-public class ObjectMap extends LinkedHashMap<String,Object> {
-       private static final long serialVersionUID = 1L;
-
-       private transient BeanSession session;
-       private Map<String,Object> inner;
-       private transient PojoRest pojoRest;
-
-       /**
-        * An empty read-only ObjectMap.
-        */
-       public static final ObjectMap EMPTY_MAP = new ObjectMap() {
-
-               private static final long serialVersionUID = 1L;
-
-               @Override /* Map */
-               public Set<Map.Entry<String,Object>> entrySet() {
-                       return Collections.<String,Object>emptyMap().entrySet();
-               }
-
-               @Override /* Map */
-               public Set<String> keySet() {
-                       return Collections.<String,Object>emptyMap().keySet();
-               }
-
-               @Override /* Map */
-               public Object put(String key, Object value) {
-                       throw new UnsupportedOperationException();
-               }
-
-               @Override /* Map */
-               public Object remove(Object key) {
-                       throw new UnsupportedOperationException();
-               }
-
-               @Override /* Map */
-               public Collection<Object> values() {
-                       return Collections.emptyMap().values();
-               }
-       };
-
-       /**
-        * Construct an ObjectMap directly from a string using the specified 
parser.
-        *
-        * @param s The string being parsed.
-        * @param p The parser to use to parse the input.
-        * @throws ParseException Malformed input encountered.
-        */
-       public ObjectMap(CharSequence s, Parser p) throws ParseException {
-               this(p == null ? null : p.createBeanSession());
-               if (p == null)
-                       p = JsonParser.DEFAULT;
-               if (! StringUtils.isEmpty(s))
-                       p.parseIntoMap(s, this, bs().string(), bs().object());
-       }
-
-       /**
-        * Static constructor from JSON string.
-        *
-        * @param s JSON initialization string.  Can be <jk>null</jk>.
-        * @return A new {@link ObjectMap} object, or <jk>null</jk> if the 
input is <jk>null</jk>.
-        * @throws ParseException Invalid JSON string.
-        */
-       public static ObjectMap parse(CharSequence s) throws ParseException {
-               return s == null ? null : new ObjectMap(s);
-       }
-
-       /**
-        * Shortcut for <code><jk>new</jk> 
ObjectMap(string,JsonParser.<jsf>DEFAULT</jsf>);</code>
-        *
-        * @param s The JSON text to parse.
-        * @throws ParseException Malformed input encountered.
-        */
-       public ObjectMap(CharSequence s) throws ParseException {
-               this(s, null);
-       }
-
-       /**
-        * Construct an ObjectMap directly from a reader using the specified 
parser.
-        *
-        * @param r The reader to read from.  The reader will be wrapped in a 
{@link BufferedReader} if it isn't already.
-        * @param p The parser to use to parse the input.
-        * @throws ParseException If the input contains a syntax error or is 
malformed.
-        * @throws IOException If a problem occurred trying to read from the 
reader.
-        */
-       public ObjectMap(Reader r, Parser p) throws ParseException, IOException 
{
-               this(p == null ? null : p.createBeanSession());
-               parseReader(r, p);
-       }
-
-       /**
-        * Shortcut for <code><jk>new</jk> ObjectMap(reader, 
JsonParser.<jsf>DEFAULT</jsf>)</code>.
-        *
-        * @param r The reader to read from.  The reader will be wrapped in a 
{@link BufferedReader} if it isn't already.
-        * @throws ParseException Malformed input encountered.
-        * @throws IOException If a problem occurred trying to read from the 
reader.
-        */
-       public ObjectMap(Reader r) throws ParseException, IOException {
-               parseReader(r, JsonParser.DEFAULT);
-       }
-
-       /**
-        * Construct a JSON map and fill it with the specified freeform 
key-value pairs.
-        *
-        * <h5 class='section'>Examples:</h5>
-        * <p class='bcode w800'>
-        *      ObjectMap m = <jk>new</jk> 
ObjectMap(<js>"key1"</js>,<js>"val1"</js>,<js>"key2"</js>,<js>"val2"</js>);
-        * </p>
-        *
-        * @param o A list of key/value pairs to add to this map.
-        */
-       public ObjectMap(Object... o) {
-               if (o.length % 2 != 0)
-                       throw new RuntimeException("Odd number of parameters 
passed into ObjectMap(Object...)");
-               for (int i = 0; i < o.length; i+=2)
-                       put(stringify(o[i]), o[i+1]);
-       }
-
-
-       private void parseReader(Reader r, Parser p) throws ParseException {
-               if (p == null)
-                       p = JsonParser.DEFAULT;
-               p.parseIntoMap(r, this, bs().string(), bs().object());
-       }
-
-       /**
-        * Construct an empty JSON object (an empty {@link LinkedHashMap}).
-        */
-       public ObjectMap() {
-       }
-
-       /**
-        * Construct an empty JSON object (an empty {@link LinkedHashMap}) with 
the specified bean context.
-        *
-        * @param session The bean session to use for creating beans.
-        */
-       public ObjectMap(BeanSession session) {
-               this.session = session;
-       }
-
-       /**
-        * Construct a JSON object and fill it with the contents from the 
specified {@link Map}.
-        *
-        * @param m The map whose entries will be copied into this map.
-        */
-       public ObjectMap(Map<?,?> m) {
-               this();
-               if (m != null)
-                       for (Map.Entry<?,?> e : m.entrySet())
-                               put(e.getKey().toString(), e.getValue());
-       }
-
-       /**
-        * Set an inner map in this map to allow for chained get calls.
-        *
-        * <p>
-        * If {@link #get(Object)} returns <jk>null</jk>, then {@link 
#get(Object)} will be called on the inner map.
-        *
-        * <p>
-        * In addition to providing the ability to chain maps, this method also 
provides the ability to wrap an existing map
-        * inside another map so that you can add entries to the outer map 
without affecting the values on the inner map.
-        *
-        * <p class='bcode w800'>
-        *      ObjectMap m1 = <jk>new</jk> ObjectMap(<js>"{foo:1}"</js>);
-        *      ObjectMap m2 = <jk>new</jk> ObjectMap().setInner(m1);
-        *      m2.put(<js>"foo"</js>, 2);                      <jc>// 
Overwrite the entry</jc>
-        *      <jk>int</jk> foo1 = m1.getInt(<js>"foo"</js>);           <jc>// 
foo1 == 1 </jc>
-        *      <jk>int</jk> foo2 = m2.getInt(<js>"foo"</js>);           <jc>// 
foo2 == 2 </jc>
-        * </p>
-        *
-        * @param inner
-        *      The inner map.
-        *      Can be <jk>null</jk> to remove the inner map from an existing 
map.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap setInner(Map<String,Object> inner) {
-               this.inner = inner;
-               return this;
-       }
-
-       /**
-        * Searches for the specified key in this map ignoring case.
-        *
-        * @param key
-        *      The key to search for.
-        *      For performance reasons, it's preferable that the key be all 
lowercase.
-        * @return The key, or <jk>null</jk> if map does not contain this key.
-        */
-       public String findKeyIgnoreCase(String key) {
-               for (String k : keySet())
-                       if (key.equalsIgnoreCase(k))
-                               return k;
-               return null;
-       }
-
-       /**
-        * Override the default bean session used for converting POJOs.
-        *
-        * <p>
-        * Default is {@link BeanContext#DEFAULT}, which is sufficient in most 
cases.
-        *
-        * <p>
-        * Useful if you're serializing/parsing beans with transforms defined.
-        *
-        * @param session The new bean session.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap setBeanSession(BeanSession session) {
-               this.session = session;
-               return this;
-       }
-
-       /**
-        * Returns the {@link BeanSession} currently associated with this map.
-        *
-        * @return The {@link BeanSession} currently associated with this map.
-        */
-       public BeanSession getBeanSession() {
-               return session;
-       }
-
-       /**
-        * Convenience method for adding an entry to this map.
-        *
-        * <p>
-        * Equivalent to calling {@code put(key, value)}, but returns this map 
so that the method can be chained.
-        *
-        * @param key The key.
-        * @param value The value.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap append(String key, Object value) {
-               put(key, value);
-               return this;
-       }
-
-       /**
-        * Conditionally appends a value to this map.
-        *
-        * @param overwrite Overwrite the previous value if there was one.
-        * @param skipNullValue Skip adding the value if the value is 
<jk>null</jk>.
-        * @param skipEmptyValue Skip adding the value if the value is an empty 
string.
-        * @param key The key.
-        * @param value The value.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap appendIf(boolean overwrite, boolean skipNullValue, 
boolean skipEmptyValue, String key, Object value) {
-               if (value == null && skipNullValue)
-                       return this;
-               if (skipEmptyValue && ObjectUtils.isEmpty(value))
-                       return this;
-               Object current = get(key);
-               if (current == null || overwrite)
-                       put(key, value);
-               return this;
-       }
-
-       /**
-        * Conditionally appends a value to this map.
-        *
-        * @param flag The boolean value that must be <jk>true</jk> in order to 
add this entry..
-        * @param key The key.
-        * @param value The value.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap appendIf(boolean flag, String key, Object value) {
-               if (flag)
-                       put(key, value);
-               return this;
-       }
-
-       /**
-        * Convenience method for adding an entry to this map.
-        *
-        * <p>
-        * A no-op if the value is <jk>null</jk> or an empty 
string/map/collection.
-        *
-        * @param key The key.
-        * @param value The value.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap appendSkipEmpty(String key, Object value) {
-               return appendIf(true, true, true, key, value);
-       }
-
-       /**
-        * Convenience method for adding an entry to this map.
-        *
-        * <p>
-        * A no-op if the value is <jk>false</jk>.
-        *
-        * @param key The key.
-        * @param value The value.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap appendSkipFalse(String key, boolean value) {
-               if (value)
-                       append(key, value);
-               return this;
-       }
-
-       /**
-        * Convenience method for adding an entry to this map.
-        *
-        * <p>
-        * A no-op if the value is <c>-1</c>.
-        *
-        * @param key The key.
-        * @param value The value.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap appendSkipMinusOne(String key, Number value) {
-               if (value != null && value.intValue() != -1)
-                       append(key, value);
-               return this;
-       }
-
-       /**
-        * Convenience method for adding an entry to this map.
-        *
-        * <p>
-        * Equivalent to calling {@code put(key, value)}, but returns this map 
so that the method can be chained.
-        *
-        * <p>
-        * <jk>null</jk> values are skipped.
-        *
-        * @param key The key.
-        * @param value The value.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap appendSkipNull(String key, Object value) {
-               if (value != null)
-                       append(key, value);
-               return this;
-       }
-
-       /**
-        * Convenience method for adding a contents of another map to this map.
-        *
-        * <p>
-        * Equivalent to calling {@code putAll(m)}, but returns this map so 
that the method can be chained.
-        *
-        * @param m The map whose contents should be added to this map.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap appendAll(Map<String,Object> m) {
-               if (m != null)
-                       putAll(m);
-               return this;
-       }
-
-       @Override /* Map */
-       public Object get(Object key) {
-               Object o = super.get(key);
-               if (o == null && inner != null)
-                       o = inner.get(key);
-               return o;
-       }
-
-       /**
-        * Same as {@link Map#get(Object) get()}, but casts or converts the 
value to the specified class type.
-        *
-        * <p>
-        * This is the preferred get method for simple types.
-        *
-        * <h5 class='section'>Examples:</h5>
-        * <p class='bcode w800'>
-        *      ObjectMap m = <jk>new</jk> ObjectMap(<js>"..."</js>);
-        *
-        *      <jc>// Value converted to a string.</jc>
-        *      String s = m.get(<js>"key1"</js>, String.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a bean.</jc>
-        *      MyBean b = m.get(<js>"key2"</js>, MyBean.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a bean array.</jc>
-        *      MyBean[] ba = m.get(<js>"key3"</js>, MyBean[].<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a linked-list of objects.</jc>
-        *      List l = m.get(<js>"key4"</js>, LinkedList.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a map of object keys/values.</jc>
-        *      Map m2 = m.get(<js>"key5"</js>, TreeMap.<jk>class</jk>);
-        * </p>
-        *
-        * <p>
-        * See {@link BeanSession#convertToType(Object, ClassMeta)} for the 
list of valid data conversions.
-        *
-        * @param key The key.
-        * @param <T> The class type returned.
-        * @param type The class type returned.
-        * @return The value, or <jk>null</jk> if the entry doesn't exist.
-        */
-       public <T> T get(String key, Class<T> type) {
-               return getWithDefault(key, (T)null, type);
-       }
-
-       /**
-        * Same as {@link #get(String,Class)}, but allows for complex data 
types consisting of collections or maps.
-        *
-        * <p>
-        * The type can be a simple type (e.g. beans, strings, numbers) or 
parameterized type (collections/maps).
-        *
-        * <h5 class='section'>Examples:</h5>
-        * <p class='bcode w800'>
-        *      ObjectMap m = <jk>new</jk> ObjectMap(<js>"..."</js>);
-        *
-        *      <jc>// Value converted to a linked-list of strings.</jc>
-        *      List&lt;String&gt; l1 = m.get(<js>"key1"</js>, 
LinkedList.<jk>class</jk>, String.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a linked-list of beans.</jc>
-        *      List&lt;MyBean&gt; l2 = m.get(<js>"key2"</js>, 
LinkedList.<jk>class</jk>, MyBean.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a linked-list of linked-lists of 
strings.</jc>
-        *      List&lt;List&lt;String&gt;&gt; l3 = m.get(<js>"key3"</js>, 
LinkedList.<jk>class</jk>, LinkedList.<jk>class</jk>, String.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a map of string keys/values.</jc>
-        *      Map&lt;String,String&gt; m1 = m.get(<js>"key4"</js>, 
TreeMap.<jk>class</jk>, String.<jk>class</jk>, String.<jk>class</jk>);
-        *
-        *      <jc>// Value converted to a map containing string keys and 
values of lists containing beans.</jc>
-        *      Map&lt;String,List&lt;MyBean&gt;&gt; m2 = 
m.get(<js>"key5"</js>, TreeMap.<jk>class</jk>, String.<jk>class</jk>, 
List.<jk>class</jk>, MyBean.<jk>class</jk>);
-        * </p>
-        *
-        * <p>
-        * <c>Collection</c> classes are assumed to be followed by zero or one 
objects indicating the element type.
-        *
-        * <p>
-        * <c>Map</c> classes are assumed to be followed by zero or two meta 
objects indicating the key and value types.
-        *
-        * <p>
-        * The array can be arbitrarily long to indicate arbitrarily complex 
data structures.
-        *
-        * <p>
-        * See {@link BeanSession#convertToType(Object, ClassMeta)} for the 
list of valid data conversions.
-        *
-        * <ul class='notes'>
-        *      <li>
-        *              Use the {@link #get(String, Class)} method instead if 
you don't need a parameterized map/collection.
-        * </ul>
-        *
-        * @param key The key.
-        * @param <T> The class type returned.
-        * @param type The class type returned.
-        * @param args The class type parameters.
-        * @return The value, or <jk>null</jk> if the entry doesn't exist.
-        */
-       public <T> T get(String key, Type type, Type...args) {
-               return getWithDefault(key, null, type, args);
-       }
-
-       /**
-        * Same as {@link Map#get(Object) get()}, but returns the default value 
if the key could not be found.
-        *
-        * @param key The key.
-        * @param def The default value if the entry doesn't exist.
-        * @return The value, or the default value if the entry doesn't exist.
-        */
-       public Object getWithDefault(String key, Object def) {
-               Object o = get(key);
-               return (o == null ? def : o);
-       }
-
-       /**
-        * Same as {@link #get(String,Class)} but returns a default value if 
the value does not exist.
-        *
-        * @param key The key.
-        * @param def The default value.  Can be <jk>null</jk>.
-        * @param <T> The class type returned.
-        * @param type The class type returned.
-        * @return The value, or <jk>null</jk> if the entry doesn't exist.
-        */
-       public <T> T getWithDefault(String key, T def, Class<T> type) {
-               return getWithDefault(key, def, type, new Type[0]);
-       }
-
-       /**
-        * Same as {@link #get(String,Type,Type...)} but returns a default 
value if the value does not exist.
-        *
-        * @param key The key.
-        * @param def The default value.  Can be <jk>null</jk>.
-        * @param <T> The class type returned.
-        * @param type The class type returned.
-        * @param args The class type parameters.
-        * @return The value, or <jk>null</jk> if the entry doesn't exist.
-        */
-       public <T> T getWithDefault(String key, T def, Type type, Type...args) {
-               Object o = get(key);
-               if (o == null)
-                       return def;
-               T t = bs().convertToType(o, type, args);
-               return t == null ? def : t;
-       }
-
-
-       /**
-        * Same as {@link Map#get(Object) get()}, but converts the raw value to 
the specified class type using the specified
-        * POJO swap.
-        *
-        * @param key The key.
-        * @param pojoSwap The swap class used to convert the raw type to a 
transformed type.
-        * @param <T> The transformed class type.
-        * @return The value, or <jk>null</jk> if the entry doesn't exist.
-        * @throws ParseException Malformed input encountered.
-        */
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       public <T> T getSwapped(String key, PojoSwap<T,?> pojoSwap) throws 
ParseException {
-               try {
-                       Object o = super.get(key);
-                       if (o == null)
-                               return null;
-                       PojoSwap swap = pojoSwap;
-                       return (T) swap.unswap(bs(), o, null);
-               } catch (ParseException e) {
-                       throw e;
-               } catch (Exception e) {
-                       throw new ParseException(e);
-               }
-       }
-
-       /**
-        * Returns the value for the first key in the list that has an entry in 
this map.
-        *
-        * @param keys The keys to look up in order.
-        * @return The value of the first entry whose key exists, or 
<jk>null</jk> if none of the keys exist in this map.
-        */
-       public Object find(String...keys) {
-               for (String key : keys)
-                       if (containsKey(key))
-                               return get(key);
-               return null;
-       }
-
-       /**
-        * Returns the value for the first key in the list that has an entry in 
this map.
-        *
-        * <p>
-        * Casts or converts the value to the specified class type.
-        *
-        * <p>
-        * See {@link BeanSession#convertToType(Object, ClassMeta)} for the 
list of valid data conversions.
-        *
-        * @param type The class type to convert the value to.
-        * @param <T> The class type to convert the value to.
-        * @param keys The keys to look up in order.
-        * @return The value of the first entry whose key exists, or 
<jk>null</jk> if none of the keys exist in this map.
-        */
-       public <T> T find(Class<T> type, String...keys) {
-               for (String key : keys)
-                       if (containsKey(key))
-                               return get(key, type);
-               return null;
-       }
-
-       /**
-        * Same as {@link #get(String,Class) get(String,Class)}, but the key is 
a slash-delimited path used to traverse
-        * entries in this POJO.
-        *
-        * <p>
-        * For example, the following code is equivalent:
-        * </p>
-        * <p class='bcode w800'>
-        *      ObjectMap m = getObjectMap();
-        *
-        *      <jc>// Long way</jc>
-        *      <jk>long</jk> l = 
m.getObjectMap(<js>"foo"</js>).getObjectList(<js>"bar"</js>).getObjectMap(<js>"0"</js>)
-        *              .getLong(<js>"baz"</js>);
-        *
-        *      <jc>// Using this method</jc>
-        *      <jk>long</jk> l = m.getAt(<js>"foo/bar/0/baz"</js>, 
<jk>long</jk>.<jk>class</jk>);
-        * </p>
-        *
-        * <p>
-        * This method uses the {@link PojoRest} class to perform the lookup, 
so the map can contain any of the various
-        * class types that the {@link PojoRest} class supports (e.g. beans, 
collections, arrays).
-        *
-        * @param path The path to the entry.
-        * @param type The class type.
-        *
-        * @param <T> The class type.
-        * @return The value, or <jk>null</jk> if the entry doesn't exist.
-        */
-       public <T> T getAt(String path, Class<T> type) {
-               return getPojoRest().get(path, type);
-       }
-
-       /**
-        * Same as {@link #getAt(String,Class)}, but allows for conversion to 
complex maps and collections.
-        *
-        * <p>
-        * This method uses the {@link PojoRest} class to perform the lookup, 
so the map can contain any of the various
-        * class types that the {@link PojoRest} class supports (e.g. beans, 
collections, arrays).
-        *
-        * @param path The path to the entry.
-        * @param type The class type.
-        * @param args The class parameter types.
-        *
-        * @param <T> The class type.
-        * @return The value, or <jk>null</jk> if the entry doesn't exist.
-        */
-       public <T> T getAt(String path, Type type, Type...args) {
-               return getPojoRest().get(path, type, args);
-       }
-
-       /**
-        * Same as <c>put(String,Object)</c>, but the key is a slash-delimited 
path used to traverse entries in this
-        * POJO.
-        *
-        * <p>
-        * For example, the following code is equivalent:
-        * </p>
-        * <p class='bcode w800'>
-        *      ObjectMap m = getObjectMap();
-        *
-        *      <jc>// Long way</jc>
-        *      
m.getObjectMap(<js>"foo"</js>).getObjectList(<js>"bar"</js>).getObjectMap(<js>"0"</js>)
-        *              .put(<js>"baz"</js>, 123);
-        *
-        *      <jc>// Using this method</jc>
-        *      m.putAt(<js>"foo/bar/0/baz"</js>, 123);
-        * </p>
-        *
-        * <p>
-        * This method uses the {@link PojoRest} class to perform the lookup, 
so the map can contain any of the various
-        * class types that the {@link PojoRest} class supports (e.g. beans, 
collections, arrays).
-        *
-        * @param path The path to the entry.
-        * @param o The new value.
-        * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
-        */
-       public Object putAt(String path, Object o) {
-               return getPojoRest().put(path, o);
-       }
-
-       /**
-        * Similar to {@link #putAt(String,Object) putAt(String,Object)}, but 
used to append to collections and arrays.
-        *
-        * <p>
-        * For example, the following code is equivalent:
-        * </p>
-        * <p class='bcode w800'>
-        *      ObjectMap m = getObjectMap();
-        *
-        *      <jc>// Long way</jc>
-        *      
m.getObjectMap(<js>"foo"</js>).getObjectList(<js>"bar"</js>).append(123);
-        *
-        *      <jc>// Using this method</jc>
-        *      m.postAt(<js>"foo/bar"</js>, 123);
-        * </p>
-        *
-        * <p>
-        * This method uses the {@link PojoRest} class to perform the lookup, 
so the map can contain any of the various
-        * class types that the {@link PojoRest} class supports (e.g. beans, 
collections, arrays).
-        *
-        * @param path The path to the entry.
-        * @param o The new value.
-        * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
-        */
-       public Object postAt(String path, Object o) {
-               return getPojoRest().post(path, o);
-       }
-
-       /**
-        * Similar to {@link #remove(Object) remove(Object)}, but the key is a 
slash-delimited path used to traverse entries
-        * in this POJO.
-        *
-        * <p>
-        * For example, the following code is equivalent:
-        * </p>
-        * <p class='bcode w800'>
-        *      ObjectMap m = getObjectMap();
-        *
-        *      <jc>// Long way</jc>
-        *      
m.getObjectMap(<js>"foo"</js>).getObjectList(<js>"bar"</js>).getObjectMap(0).remove(<js>"baz"</js>);
-        *
-        *      <jc>// Using this method</jc>
-        *      m.deleteAt(<js>"foo/bar/0/baz"</js>);
-        * </p>
-        *
-        * <p>
-        * This method uses the {@link PojoRest} class to perform the lookup, 
so the map can contain any of the various
-        * class types that the {@link PojoRest} class supports (e.g. beans, 
collections, arrays).
-        *
-        * @param path The path to the entry.
-        * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
-        */
-       public Object deleteAt(String path) {
-               return getPojoRest().delete(path);
-       }
-
-       /**
-        * Convenience method for inserting JSON directly into an attribute on 
this object.
-        *
-        * <p>
-        * The JSON text can be an object (i.e. <js>"{...}"</js>) or an array 
(i.e. <js>"[...]"</js>).
-        *
-        * @param key The key.
-        * @param json The JSON text that will be parsed into an Object and 
then inserted into this map.
-        * @throws ParseException Malformed input encountered.
-        */
-       public void putJson(String key, String json) throws ParseException {
-               this.put(key, JsonParser.DEFAULT.parse(json, Object.class));
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link String}.
-        *
-        * <p>
-        * Shortcut for <code>get(key, String.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        */
-       public String getString(String key) {
-               return get(key, String.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link String}.
-        *
-        * <p>
-        * Shortcut for <code>get(key, String[].<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        */
-       public String[] getStringArray(String key) {
-               return getStringArray(key, null);
-       }
-
-       /**
-        * Same as {@link #getStringArray(String)} but returns a default value 
if the value cannot be found.
-        *
-        * @param key The map key.
-        * @param def The default value if value is not found.
-        * @return The value converted to a string array.
-        */
-       public String[] getStringArray(String key, String[] def) {
-               Object s = get(key, Object.class);
-               if (s == null)
-                       return def;
-               String[] r = null;
-               if (s instanceof Collection)
-                       r = ArrayUtils.toStringArray((Collection<?>)s);
-               else if (s instanceof String[])
-                       r = (String[])s;
-               else if (s instanceof Object[])
-                       r = 
ArrayUtils.toStringArray(Arrays.asList((Object[])s));
-               else
-                       r = split(stringify(s));
-               return (r.length == 0 ? def : r);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link String}.
-        *
-        * <p>
-        * Shortcut for <code>getWithDefault(key, defVal, 
String.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param defVal The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        */
-       public String getString(String key, String defVal) {
-               return getWithDefault(key, defVal, String.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to an {@link Integer}.
-        *
-        * <p>
-        * Shortcut for <code>get(key, Integer.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Integer getInt(String key) {
-               return get(key, Integer.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to an {@link Integer}.
-        *
-        * <p>
-        * Shortcut for <code>getWithDefault(key, defVal, 
Integer.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param defVal The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Integer getInt(String key, Integer defVal) {
-               return getWithDefault(key, defVal, Integer.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link Long}.
-        *
-        * <p>
-        * Shortcut for <code>get(key, Long.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Long getLong(String key) {
-               return get(key, Long.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link Long}.
-        *
-        * <p>
-        * Shortcut for <code>getWithDefault(key, defVal, 
Long.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param defVal The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Long getLong(String key, Long defVal) {
-               return getWithDefault(key, defVal, Long.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link Boolean}.
-        *
-        * <p>
-        * Shortcut for <code>get(key, Boolean.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Boolean getBoolean(String key) {
-               return get(key, Boolean.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link Boolean}.
-        *
-        * <p>
-        * Shortcut for <code>getWithDefault(key, defVal, 
Boolean.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param defVal The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Boolean getBoolean(String key, Boolean defVal) {
-               return getWithDefault(key, defVal, Boolean.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link Map}.
-        *
-        * <p>
-        * Shortcut for <code>get(key, Map.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Map<?,?> getMap(String key) {
-               return get(key, Map.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link Map}.
-        *
-        * <p>
-        * Shortcut for <code>getWithDefault(key, defVal, 
Map.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param defVal The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Map<?,?> getMap(String key, Map<?,?> defVal) {
-               return getWithDefault(key, defVal, Map.class);
-       }
-
-       /**
-        * Same as {@link #getMap(String, Map)} except converts the keys and 
values to the specified types.
-        *
-        * @param key The key.
-        * @param keyType The key type class.
-        * @param valType The value type class.
-        * @param def The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public <K,V> Map<K,V> getMap(String key, Class<K> keyType, Class<V> 
valType, Map<K,V> def) {
-               Object o = get(key);
-               if (o == null)
-                       return def;
-               return bs().convertToType(o, Map.class, keyType, valType);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link List}.
-        *
-        * <p>
-        * Shortcut for <code>get(key, List.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public List<?> getList(String key) {
-               return get(key, List.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link List}.
-        *
-        * <p>
-        * Shortcut for <code>getWithDefault(key, defVal, 
List.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param defVal The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public List<?> getList(String key, List<?> defVal) {
-               return getWithDefault(key, defVal, List.class);
-       }
-
-       /**
-        * Same as {@link #getList(String, List)} except converts the elements 
to the specified types.
-        *
-        * @param key The key.
-        * @param elementType The element type class.
-        * @param def The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public <E> List<E> getList(String key, Class<E> elementType, List<E> 
def) {
-               Object o = get(key);
-               if (o == null)
-                       return def;
-               return bs().convertToType(o, List.class, elementType);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link Map}.
-        *
-        * <p>
-        * Shortcut for <code>get(key, ObjectMap.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectMap getObjectMap(String key) {
-               return get(key, ObjectMap.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link ObjectMap}.
-        *
-        * <p>
-        * Shortcut for <code>getWithDefault(key, defVal, 
ObjectMap.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param defVal The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectMap getObjectMap(String key, ObjectMap defVal) {
-               return getWithDefault(key, defVal, ObjectMap.class);
-       }
-
-       /**
-        * Same as {@link #getObjectMap(String)} but creates a new empty {@link 
ObjectMap} if it doesn't already exist.
-        *
-        * @param key The key.
-        * @param createIfNotExists If mapping doesn't already exist, create 
one with an empty {@link ObjectMap}.
-        * @return The converted value, or an empty value if the map contains 
no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectMap getObjectMap(String key, boolean createIfNotExists) {
-               ObjectMap m = getWithDefault(key, null, ObjectMap.class);
-               if (m == null && createIfNotExists) {
-                       m = new ObjectMap();
-                       put(key, m);
-               }
-               return m;
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link ObjectList}.
-        *
-        * <p>
-        * Shortcut for <code>get(key, ObjectList.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectList getObjectList(String key) {
-               return get(key, ObjectList.class);
-       }
-
-       /**
-        * Returns the specified entry value converted to a {@link ObjectList}.
-        *
-        * <p>
-        * Shortcut for <code>getWithDefault(key, defVal, 
ObjectList.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param defVal The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectList getObjectList(String key, ObjectList defVal) {
-               return getWithDefault(key, defVal, ObjectList.class);
-       }
-
-       /**
-        * Same as {@link #getObjectList(String)} but creates a new empty 
{@link ObjectList} if it doesn't already exist.
-        *
-        * @param key The key.
-        * @param createIfNotExists If mapping doesn't already exist, create 
one with an empty {@link ObjectList}.
-        * @return The converted value, or an empty value if the map contains 
no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectList getObjectList(String key, boolean createIfNotExists) {
-               ObjectList m = getWithDefault(key, null, ObjectList.class);
-               if (m == null && createIfNotExists) {
-                       m = new ObjectList();
-                       put(key, m);
-               }
-               return m;
-       }
-
-       /**
-        * Returns the first entry that exists converted to a {@link String}.
-        *
-        * <p>
-        * Shortcut for <code>find(String.<jk>class</jk>, keys)</code>.
-        *
-        * @param keys The list of keys to look for.
-        * @return
-        *      The converted value of the first key in the list that has an 
entry in this map, or <jk>null</jk> if the map
-        *      contains no mapping for any of the keys.
-        */
-       public String findString(String... keys) {
-               return find(String.class, keys);
-       }
-
-       /**
-        * Returns the first entry that exists converted to an {@link Integer}.
-        *
-        * <p>
-        * Shortcut for <code>find(Integer.<jk>class</jk>, keys)</code>.
-        *
-        * @param keys The list of keys to look for.
-        * @return
-        *      The converted value of the first key in the list that has an 
entry in this map, or <jk>null</jk> if the map
-        *      contains no mapping for any of the keys.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Integer findInt(String... keys) {
-               return find(Integer.class, keys);
-       }
-
-       /**
-        * Returns the first entry that exists converted to a {@link Long}.
-        *
-        * <p>
-        * Shortcut for <code>find(Long.<jk>class</jk>, keys)</code>.
-        *
-        * @param keys The list of keys to look for.
-        * @return
-        *      The converted value of the first key in the list that has an 
entry in this map, or <jk>null</jk> if the map
-        *      contains no mapping for any of the keys.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Long findLong(String... keys) {
-               return find(Long.class, keys);
-       }
-
-       /**
-        * Returns the first entry that exists converted to a {@link Boolean}.
-        *
-        * <p>
-        * Shortcut for <code>find(Boolean.<jk>class</jk>, keys)</code>.
-        *
-        * @param keys The list of keys to look for.
-        * @return
-        *      The converted value of the first key in the list that has an 
entry in this map, or <jk>null</jk> if the map
-        *      contains no mapping for any of the keys.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Boolean findBoolean(String... keys) {
-               return find(Boolean.class, keys);
-       }
-
-       /**
-        * Returns the first entry that exists converted to a {@link Map}.
-        *
-        * <p>
-        * Shortcut for <code>find(Map.<jk>class</jk>, keys)</code>.
-        *
-        * @param keys The list of keys to look for.
-        * @return
-        *      The converted value of the first key in the list that has an 
entry in this map, or <jk>null</jk> if the map
-        *      contains no mapping for any of the keys.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Map<?,?> findMap(String... keys) {
-               return find(Map.class, keys);
-       }
-
-       /**
-        * Returns the first entry that exists converted to a {@link List}.
-        *
-        * <p>
-        * Shortcut for <code>find(List.<jk>class</jk>, keys)</code>.
-        *
-        * @param keys The list of keys to look for.
-        * @return
-        *      The converted value of the first key in the list that has an 
entry in this map, or <jk>null</jk> if the map
-        *      contains no mapping for any of the keys.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public List<?> findList(String... keys) {
-               return find(List.class, keys);
-       }
-
-       /**
-        * Returns the first entry that exists converted to a {@link ObjectMap}.
-        *
-        * <p>
-        * Shortcut for <code>find(ObjectMap.<jk>class</jk>, keys)</code>.
-        *
-        * @param keys The list of keys to look for.
-        * @return
-        *      The converted value of the first key in the list that has an 
entry in this map, or <jk>null</jk> if the map
-        *      contains no mapping for any of the keys.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectMap findObjectMap(String... keys) {
-               return find(ObjectMap.class, keys);
-       }
-
-       /**
-        * Returns the first entry that exists converted to a {@link 
ObjectList}.
-        *
-        * <p>
-        * Shortcut for <code>find(ObjectList.<jk>class</jk>, keys)</code>.
-        *
-        * @param keys The list of keys to look for.
-        * @return
-        *      The converted value of the first key in the list that has an 
entry in this map, or <jk>null</jk> if the map
-        *      contains no mapping for any of the keys.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public ObjectList findObjectList(String... keys) {
-               return find(ObjectList.class, keys);
-       }
-
-       /**
-        * Returns the first key in the map.
-        *
-        * @return The first key in the map, or <jk>null</jk> if the map is 
empty.
-        */
-       public String getFirstKey() {
-               return isEmpty() ? null : keySet().iterator().next();
-       }
-
-       /**
-        * Returns the class type of the object at the specified index.
-        *
-        * @param key The key into this map.
-        * @return
-        *      The data type of the object at the specified key, or 
<jk>null</jk> if the value is null or does not exist.
-        */
-       public ClassMeta<?> getClassMeta(String key) {
-               return bs().getClassMetaForObject(get(key));
-       }
-
-       /**
-        * Equivalent to calling <c>get(class,key,def)</c> followed by 
<c>remove(key);</c>
-        * @param key The key.
-        * @param defVal The default value if the map doesn't contain the 
specified mapping.
-        * @param type The class type.
-        *
-        * @param <T> The class type.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public <T> T removeWithDefault(String key, T defVal, Class<T> type) {
-               T t = getWithDefault(key, defVal, type);
-               remove(key);
-               return t;
-       }
-
-       /**
-        * Equivalent to calling 
<code>removeWithDefault(key,<jk>null</jk>,String.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public String removeString(String key) {
-               return removeString(key, null);
-       }
-
-       /**
-        * Equivalent to calling 
<code>removeWithDefault(key,def,String.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param def The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public String removeString(String key, String def) {
-               return removeWithDefault(key, def, String.class);
-       }
-
-       /**
-        * Equivalent to calling 
<code>removeWithDefault(key,<jk>null</jk>,Integer.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Integer removeInt(String key) {
-               return removeInt(key, null);
-       }
-
-       /**
-        * Equivalent to calling 
<code>removeWithDefault(key,def,Integer.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param def The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Integer removeInt(String key, Integer def) {
-               return removeWithDefault(key, def, Integer.class);
-       }
-
-       /**
-        * Equivalent to calling 
<code>removeWithDefault(key,<jk>null</jk>,Boolean.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Boolean removeBoolean(String key) {
-               return removeBoolean(key, null);
-       }
-
-       /**
-        * Equivalent to calling 
<code>removeWithDefault(key,def,Boolean.<jk>class</jk>)</code>.
-        *
-        * @param key The key.
-        * @param def The default value if the map doesn't contain the 
specified mapping.
-        * @return The converted value, or the default value if the map 
contains no mapping for this key.
-        * @throws InvalidDataConversionException If value cannot be converted.
-        */
-       public Boolean removeBoolean(String key, Boolean def) {
-               return removeWithDefault(key, def, Boolean.class);
-       }
-
-       /**
-        * Convenience method for removing several keys at once.
-        *
-        * @param keys The list of keys to remove.
-        */
-       public void removeAll(Collection<String> keys) {
-               for (String k : keys)
-                       remove(k);
-       }
-
-       /**
-        * Convenience method for removing several keys at once.
-        *
-        * @param keys The list of keys to remove.
-        */
-       public void removeAll(String... keys) {
-               for (String k : keys)
-                       remove(k);
-       }
-
-       /**
-        * The opposite of {@link #removeAll(String...)}.
-        *
-        * <p>
-        * Discards all keys from this map that aren't in the specified list.
-        *
-        * @param keys The keys to keep.
-        * @return This map.
-        */
-       public ObjectMap keepAll(String...keys) {
-               for (Iterator<String> i = keySet().iterator(); i.hasNext();) {
-                       boolean remove = true;
-                       String key = i.next();
-                       for (String k : keys) {
-                               if (k.equals(key)) {
-                                       remove = false;
-                                       break;
-                               }
-                       }
-                       if (remove)
-                               i.remove();
-               }
-               return this;
-       }
-
-       @Override /* Map */
-       public boolean containsKey(Object key) {
-               if (super.containsKey(key))
-                       return true;
-               if (inner != null)
-                       return inner.containsKey(key);
-               return false;
-       }
-
-       /**
-        * Returns <jk>true</jk> if the map contains the specified entry and 
the value is not null nor an empty string.
-        *
-        * <p>
-        * Always returns <jk>false</jk> if the value is not a {@link 
CharSequence}.
-        *
-        * @param key The key.
-        * @return <jk>true</jk> if the map contains the specified entry and 
the value is not null nor an empty string.
-        */
-       public boolean containsKeyNotEmpty(String key) {
-               Object val = get(key);
-               if (val == null)
-                       return false;
-               if (val instanceof CharSequence)
-                       return ! StringUtils.isEmpty(val);
-               return false;
-       }
-
-       /**
-        * Returns <jk>true</jk> if this map contains the specified key, 
ignoring the inner map if it exists.
-        *
-        * @param key The key to look up.
-        * @return <jk>true</jk> if this map contains the specified key.
-        */
-       public boolean containsOuterKey(Object key) {
-               return super.containsKey(key);
-       }
-
-       /**
-        * Returns a copy of this <c>ObjectMap</c> with only the specified keys.
-        *
-        * @param keys The keys of the entries to copy.
-        * @return A new map with just the keys and values from this map.
-        */
-       public ObjectMap include(String...keys) {
-               ObjectMap m2 = new ObjectMap();
-               for (Map.Entry<String,Object> e : this.entrySet())
-                       for (String k : keys)
-                               if (k.equals(e.getKey()))
-                                       m2.put(k, e.getValue());
-               return m2;
-       }
-
-       /**
-        * Returns a copy of this <c>ObjectMap</c> without the specified keys.
-        *
-        * @param keys The keys of the entries not to copy.
-        * @return A new map without the keys and values from this map.
-        */
-       public ObjectMap exclude(String...keys) {
-               ObjectMap m2 = new ObjectMap();
-               for (Map.Entry<String,Object> e : this.entrySet()) {
-                       boolean exclude = false;
-                       for (String k : keys)
-                               if (k.equals(e.getKey()))
-                                       exclude = true;
-                       if (! exclude)
-                               m2.put(e.getKey(), e.getValue());
-               }
-               return m2;
-       }
-
-       /**
-        * Sets a value in this map if the entry does not exist or the value is 
<jk>null</jk>.
-        *
-        * @param key The map key.
-        * @param val The value to set if the current value does not exist or 
is <jk>null</jk>.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap putIfNull(String key, Object val) {
-               Object o = get(key);
-               if (o == null)
-                       put(key, val);
-               return this;
-       }
-
-       /**
-        * Sets a value in this map if the entry does not exist or the value is 
<jk>null</jk> or an empty string.
-        *
-        * @param key The map key.
-        * @param val The value to set if the current value does not exist or 
is <jk>null</jk> or an empty string.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap putIfEmpty(String key, Object val) {
-               Object o = get(key);
-               if (o == null || o.toString().isEmpty())
-                       put(key, val);
-               return this;
-       }
-
-       /**
-        * Adds a mapping if the specified key doesn't exist.
-        *
-        * @param key The map key.
-        * @param val The value to set if the current value does not exist or 
is <jk>null</jk> or an empty string.
-        * @return This object (for method chaining).
-        */
-       public ObjectMap putIfNotExists(String key, Object val) {
-               if (! containsKey(key))
-                       put(key, val);
-               return this;
-       }
-
-       /**
-        * Converts this map into an object of the specified type.
-        *
-        * <p>
-        * If this map contains a <js>"_type"</js> entry, it must be the same 
as or a subclass of the <c>type</c>.
-        *
-        * @param <T> The class type to convert this map object to.
-        * @param type The class type to convert this map object to.
-        * @return The new object.
-        * @throws ClassCastException
-        *      If the <js>"_type"</js> entry is present and not assignable 
from <c>type</c>
-        */
-       @SuppressWarnings("unchecked")
-       public <T> T cast(Class<T> type) {
-               BeanSession bs = bs();
-               ClassMeta<?> c2 = bs.getClassMeta(type);
-               String typePropertyName = bs.getBeanTypePropertyName(c2);
-               ClassMeta<?> c1 = 
bs.getBeanRegistry().getClassMeta((String)get(typePropertyName));
-               ClassMeta<?> c = c1 == null ? c2 : narrowClassMeta(c1, c2);
-               if (c.isObject())
-                       return (T)this;
-               return (T)cast2(c);
-       }
-
-       /**
-        * Same as {@link #cast(Class)}, except allows you to specify a {@link 
ClassMeta} parameter.
-        *
-        * @param <T> The class type to convert this map object to.
-        * @param cm The class type to convert this map object to.
-        * @return The new object.
-        * @throws ClassCastException
-        *      If the <js>"_type"</js> entry is present and not assignable 
from <c>type</c>
-        */
-       @SuppressWarnings({"unchecked"})
-       public <T> T cast(ClassMeta<T> cm) {
-               BeanSession bs = bs();
-               ClassMeta<?> c1 = 
bs.getBeanRegistry().getClassMeta((String)get(bs.getBeanTypePropertyName(cm)));
-               ClassMeta<?> c = narrowClassMeta(c1, cm);
-               return (T)cast2(c);
-       }
-
-       /*
-        * Combines the class specified by a "_type" attribute with the 
ClassMeta
-        * passed in through the cast(ClassMeta) method.
-        * The rule is that child classes supersede parent classes, and c2 
supersedes c1
-        * if one isn't the parent of another.
-        */
-       private ClassMeta<?> narrowClassMeta(ClassMeta<?> c1, ClassMeta<?> c2) {
-               if (c1 == null)
-                       return c2;
-               ClassMeta<?> c = getNarrowedClassMeta(c1, c2);
-               if (c1.isMap()) {
-                       ClassMeta<?> k = getNarrowedClassMeta(c1.getKeyType(), 
c2.getKeyType());
-                       ClassMeta<?> v = 
getNarrowedClassMeta(c1.getValueType(), c2.getValueType());
-                       return bs().getClassMeta(c.getInnerClass(), k, v);
-               }
-               if (c1.isCollection()) {
-                       ClassMeta<?> e = 
getNarrowedClassMeta(c1.getElementType(), c2.getElementType());
-                       return bs().getClassMeta(c.getInnerClass(), e);
-               }
-               return c;
-       }
-
-       /*
-        * If c1 is a child of c2 or the same as c2, returns c1.
-        * Otherwise, returns c2.
-        */
-       private static ClassMeta<?> getNarrowedClassMeta(ClassMeta<?> c1, 
ClassMeta<?> c2) {
-               if (c2 == null || c2.getInfo().isParentOf(c1.getInnerClass()))
-                       return c1;
-               return c2;
-       }
-
-       /*
-        * Converts this map to the specified class type.
-        */
-       @SuppressWarnings({"unchecked","rawtypes"})
-       private <T> T cast2(ClassMeta<T> cm) {
-
-               BeanSession bs = bs();
-               try {
-                       Object value = get("value");
-
-                       if (cm.isMap()) {
-                               Map m2 = (cm.canCreateNewInstance() ? 
(Map)cm.newInstance() : new ObjectMap(bs));
-                               ClassMeta<?> kType = cm.getKeyType(), vType = 
cm.getValueType();
-                               for (Map.Entry<String,Object> e : entrySet()) {
-                                       Object k = e.getKey();
-                                       Object v = e.getValue();
-                                       if (! 
k.equals(bs.getBeanTypePropertyName(cm))) {
-
-                                               // Attempt to recursively cast 
child maps.
-                                               if (v instanceof ObjectMap)
-                                                       v = 
((ObjectMap)v).cast(vType);
-
-                                               k = (kType.isString() ? k : 
bs.convertToType(k, kType));
-                                               v = (vType.isObject() ? v : 
bs.convertToType(v, vType));
-
-                                               m2.put(k, v);
-                                       }
-                               }
-                               return (T)m2;
-
-                       } else if (cm.isBean()) {
-                               BeanMap<? extends T> bm = 
bs.newBeanMap(cm.getInnerClass());
-
-                               // Iterate through all the entries in the map 
and set the individual field values.
-                               for (Map.Entry<String,Object> e : entrySet()) {
-                                       String k = e.getKey();
-                                       Object v = e.getValue();
-                                       if (! 
k.equals(bs.getBeanTypePropertyName(cm))) {
-
-                                               // Attempt to recursively cast 
child maps.
-                                               if (v instanceof ObjectMap)
-                                                       v = 
((ObjectMap)v).cast(bm.getProperty(k).getMeta().getClassMeta());
-
-                                               bm.put(k, v);
-                                       }
-                               }
-
-                               return bm.getBean();
-
-                       } else if (cm.isCollectionOrArray()) {
-                               List items = (List)get("items");
-                               return bs.convertToType(items, cm);
-
-                       } else if (value != null) {
-                               return bs.convertToType(value, cm);
-                       }
-
-               } catch (Exception e) {
-                       throw new BeanRuntimeException(e, cm.innerClass,
-                               "Error occurred attempting to cast to an object 
of type ''{0}''", cm.innerClass.getName());
-               }
-
-               throw new BeanRuntimeException(cm.innerClass,
-                       "Cannot convert to class type ''{0}''.  Only beans and 
maps can be converted using this method.",
-                       cm.innerClass.getName());
-       }
-
-       private PojoRest getPojoRest() {
-               if (pojoRest == null)
-                       pojoRest = new PojoRest(this);
-               return pojoRest;
-       }
-
-       /**
-        * Serialize this object into a string using the specified serializer.
-        *
-        * @param serializer The serializer to use to convert this object to a 
string.
-        * @return This object serialized as a string.
-        * @throws SerializeException If a problem occurred trying to convert 
the output.
-        */
-       public String toString(WriterSerializer serializer) throws 
SerializeException {
-               return serializer.serialize(this);
-       }
-
-       /**
-        * Serialize this object into a JSON string using the {@link 
JsonSerializer#DEFAULT} serializer.
-        */
-       @Override /* Object */
-       public String toString() {
-               try {
-                       return this.toString(SimpleJsonSerializer.DEFAULT);
-               } catch (SerializeException e) {
-                       return e.getLocalizedMessage();
-               }
-       }
-
-       /**
-        * Convenience method for serializing this map to the specified 
<c>Writer</c> using the
-        * {@link JsonSerializer#DEFAULT} serializer.
-        *
-        * @param w The writer to serialize this object to.
-        * @return This object (for method chaining).
-        * @throws IOException If a problem occurred trying to write to the 
writer.
-        * @throws SerializeException If a problem occurred trying to convert 
the output.
-        */
-       public ObjectMap serializeTo(Writer w) throws IOException, 
SerializeException {
-               JsonSerializer.DEFAULT.serialize(this);
-               return this;
-       }
-
-       /**
-        * Returns <jk>true</jk> if this map is unmodifiable.
-        *
-        * @return <jk>true</jk> if this map is unmodifiable.
-        */
-       public boolean isUnmodifiable() {
-               return false;
-       }
-
-       /**
-        * Returns a modifiable copy of this map if it's unmodifiable.
-        *
-        * @return A modifiable copy of this map if it's unmodifiable, or this 
map if it is already modifiable.
-        */
-       public ObjectMap modifiable() {
-               if (isUnmodifiable())
-                       return new ObjectMap(this);
-               return this;
-       }
-
-       /**
-        * Returns an unmodifiable copy of this map if it's modifiable.
-        *
-        * @return An unmodifiable copy of this map if it's modifiable, or this 
map if it is already unmodifiable.
-        */
-       public ObjectMap unmodifiable() {
-               if (this instanceof UnmodifiableObjectMap)
-                       return this;
-               return new UnmodifiableObjectMap(this);
-       }
-
-       @Override /* Map */
-       public Set<String> keySet() {
-               if (inner == null)
-                       return super.keySet();
-               LinkedHashSet<String> s = new LinkedHashSet<>();
-               s.addAll(inner.keySet());
-               s.addAll(super.keySet());
-               return s;
-       }
-
-       @Override /* Map */
-       public Set<Map.Entry<String,Object>> entrySet() {
-               if (inner == null)
-                       return super.entrySet();
-
-               final Set<String> keySet = keySet();
-               final Iterator<String> keys = keySet.iterator();
-
-               return new AbstractSet<Map.Entry<String,Object>>() {
-
-                       @Override /* Iterable */
-                       public Iterator<Map.Entry<String,Object>> iterator() {
-
-                               return new Iterator<Map.Entry<String,Object>>() 
{
-
-                                       @Override /* Iterator */
-                                       public boolean hasNext() {
-                                               return keys.hasNext();
-                                       }
-
-                                       @Override /* Iterator */
-                                       public Map.Entry<String,Object> next() {
-                                               return new 
Map.Entry<String,Object>() {
-                                                       String key = 
keys.next();
-
-                                                       @Override /* Map.Entry 
*/
-                                                       public String getKey() {
-                                                               return key;
-                                                       }
-
-                                                       @Override /* Map.Entry 
*/
-                                                       public Object 
getValue() {
-                                                               return get(key);
-                                                       }
-
-                                                       @Override /* Map.Entry 
*/
-                                                       public Object 
setValue(Object object) {
-                                                               return put(key, 
object);
-                                                       }
-                                               };
-                                       }
-
-                                       @Override /* Iterator */
-                                       public void remove() {
-                                               throw new 
UnsupportedOperationException();
-                                       }
-                               };
-                       }
-
-                       @Override /* Set */
-                       public int size() {
-                               return keySet.size();
-                       }
-               };
-       }
-
-       private static final class UnmodifiableObjectMap extends ObjectMap {
-               private static final long serialVersionUID = 1L;
-
-               UnmodifiableObjectMap(ObjectMap contents) {
-                       super();
-                       if (contents != null) {
-                               for (Map.Entry<String,Object> e : 
contents.entrySet()) {
-                                       super.put(e.getKey(), e.getValue());
-                               }
-                       }
-               }
-
-               @Override
-               public final Object put(String key, Object val) {
-                       throw new UnsupportedOperationException("ObjectMap is 
read-only.");
-               }
-
-               @Override
-               public final Object remove(Object key) {
-                       throw new UnsupportedOperationException("ObjectMap is 
read-only.");
-               }
-
-               @Override
-               public final boolean isUnmodifiable() {
-                       return true;
-               }
-       }
-
-       private BeanSession bs() {
-               if (session == null)
-                       session = BeanContext.DEFAULT.createBeanSession();
-               return session;
-       }
-}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/OList.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/OList.java
index af06e2a..f9a44ce 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/OList.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/OList.java
@@ -98,7 +98,7 @@ import org.apache.juneau.utils.*;
  * <p>
  * This class is not thread safe.
  */
-public class OList extends ObjectList /* In 9.0 - LinkedList<Object> */ {
+public class OList extends LinkedList<Object> {
        private static final long serialVersionUID = 1L;
 
        transient BeanSession session = null;
@@ -405,7 +405,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param o The entries to add to this list.
         * @return This object (for method chaining).
         */
-       @Override
        public OList append(Object...o) {
                for (Object o2 : o)
                        add(o2);
@@ -497,7 +496,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param o The objects to add to the list.
         * @return This object (for method chaining).
         */
-       @Override
        public OList appendIfNotEmpty(String...o) {
                return aifne(o);
        }
@@ -526,7 +524,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param o The objects to add to the list.
         * @return This object (for method chaining).
         */
-       @Override
        public OList appendIfNotNull(Object...o) {
                return aifnn(o);
        }
@@ -596,7 +593,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param <T> The type of object to convert the entry to.
         * @return The converted entry.
         */
-       @Override
        public <T> T get(int index, Class<T> type) {
                return bs().convertToType(get(index), type);
        }
@@ -645,7 +641,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param <T> The type of object to convert the entry to.
         * @return The converted entry.
         */
-       @Override
        public <T> T get(int index, Type type, Type...args) {
                return bs().convertToType(get(index), type, args);
        }
@@ -656,7 +651,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param index The index.
         * @return The converted value.
         */
-       @Override
        public String getString(int index) {
                return get(index, String.class);
        }
@@ -668,7 +662,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @return The converted value.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Integer getInt(int index) {
                return get(index, Integer.class);
        }
@@ -680,7 +673,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @return The converted value.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Boolean getBoolean(int index) {
                return get(index, Boolean.class);
        }
@@ -692,7 +684,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @return The converted value.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Long getLong(int index) {
                return get(index, Long.class);
        }
@@ -704,23 +695,46 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @return The converted value.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public OMap getMap(int index) {
                return get(index, OMap.class);
        }
 
        /**
+        * Same as {@link #getMap(int)} except converts the keys and values to 
the specified types.
+        *
+        * @param index The index.
+        * @param keyType The key type class.
+        * @param valType The value type class.
+        * @return The converted value.
+        * @throws InvalidDataConversionException If value cannot be converted.
+        */
+       public <K,V> Map<K,V> getMap(int index, Class<K> keyType, Class<V> 
valType) {
+               return bs().convertToType(get(index), Map.class, keyType, 
valType);
+       }
+
+       /**
         * Shortcut for calling <code>get(index, OList.<jk>class</jk>)</code>.
         *
         * @param index The index.
         * @return The converted value.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public OList getList(int index) {
                return get(index, OList.class);
        }
 
+       /**
+        * Same as {@link #getList(int)} except converts the elements to the 
specified types.
+        *
+        * @param index The index.
+        * @param elementType The element type class.
+        * @return The converted value.
+        * @throws InvalidDataConversionException If value cannot be converted.
+        */
+       public <E> List<E> getList(int index, Class<E> elementType) {
+               return bs().convertToType(get(index), List.class, elementType);
+       }
+
        
//------------------------------------------------------------------------------------------------------------------
        // POJO REST methods.
        
//------------------------------------------------------------------------------------------------------------------
@@ -752,7 +766,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param <T> The class type.
         * @return The value, or <jk>null</jk> if the entry doesn't exist.
         */
-       @Override
        public <T> T getAt(String path, Class<T> type) {
                return getPojoRest().get(path, type);
        }
@@ -767,7 +780,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param <T> The class type.
         * @return The value, or <jk>null</jk> if the entry doesn't exist.
         */
-       @Override
        public <T> T getAt(String path, Type type, Type...args) {
                return getPojoRest().get(path, type, args);
        }
@@ -797,7 +809,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param o The new value.
         * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
         */
-       @Override
        public Object putAt(String path, Object o) {
                return getPojoRest().put(path, o);
        }
@@ -826,7 +837,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param o The new value.
         * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
         */
-       @Override
        public Object postAt(String path, Object o) {
                return getPojoRest().post(path, o);
        }
@@ -855,7 +865,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param path The path to the entry.
         * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
         */
-       @Override
        public Object deleteAt(String path) {
                return getPojoRest().delete(path);
        }
@@ -869,12 +878,22 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         *
         * @return The {@link BeanSession} currently associated with this list.
         */
-       @Override
        public BeanSession getBeanSession() {
                return session;
        }
 
        /**
+        * Sets the {@link BeanSession} currently associated with this list.
+        *
+        * @param value The {@link BeanSession} currently associated with this 
list.
+        * @return This object (for method chaining).
+        */
+       public OList setBeanSession(BeanSession value) {
+               this.session = value;
+               return this;
+       }
+
+       /**
         * Creates an {@link Iterable} with elements of the specified child 
type.
         *
         * <p>
@@ -913,7 +932,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param childType The child object type.
         * @return A new <c>Iterable</c> object over this list.
         */
-       @Override
        public <E> Iterable<E> elements(final Class<E> childType) {
                final Iterator<?> i = iterator();
                return new Iterable<E>() {
@@ -948,7 +966,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param index An index into this list, zero-based.
         * @return The data type of the object at the specified index, or 
<jk>null</jk> if the value is null.
         */
-       @Override
        public ClassMeta<?> getClassMeta(int index) {
                return bs().getClassMetaForObject(get(index));
        }
@@ -977,7 +994,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         *
         * @return <jk>true</jk> if this list is unmodifiable.
         */
-       @Override
        public boolean isUnmodifiable() {
                return false;
        }
@@ -987,7 +1003,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         *
         * @return A modifiable copy of this list if it's unmodifiable, or this 
list if it is already modifiable.
         */
-       @Override
        public OList modifiable() {
                if (isUnmodifiable())
                        return new OList(this);
@@ -999,7 +1014,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         *
         * @return An unmodifiable copy of this list if it's modifiable, or 
this list if it is already unmodifiable.
         */
-       @Override
        public OList unmodifiable() {
                if (this instanceof UnmodifiableOList)
                        return this;
@@ -1029,7 +1043,6 @@ public class OList extends ObjectList /* In 9.0 - 
LinkedList<Object> */ {
         * @param cm The class type to convert this object to.
         * @return A converted object.
         */
-       @Override
        public Object cast(ClassMeta<?> cm) {
                try {
                        return 
JsonParser.DEFAULT.parse(SimpleJsonSerializer.DEFAULT.serialize(this), cm);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/OMap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/OMap.java
index 870d6ad..5a439c0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/OMap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/OMap.java
@@ -94,7 +94,7 @@ import org.apache.juneau.utils.*;
  * <p>
  * This class is not thread safe.
  */
-public class OMap extends ObjectMap /* In 9.0 - LinkedHashMap<String,Object> 
*/ {
+public class OMap extends LinkedHashMap<String,Object> {
        private static final long serialVersionUID = 1L;
 
        private transient BeanSession session;
@@ -420,7 +420,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param value The value.
         * @return This object (for method chaining).
         */
-       @Override
        public OMap append(String key, Object value) {
                return a(key,value);
        }
@@ -462,7 +461,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param value The value.
         * @return This object (for method chaining).
         */
-       @Override
        public OMap appendIf(boolean overwrite, boolean skipNullValue, boolean 
skipEmptyValue, String key, Object value) {
                return aif(overwrite, skipNullValue, skipEmptyValue, key, 
value);
        }
@@ -495,7 +493,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param value The value.
         * @return This object (for method chaining).
         */
-       @Override
        public OMap appendIf(boolean flag, String key, Object value) {
                return aif(flag, key, value);
        }
@@ -526,7 +523,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param value The value.
         * @return This object (for method chaining).
         */
-       @Override
        public OMap appendSkipEmpty(String key, Object value) {
                return ase(key, value);
        }
@@ -557,7 +553,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param value The value.
         * @return This object (for method chaining).
         */
-       @Override
        public OMap appendSkipFalse(String key, boolean value) {
                return asf(key, value);
        }
@@ -589,7 +584,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param value The value.
         * @return This object (for method chaining).
         */
-       @Override
        public OMap appendSkipMinusOne(String key, Number value) {
                return asmo(key, value);
        }
@@ -620,7 +614,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param value The value.
         * @return This object (for method chaining).
         */
-       @Override
        public OMap appendSkipNull(String key, Object value) {
                return asn(key, value);
        }
@@ -649,7 +642,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param m The map whose contents should be added to this map.
         * @return This object (for method chaining).
         */
-       @Override
        public OMap appendAll(Map<String,Object> m) {
                if (m != null)
                        putAll(m);
@@ -815,7 +807,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param type The class type returned.
         * @return The value, or <jk>null</jk> if the entry doesn't exist.
         */
-       @Override
        public <T> T get(String key, Class<T> type) {
                return getWithDefault(key, (T)null, type);
        }
@@ -869,7 +860,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param args The class type parameters.
         * @return The value, or <jk>null</jk> if the entry doesn't exist.
         */
-       @Override
        public <T> T get(String key, Type type, Type...args) {
                return getWithDefault(key, null, type, args);
        }
@@ -881,7 +871,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param def The default value if the entry doesn't exist.
         * @return The value, or the default value if the entry doesn't exist.
         */
-       @Override
        public Object getWithDefault(String key, Object def) {
                Object o = get(key);
                return (o == null ? def : o);
@@ -896,7 +885,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param type The class type returned.
         * @return The value, or <jk>null</jk> if the entry doesn't exist.
         */
-       @Override
        public <T> T getWithDefault(String key, T def, Class<T> type) {
                return getWithDefault(key, def, type, new Type[0]);
        }
@@ -911,7 +899,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param args The class type parameters.
         * @return The value, or <jk>null</jk> if the entry doesn't exist.
         */
-       @Override
        public <T> T getWithDefault(String key, T def, Type type, Type...args) {
                Object o = get(key);
                if (o == null)
@@ -928,7 +915,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *      For performance reasons, it's preferable that the key be all 
lowercase.
         * @return The key, or <jk>null</jk> if map does not contain this key.
         */
-       @Override
        public String findKeyIgnoreCase(String key) {
                for (String k : keySet())
                        if (key.equalsIgnoreCase(k))
@@ -946,7 +932,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The value, or <jk>null</jk> if the entry doesn't exist.
         * @throws ParseException Malformed input encountered.
         */
-       @Override
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public <T> T getSwapped(String key, PojoSwap<T,?> pojoSwap) throws 
ParseException {
                try {
@@ -968,7 +953,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param keys The keys to look up in order.
         * @return The value of the first entry whose key exists, or 
<jk>null</jk> if none of the keys exist in this map.
         */
-       @Override
        public Object find(String...keys) {
                for (String key : keys)
                        if (containsKey(key))
@@ -990,7 +974,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param keys The keys to look up in order.
         * @return The value of the first entry whose key exists, or 
<jk>null</jk> if none of the keys exist in this map.
         */
-       @Override
        public <T> T find(Class<T> type, String...keys) {
                for (String key : keys)
                        if (containsKey(key))
@@ -1007,7 +990,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param key The key.
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         */
-       @Override
        public String getString(String key) {
                return get(key, String.class);
        }
@@ -1021,7 +1003,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param key The key.
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         */
-       @Override
        public String[] getStringArray(String key) {
                return getStringArray(key, null);
        }
@@ -1033,7 +1014,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param def The default value if value is not found.
         * @return The value converted to a string array.
         */
-       @Override
        public String[] getStringArray(String key, String[] def) {
                Object s = get(key, Object.class);
                if (s == null)
@@ -1060,7 +1040,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param defVal The default value if the map doesn't contain the 
specified mapping.
         * @return The converted value, or the default value if the map 
contains no mapping for this key.
         */
-       @Override
        public String getString(String key, String defVal) {
                return getWithDefault(key, defVal, String.class);
        }
@@ -1075,7 +1054,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Integer getInt(String key) {
                return get(key, Integer.class);
        }
@@ -1091,7 +1069,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or the default value if the map 
contains no mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Integer getInt(String key, Integer defVal) {
                return getWithDefault(key, defVal, Integer.class);
        }
@@ -1106,7 +1083,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Long getLong(String key) {
                return get(key, Long.class);
        }
@@ -1122,7 +1098,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or the default value if the map 
contains no mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Long getLong(String key, Long defVal) {
                return getWithDefault(key, defVal, Long.class);
        }
@@ -1137,7 +1112,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Boolean getBoolean(String key) {
                return get(key, Boolean.class);
        }
@@ -1153,7 +1127,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or the default value if the map 
contains no mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Boolean getBoolean(String key, Boolean defVal) {
                return getWithDefault(key, defVal, Boolean.class);
        }
@@ -1168,7 +1141,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public OMap getMap(String key) {
                return get(key, OMap.class);
        }
@@ -1206,6 +1178,23 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
        }
 
        /**
+        * Same as {@link #getMap(String, OMap)} except converts the keys and 
values to the specified types.
+        *
+        * @param key The key.
+        * @param keyType The key type class.
+        * @param valType The value type class.
+        * @param def The default value if the map doesn't contain the 
specified mapping.
+        * @return The converted value, or the default value if the map 
contains no mapping for this key.
+        * @throws InvalidDataConversionException If value cannot be converted.
+        */
+       public <K,V> Map<K,V> getMap(String key, Class<K> keyType, Class<V> 
valType, Map<K,V> def) {
+               Object o = get(key);
+               if (o == null)
+                       return def;
+               return bs().convertToType(o, Map.class, keyType, valType);
+       }
+
+       /**
         * Returns the specified entry value converted to a {@link OList}.
         *
         * <p>
@@ -1215,7 +1204,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public OList getList(String key) {
                return get(key, OList.class);
        }
@@ -1253,6 +1241,22 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
        }
 
        /**
+        * Same as {@link #getList(String, OList)} except converts the elements 
to the specified types.
+        *
+        * @param key The key.
+        * @param elementType The element type class.
+        * @param def The default value if the map doesn't contain the 
specified mapping.
+        * @return The converted value, or the default value if the map 
contains no mapping for this key.
+        * @throws InvalidDataConversionException If value cannot be converted.
+        */
+       public <E> List<E> getList(String key, Class<E> elementType, List<E> 
def) {
+               Object o = get(key);
+               if (o == null)
+                       return def;
+               return bs().convertToType(o, List.class, elementType);
+       }
+
+       /**
         * Returns the first entry that exists converted to a {@link String}.
         *
         * <p>
@@ -1263,7 +1267,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *      The converted value of the first key in the list that has an 
entry in this map, or <jk>null</jk> if the map
         *      contains no mapping for any of the keys.
         */
-       @Override
        public String findString(String... keys) {
                return find(String.class, keys);
        }
@@ -1280,7 +1283,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *      contains no mapping for any of the keys.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Integer findInt(String... keys) {
                return find(Integer.class, keys);
        }
@@ -1297,7 +1299,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *      contains no mapping for any of the keys.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Long findLong(String... keys) {
                return find(Long.class, keys);
        }
@@ -1314,7 +1315,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *      contains no mapping for any of the keys.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Boolean findBoolean(String... keys) {
                return find(Boolean.class, keys);
        }
@@ -1331,7 +1331,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *      contains no mapping for any of the keys.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public OMap findMap(String... keys) {
                return find(OMap.class, keys);
        }
@@ -1348,7 +1347,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *      contains no mapping for any of the keys.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public OList findList(String... keys) {
                return find(OList.class, keys);
        }
@@ -1358,7 +1356,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *
         * @return The first key in the map, or <jk>null</jk> if the map is 
empty.
         */
-       @Override
        public String getFirstKey() {
                return isEmpty() ? null : keySet().iterator().next();
        }
@@ -1370,7 +1367,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return
         *      The data type of the object at the specified key, or 
<jk>null</jk> if the value is null or does not exist.
         */
-       @Override
        public ClassMeta<?> getClassMeta(String key) {
                return bs().getClassMetaForObject(get(key));
        }
@@ -1385,7 +1381,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or the default value if the map 
contains no mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public <T> T removeWithDefault(String key, T defVal, Class<T> type) {
                T t = getWithDefault(key, defVal, type);
                remove(key);
@@ -1399,7 +1394,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public String removeString(String key) {
                return removeString(key, null);
        }
@@ -1412,7 +1406,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or the default value if the map 
contains no mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public String removeString(String key, String def) {
                return removeWithDefault(key, def, String.class);
        }
@@ -1424,7 +1417,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Integer removeInt(String key) {
                return removeInt(key, null);
        }
@@ -1437,7 +1429,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or the default value if the map 
contains no mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Integer removeInt(String key, Integer def) {
                return removeWithDefault(key, def, Integer.class);
        }
@@ -1449,7 +1440,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or <jk>null</jk> if the map contains no 
mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Boolean removeBoolean(String key) {
                return removeBoolean(key, null);
        }
@@ -1462,7 +1452,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @return The converted value, or the default value if the map 
contains no mapping for this key.
         * @throws InvalidDataConversionException If value cannot be converted.
         */
-       @Override
        public Boolean removeBoolean(String key, Boolean def) {
                return removeWithDefault(key, def, Boolean.class);
        }
@@ -1472,7 +1461,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *
         * @param keys The list of keys to remove.
         */
-       @Override
        public void removeAll(Collection<String> keys) {
                for (String k : keys)
                        remove(k);
@@ -1483,7 +1471,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *
         * @param keys The list of keys to remove.
         */
-       @Override
        public void removeAll(String... keys) {
                for (String k : keys)
                        remove(k);
@@ -1498,7 +1485,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param keys The keys to keep.
         * @return This map.
         */
-       @Override
        public OMap keepAll(String...keys) {
                for (Iterator<String> i = keySet().iterator(); i.hasNext();) {
                        boolean remove = true;
@@ -1524,7 +1510,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param key The key.
         * @return <jk>true</jk> if the map contains the specified entry and 
the value is not null nor an empty string.
         */
-       @Override
        public boolean containsKeyNotEmpty(String key) {
                Object val = get(key);
                if (val == null)
@@ -1540,7 +1525,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param key The key to look up.
         * @return <jk>true</jk> if this map contains the specified key.
         */
-       @Override
        public boolean containsOuterKey(Object key) {
                return super.containsKey(key);
        }
@@ -1551,7 +1535,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param keys The keys of the entries to copy.
         * @return A new map with just the keys and values from this map.
         */
-       @Override
        public OMap include(String...keys) {
                OMap m2 = new OMap();
                for (Map.Entry<String,Object> e : this.entrySet())
@@ -1567,7 +1550,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param keys The keys of the entries not to copy.
         * @return A new map without the keys and values from this map.
         */
-       @Override
        public OMap exclude(String...keys) {
                OMap m2 = new OMap();
                for (Map.Entry<String,Object> e : this.entrySet()) {
@@ -1593,7 +1575,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @throws ClassCastException
         *      If the <js>"_type"</js> entry is present and not assignable 
from <c>type</c>
         */
-       @Override
        @SuppressWarnings("unchecked")
        public <T> T cast(Class<T> type) {
                BeanSession bs = bs();
@@ -1615,7 +1596,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @throws ClassCastException
         *      If the <js>"_type"</js> entry is present and not assignable 
from <c>type</c>
         */
-       @Override
        @SuppressWarnings({"unchecked"})
        public <T> T cast(ClassMeta<T> cm) {
                BeanSession bs = bs();
@@ -1655,7 +1635,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param <T> The class type.
         * @return The value, or <jk>null</jk> if the entry doesn't exist.
         */
-       @Override
        public <T> T getAt(String path, Class<T> type) {
                return getPojoRest().get(path, type);
        }
@@ -1674,7 +1653,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param <T> The class type.
         * @return The value, or <jk>null</jk> if the entry doesn't exist.
         */
-       @Override
        public <T> T getAt(String path, Type type, Type...args) {
                return getPojoRest().get(path, type, args);
        }
@@ -1704,7 +1682,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param o The new value.
         * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
         */
-       @Override
        public Object putAt(String path, Object o) {
                return getPojoRest().put(path, o);
        }
@@ -1733,7 +1710,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param o The new value.
         * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
         */
-       @Override
        public Object postAt(String path, Object o) {
                return getPojoRest().post(path, o);
        }
@@ -1762,7 +1738,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param path The path to the entry.
         * @return The previous value, or <jk>null</jk> if the entry doesn't 
exist.
         */
-       @Override
        public Object deleteAt(String path) {
                return getPojoRest().delete(path);
        }
@@ -1776,12 +1751,22 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *
         * @return The {@link BeanSession} currently associated with this map.
         */
-       @Override
        public BeanSession getBeanSession() {
                return session;
        }
 
        /**
+        * Sets the {@link BeanSession} currently associated with this map.
+        *
+        * @param value The {@link BeanSession} currently associated with this 
map.
+        * @return This object (for method chaining).
+        */
+       public OMap setBeanSession(BeanSession value) {
+               this.session = value;
+               return this;
+       }
+
+       /**
         * Convenience method for inserting JSON directly into an attribute on 
this object.
         *
         * <p>
@@ -1791,7 +1776,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         * @param json The JSON text that will be parsed into an Object and 
then inserted into this map.
         * @throws ParseException Malformed input encountered.
         */
-       @Override
        public void putJson(String key, String json) throws ParseException {
                this.put(key, JsonParser.DEFAULT.parse(json, Object.class));
        }
@@ -1834,7 +1818,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *
         * @return <jk>true</jk> if this map is unmodifiable.
         */
-       @Override
        public boolean isUnmodifiable() {
                return false;
        }
@@ -1844,7 +1827,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *
         * @return A modifiable copy of this map if it's unmodifiable, or this 
map if it is already modifiable.
         */
-       @Override
        public OMap modifiable() {
                if (isUnmodifiable())
                        return new OMap(this);
@@ -1856,7 +1838,6 @@ public class OMap extends ObjectMap /* In 9.0 - 
LinkedHashMap<String,Object> */
         *
         * @return An unmodifiable copy of this map if it's modifiable, or this 
map if it is already unmodifiable.
         */
-       @Override
        public OMap unmodifiable() {
                if (this instanceof UnmodifiableOMap)
                        return this;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/PojoRest.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/PojoRest.java
index 6a44011..2c45aa5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/PojoRest.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/PojoRest.java
@@ -534,7 +534,7 @@ public final class PojoRest {
        }
 
        /**
-        * Returns the specified entry value converted to a {@link ObjectMap}.
+        * Returns the specified entry value converted to a {@link OMap}.
         *
         * <p>
         * Shortcut for <code>get(OMap.<jk>class</jk>, key, defVal)</code>.
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestProperties.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestProperties.java
index 6456797..776ef67 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestProperties.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestProperties.java
@@ -47,6 +47,6 @@ public class RequestProperties extends ResolvingOMap {
         */
        public RequestProperties(VarResolverSession varResolver, 
RestMethodProperties inner) {
                super(varResolver);
-               setInner(inner);
+               inner(inner);
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodProperties.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodProperties.java
index 3893854..3f92639 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodProperties.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodProperties.java
@@ -52,6 +52,6 @@ public class RestMethodProperties extends OMap {
         * @param inner The inner properties.
         */
        public RestMethodProperties(RestMethodProperties inner) {
-               setInner(inner);
+               inner(inner);
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
index 2ba77c4..be28027 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
@@ -593,7 +593,7 @@ final class SwaggerGenerator {
 //             }
 
                try {
-                       String swaggerJson = 
omSwagger.toString(SimpleJsonSerializer.DEFAULT_READABLE);
+                       String swaggerJson = 
SimpleJsonSerializer.DEFAULT_READABLE.toString(omSwagger);
 //                     System.err.println(swaggerJson);
                        return jp.parse(swaggerJson, Swagger.class);
                } catch (Exception e) {

Reply via email to