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 5c70326ff Javadocs
5c70326ff is described below

commit 5c70326ff338262b0516a9fefe15cb9cc10bbcd6
Author: JamesBognar <[email protected]>
AuthorDate: Sun Jun 12 10:04:53 2022 -0400

    Javadocs
---
 .../org/apache/juneau/http/header/HeaderList.java  |   1 -
 .../juneau/objecttools/NumberMatcherFactory.java   |   2 +-
 .../juneau/objecttools/ObjectIntrospector.java     |  13 +-
 .../apache/juneau/objecttools/ObjectMerger.java    |   2 +-
 .../apache/juneau/objecttools/ObjectPaginator.java |  20 +-
 .../org/apache/juneau/objecttools/ObjectRest.java  |   5 +-
 .../apache/juneau/objecttools/ObjectSearcher.java  |  62 ++-
 .../apache/juneau/objecttools/ObjectSorter.java    |  23 +-
 .../apache/juneau/objecttools/ObjectViewer.java    |  21 +-
 .../org/apache/juneau/objecttools/PageArgs.java    |   2 +-
 .../org/apache/juneau/objecttools/SearchArgs.java  |   2 +-
 .../org/apache/juneau/objecttools/SortArgs.java    |   2 +-
 .../juneau/objecttools/StringMatcherFactory.java   |   2 +-
 .../juneau/objecttools/TimeMatcherFactory.java     |   2 +-
 .../org/apache/juneau/objecttools/ViewArgs.java    |   2 +-
 .../Topics/02.juneau-marshall/23.jm.Encoders.html  |   2 +-
 .../02.juneau-marshall/25.jm.ObjectTools.html      | 511 ++++++---------------
 .../29.jm.HtmlDetails/04.jm.HtmlAnnotation.html    |   2 +-
 juneau-doc/src/main/javadoc/overview.html          | 380 +++++++++++++--
 juneau-doc/src/main/javadoc/resources/docs.txt     |   2 +-
 .../src/main/javadoc/resources/fragments/toc.html  |   2 +-
 .../apache/juneau/rest/converter/Queryable.java    |  13 +-
 22 files changed, 634 insertions(+), 439 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
index f1b2a6208..8bbbff035 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
@@ -32,7 +32,6 @@ import org.apache.juneau.svl.*;
 
 /**
  * An immutable list of HTTP headers.
- * {@review}
  *
  * <h5 class='figure'>Example</h5>
  * <p class='bjava'>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/NumberMatcherFactory.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/NumberMatcherFactory.java
index 4a431b93f..de4ee3c5f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/NumberMatcherFactory.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/NumberMatcherFactory.java
@@ -20,7 +20,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
 
 /**
- * Provides number search capability for the {@link ObjectSearcher} class.
+ * Number matcher factory for the {@link ObjectSearcher} class.
  *
  * <p>
  *     The class provides searching based on the following patterns:
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectIntrospector.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectIntrospector.java
index e45421dbd..37793fee2 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectIntrospector.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectIntrospector.java
@@ -20,7 +20,11 @@ import org.apache.juneau.parser.*;
 import org.apache.juneau.reflect.*;
 
 /**
- * Used to invoke methods on {@code Objects} using arguments in serialized 
form.
+ * POJO method introspector.
+ *
+ * <p>
+ *     This class is used to invoke methods on {@code Objects} using arguments 
in serialized form.
+ * </p>
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bjava'>
@@ -29,6 +33,13 @@ import org.apache.juneau.reflect.*;
  *             .create(<jv>string</jv>)
  *             .invoke(String.<jk>class</jk>, <js>"substring(int,int)"</js>, 
<js>"[3,6]"</js>);  <jc>// "bar"</jc>
  * </p>
+ * <p>
+ *     The arguments passed to the identified method are POJOs serialized in 
JSON format.  Arbitrarily complex arguments can be passed
+ *     in as arguments.
+ * </p>
+ * <ul>
+ *     <li class='warn'>This is an extremely powerful but potentially 
dangerous tool.  Use wisely.
+ * </ul>
  *
  * <ul class='seealso'>
  *     <li class='extlink'>{@source}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectMerger.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectMerger.java
index 3a2dc9913..dfa4f5774 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectMerger.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectMerger.java
@@ -17,7 +17,7 @@ import java.lang.reflect.*;
 import org.apache.juneau.ExecutableException;
 
 /**
- * Utility class for merging POJOs behind a single interface.
+ * POJO merger.
  *
  * <p>
  * Useful in cases where you want to define beans with 'default' values.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectPaginator.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectPaginator.java
index f8fd6e17c..4e9336495 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectPaginator.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectPaginator.java
@@ -20,10 +20,26 @@ import java.util.*;
 import org.apache.juneau.*;
 
 /**
- * Designed to provide paging on POJOs consisting of arrays and collections.
+ * POJO model paginator.
  *
  * <p>
- * Allows you to quickly return subsets of arrays and collections based on 
position/limit arguments.
+ *     This class is designed to extract sublists from arrays/collections of 
maps or beans.
+ * </p>
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ *     MyBean[] <jv>arrayOfBeans</jv> = ...;
+ *     ObjectPaginator <jv>paginator</jv> = 
ObjectPaginator.<jsm>create</jsm>();
+ *
+ *     <jc>// Returns all rows from 100 to 110.</jc>
+ *     List&lt;MyBean&gt; <jv>result</jv> = 
<jv>paginator</jv>.run(<jv>arrayOfBeans</jv>, 100, 10);
+ * </p>
+ * <p>
+ *     The tool can be used against the following data types:
+ * </p>
+ * <ul>
+ *     <li>Arrays/collections of maps or beans.
+ * </ul>
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc jm.ObjectTools}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectRest.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectRest.java
index ebbd8140f..b05fd398e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectRest.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectRest.java
@@ -24,9 +24,10 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 
 /**
- * Provides the ability to perform standard REST operations (GET, PUT, POST, 
DELETE) against nodes in a POJO model.
+ * POJO REST API.
  *
  * <p>
+ * Provides the ability to perform standard REST operations (GET, PUT, POST, 
DELETE) against nodes in a POJO model.
  * Nodes in the POJO model are addressed using URLs.
  *
  * <p>
@@ -77,7 +78,7 @@ import org.apache.juneau.parser.*;
  *     );
  *
  *     <jc>// Wrap Map inside an ObjectRest object</jc>
- *     ObjectRest <jv>johnSmith</jv> = 
ObjectRest.<jsf>create</jsf>(<jv>map</jv>);
+ *     ObjectRest <jv>johnSmith</jv> = 
ObjectRest.<jsm>create</jsm>(<jv>map</jv>);
  *
  *     <jc>// Get a simple value at the top level</jc>
  *     <jc>// "John Smith"</jc>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSearcher.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSearcher.java
index 205caa434..14945f076 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSearcher.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSearcher.java
@@ -21,10 +21,10 @@ import java.util.*;
 import org.apache.juneau.*;
 
 /**
- * Provides searches against arrays and collections of maps and beans.
+ * POJO model searcher.
  *
  * <p>
- *     The {@link ObjectSearcher} class is designed to provide searches across 
arrays and collections of beans and maps.
+ *     This class is designed to provide searches across arrays and 
collections of maps or beans.
  *     It allows you to quickly filter beans and maps using simple yet 
sophisticated search arguments.
  * </p>
  *
@@ -33,23 +33,64 @@ import org.apache.juneau.*;
  *     MyBean[] <jv>arrayOfBeans</jv> = ...;
  *     ObjectSearcher <jv>searcher</jv> = ObjectSearcher.<jsm>create</jsm>();
  *
- *     BeanSession <jv>beanSession</jv> = 
BeanContext.<jsf>DEFAULT</jsf>.createSession();
- *
- *     <jc>// Find beans whose 'foo' property is 'bar'.</jc>
- *     SearchArgs <jv>searchArgs</jv> = SearchArgs.create("foo=X,bar=Y");
- *
  *     <jc>// Returns a list of beans whose 'foo' property is 'X' and 'bar' 
property is 'Y'.</jc>
- *     Object <jv>result</jv> = searcher.run(<jv>beanSession</jv>, 
<jv>arrayOfBeans</jv>, <jv>searchArgs</jv>);
+ *     List&lt;MyBean&gt; <jv>result</jv> = 
<jv>searcher</jv>.run(<jv>arrayOfBeans</jv>, <js>"foo=X,bar=Y"</js>);
  * </p>
  * <p>
+ *     The tool can be used against the following data types:
+ * </p>
+ * <ul>
+ *     <li>Arrays/collections of maps or beans.
+ * </ul>
+ * <p>
  *     The default searcher is configured with the following matcher factories 
that provides the capabilities of matching
- *     against various data types:
+ *     against various data types.  This list is extensible:
  * </p>
- * <ul class='javatreec'>
+ *     <ul class='javatreec'>
  *     <li class='jc'>{@link StringMatcherFactory}
  *     <li class='jc'>{@link NumberMatcherFactory}
  *     <li class='jc'>{@link TimeMatcherFactory}
  * </ul>
+ * <p>
+ *     The {@link StringMatcherFactory} class provides searching based on the 
following patterns:
+ * </p>
+ * <ul>
+ *     <li><js>"property=foo"</js> - Simple full word match
+ *     <li><js>"property=fo*"</js>, <js>"property=?ar"</js> - Meta-character 
matching
+ *     <li><js>"property=foo bar"</js>(implicit), <js>"property=^foo 
^bar"</js>(explicit) - Multiple OR'ed patterns
+ *     <li><js>"property=+fo* +*ar"</js> - Multiple AND'ed patterns
+ *     <li><js>"property=fo* -bar"</js> - Negative patterns
+ *     <li><js>"property='foo bar'"</js> - Patterns with whitespace
+ *     <li><js>"property=foo\\'bar"</js> - Patterns with single-quotes
+ *     <li><js>"property=/foo\\s+bar"</js> - Regular expression match
+ * </ul>
+ * <p>
+ *     The {@link NumberMatcherFactory} class provides searching based on the 
following patterns:
+ * </p>
+ * <ul>
+ *     <li><js>"property=1"</js> - A single number
+ *     <li><js>"property=1 2"</js> - Multiple OR'ed numbers
+ *     <li><js>"property=-1 -2"</js> - Multiple OR'ed negative numbers
+ *     <li><js>"property=1-2"</js>,<js>"property=-2--1"</js>  - A range of 
numbers (whitespace ignored)
+ *     <li><js>"property=1-2 4-5"</js> - Multiple OR'ed ranges
+ *     
<li><js>"property=&lt;1"</js>,<js>"property=&lt;=1"</js>,<js>"property=&gt;1"</js>,<js>"property=&gt;=1"</js>
 - Open-ended ranges
+ *     <li><js>"property=!1"</js>,<js>"property=!1-2"</js> - Negation
+ * </ul>
+ * <p>
+ *     The {@link TimeMatcherFactory} class provides searching based on the 
following patterns:
+ * </p>
+ * <ul>
+ *     <li><js>"property=2011"</js> - A single year
+ *     <li><js>"property=2011 2013 2015"</js> - Multiple years
+ *     <li><js>"property=2011-01"</js> - A single month
+ *     <li><js>"property=2011-01-01"</js> - A single day
+ *     <li><js>"property=2011-01-01T12"</js> - A single hour
+ *     <li><js>"property=2011-01-01T12:30"</js> - A single minute
+ *     <li><js>"property=2011-01-01T12:30:45"</js> - A single second
+ *     
<li><js>"property=&gt;2011"</js>,<js>"property=&gt;=2011"</js>,<js>"property=&lt;2011"</js>,<js>"property=&lt;=2011"</js>
 - Open-ended ranges
+ *     
<li><js>"property=&gt;2011"</js>,<js>"property=&gt;=2011"</js>,<js>"property=&lt;2011"</js>,<js>"property=&lt;=2011"</js>
 - Open-ended ranges
+ *     <li><js>"property=2011 - 2013-06-30"</js> - Closed ranges
+ * </ul>
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc jm.ObjectTools}
@@ -110,6 +151,7 @@ public final class ObjectSearcher implements 
ObjectTool<SearchArgs> {
        /**
         * Convenience method for executing the searcher.
         *
+        * @param <R> The return type.
         * @param input The input.
         * @param searchArgs The search arguments.  See {@link SearchArgs} for 
format.
         * @return A list of maps/beans matching the
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSorter.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSorter.java
index e4774511b..6916930ac 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSorter.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSorter.java
@@ -21,23 +21,29 @@ import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
 
 /**
- * Sorts arrays and collections of maps and beans.
+ * POJO model sorter.
  *
  * <p>
- *     The {@link ObjectSorter} class is designed to sort arrays and 
collections of beans and maps.
+ *     This class is designed to sort arrays and collections of maps or beans.
  * </p>
+ *
  * <h5 class='section'>Example:</h5>
  * <p class='bjava'>
  *     MyBean[] <jv>arrayOfBeans</jv> = ...;
  *     ObjectSorter <jv>sorter</jv> = ObjectSorter.<jsm>create</jsm>();
  *
- *     BeanSession <jv>beanSession</jv> = 
BeanContext.<jsf>DEFAULT</jsf>.createSession();
- *
- *     <jc>// Sort beans by foo ascending then bar descending.</jc>
- *     SortArgs <jv>sortArgs</jv> = SortArgs.create("foo,bar-");
- *
  *     <jc>// Returns a list of beans sorted accordingly.</jc>
- *     Object <jv>result</jv> = sorter.run(<jv>beanSession</jv>, 
<jv>arrayOfBeans</jv>, <jv>sortArgs</jv>);
+ *     List&lt;MyBean&gt; <jv>result</jv> = 
<jv>sorter</jv>.run(<jv>arrayOfBeans</jv>, <js>"foo,bar-"</js>);
+ * </p>
+ * <p>
+ *     The tool can be used against the following data types:
+ * </p>
+ * <ul>
+ *     <li>Arrays/collections of maps or beans.
+ * </ul>
+ * <p>
+ *     The arguments are a simple comma-delimited list of property names 
optionally suffixed with <js>'+'</js> and <js>'-'</js> to
+ *     denote ascending/descending order.
  * </p>
  *
  * <ul class='seealso'>
@@ -73,6 +79,7 @@ public final class ObjectSorter implements 
ObjectTool<SortArgs> {
        /**
         * Convenience method for executing the sorter.
         *
+        * @param <R> The return type.
         * @param input The input.
         * @param sortArgs The sort arguments.  See {@link SortArgs} for format.
         * @return A list of maps/beans matching the
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectViewer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectViewer.java
index e102d8b32..b43a21251 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectViewer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectViewer.java
@@ -21,10 +21,27 @@ import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
 
 /**
- * Designed to provide paging on POJOs consisting of arrays and collections.
+ * POJO model viewer.
  *
  * <p>
- * Allows you to quickly return subsets of arrays and collections based on 
position/limit arguments.
+ *     This class is designed to extract properties from collections of maps 
or beans.
+ * </p>
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ *     MyBean[] <jv>arrayOfBeans</jv> = ...;
+ *     ObjectViewer <jv>viewer</jv> = ObjectViewer.<jsm>create</jsm>();
+ *
+ *     <jc>// Returns the 'foo' and 'bar' properties extracted into a list of 
maps.</jc>
+ *     List&lt;Map&gt; <jv>result</jv> = 
<jv>viewer</jv>.run(<jv>arrayOfBeans</jv>, <js>"foo,bar"</js>);
+ * </p>
+ * <p>
+ *     The tool can be used against the following data types:
+ * </p>
+ * <ul>
+ *     <li>Arrays/collections of maps or beans.
+ *     <li>Singular maps or beans.
+ * </ul>
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc jm.ObjectTools}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/PageArgs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/PageArgs.java
index 96583d475..1f3a91f07 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/PageArgs.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/PageArgs.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.objecttools;
 
 /**
- * TODO
+ * Arguments passed to {@link ObjectPaginator}.
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc jm.ObjectTools}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SearchArgs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SearchArgs.java
index 80d26c4ac..c2be7a381 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SearchArgs.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SearchArgs.java
@@ -20,7 +20,7 @@ import java.util.*;
 import org.apache.juneau.internal.*;
 
 /**
- * Encapsulates arguments for the {@link ObjectSearcher} class.
+ * Arguments passed to {@link ObjectSearcher}.
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc jm.ObjectTools}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SortArgs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SortArgs.java
index 1d8f09913..cf6850b18 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SortArgs.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SortArgs.java
@@ -18,7 +18,7 @@ import static org.apache.juneau.internal.StringUtils.*;
 import java.util.*;
 
 /**
- * Encapsulates arguments for the {@link ObjectSorter} class.
+ * Arguments passed to {@link ObjectSorter}.
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc jm.ObjectTools}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
index c7f5a321c..df5508d7d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
@@ -21,7 +21,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
 
 /**
- * Provides string search capability for the {@link ObjectSearcher} class.
+ * String matcher factory for the {@link ObjectSearcher} class.
  *
  * <p>
  *     The class provides searching based on the following patterns:
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/TimeMatcherFactory.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/TimeMatcherFactory.java
index 5d32e9d13..12bddf522 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/TimeMatcherFactory.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/TimeMatcherFactory.java
@@ -23,7 +23,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
 
 /**
- * Provides date search capability for the {@link ObjectSearcher} class.
+ * Date/time matcher factory for the {@link ObjectSearcher} class.
  *
  * <p>
  *     The class provides searching based on the following patterns:
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ViewArgs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ViewArgs.java
index d41e3d704..13b90c975 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ViewArgs.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ViewArgs.java
@@ -18,7 +18,7 @@ import static org.apache.juneau.internal.StringUtils.*;
 import java.util.*;
 
 /**
- * Encapsulates arguments for the {@link ObjectViewer} class.
+ * Arguments passed to {@link ObjectViewer}.
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc jm.ObjectTools}
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/23.jm.Encoders.html 
b/juneau-doc/docs/Topics/02.juneau-marshall/23.jm.Encoders.html
index d95cd5f6f..fa7690e02 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/23.jm.Encoders.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/23.jm.Encoders.html
@@ -17,7 +17,7 @@
 
 <div class='topic'>
        <p>
-               The {@link org.apache.juneau.encoders} package defines an API 
for handling encoding-based matching
+               The {@link oaj.encoders} package defines an API for handling 
encoding-based matching
                of <c>Accept-Encoding</c>/<c>Content-Encoding</c> HTTP headers. 
 It consists of the following classes:
        </p>
        <ul class='javatree'>
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/25.jm.ObjectTools.html 
b/juneau-doc/docs/Topics/02.juneau-marshall/25.jm.ObjectTools.html
index 6e08ae193..a480d443e 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/25.jm.ObjectTools.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/25.jm.ObjectTools.html
@@ -13,11 +13,11 @@
  
***************************************************************************************************************************/
  -->
 
-{title:'Object Tools', created:'9.0.0', flags:'TODO'}
+{title:'Object Tools', created:'9.0.0'}
 
 <div class='topic'>
        <p>
-               The {@link org.apache.juneau.objecttools} package defines 
convenience utility classes for accessing
+               The {@link oaj.objecttools} package defines convenience utility 
classes for accessing
                and manipulating POJOs.  It consists of the following classes:
        </p>
        <ul class='javatree'>
@@ -50,16 +50,12 @@
                Leaves of the tree can be any type of object.
        </p>
        <p>
-               Use {@link #get(String) get()} to retrieve an element from a 
JSON tree.
-               <br>Use {@link #put(String,Object) put()} to create (or 
overwrite) an element in a JSON tree.
-               <br>Use {@link #post(String,Object) post()} to add an element 
to a list in a JSON tree.
-               <br>Use {@link #delete(String) delete()} to remove an element 
from a JSON tree.
+               Use {@link oaj.objecttools.ObjectRest#get(String) get()} to 
retrieve an element from a JSON tree.
+               <br>Use {@link oaj.objecttools.ObjectRest#put(String,Object) 
put()} to create (or overwrite) an element in a JSON tree.
+               <br>Use {@link oaj.objecttools.ObjectRest#post(String,Object) 
post()} to add an element to a list in a JSON tree.
+               <br>Use {@link oaj.objecttools.ObjectRest#delete(String) 
delete()} to remove an element from a JSON tree.
        </p>
-       <p>
-               Leading slashes in URLs are ignored.
-               So <js>"/xxx/yyy/zzz"</js> and <js>"xxx/yyy/zzz"</js> are 
considered identical.
-       </p>
-       <h5 class='section'>Example:</h5>
+       <h5 class='figure'>Example:</h5>
        <p class='bjava'>
        |       <jc>// Construct an unstructured POJO model</jc>
        |       JsonMap <jv>map</jv> = JsonMap.<jsm>ofJson</jsm>(<js>""</js>
@@ -83,7 +79,7 @@
        |       );
        |
        |       <jc>// Wrap Map inside an ObjectRest object</jc>
-       |       ObjectRest <jv>johnSmith</jv> = 
ObjectRest.<jsf>create</jsf>(<jv>map</jv>);
+       |       ObjectRest <jv>johnSmith</jv> = 
ObjectRest.<jsm>create</jsm>(<jv>map</jv>);
        |
        |       <jc>// Get a simple value at the top level</jc>
        |       <jc>// "John Smith"</jc>
@@ -126,33 +122,38 @@
                <br>The syntax is {@code @attr=val}, where attr is the 
attribute name on the child map, and val is the matching value.
        </p>
        
-       <h5 class='section'>Example:</h5>
+       <h5 class='figure'>Example:</h5>
        <p class='bjava'>
        |       <jc>// Get map/bean with name attribute value of 'foo' from a 
list of items</jc>
        |       Map <jv>map</jv> = 
<jv>objectRest</jv>.getMap(<js>"/items/@name=foo"</js>);
        </p>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
oajr.converter.Traversable} REST response converter.
+       </ul>
        
        <h5 class='topic'>ObjectSearcher</h5>
        <p>
-               The {@link ObjectSearcher} class is designed to provide 
searches across arrays and collections of beans and maps.
+               The {@link oaj.objecttools.ObjectSearcher} class is designed to 
provide searches across arrays and collections of maps or beans.
                It allows you to quickly filter beans and maps using simple yet 
sophisticated search arguments.
        </p>
        
-       <h5 class='section'>Example:</h5>
+       <h5 class='figure'>Example:</h5>
        <p class='bjava'> 
        |       MyBean[] <jv>arrayOfBeans</jv> = ...;
        |       ObjectSearcher <jv>searcher</jv> = 
ObjectSearcher.<jsm>create</jsm>();
-       |       BeanSession <jv>beanSession</jv> = 
BeanContext.<jsf>DEFAULT</jsf>.createSession();
        |       
-       |       <jc>// Find beans whose 'foo' property is 'bar'.</jc>
-       |       SearchArgs <jv>args</jv> = SearchArgs.create("foo=X,bar=Y");  
-       |
        |       <jc>// Returns a list of beans whose 'foo' property is 'X' and 
'bar' property is 'Y'.</jc>              
-       |       Object <jv>result</jv> = searcher.run(<jv>beanSession</jv>, 
<jv>arrayOfBeans</jv>, <jv>args</jv>);  
+       |       List&lt;MyBean&gt; <jv>result</jv> = 
<jv>searcher</jv>.run(<jv>arrayOfBeans</jv>, <js>"foo=X,bar=Y"</js>);  
        </p>
+       <p>
+               The tool can be used against the following data types:
+       </p>
+       <ul>
+               <li>Arrays/collections of maps or beans.
+       </ul>
        <p>
                The default searcher is configured with the following matcher 
factories that provides the capabilities of matching
-               against various data types:
+               against various data types.  This list is extensible:
        </p>
        <ul class='javatreec'>
                <li class='jc'>{@link oaj.objecttools.StringMatcherFactory}
@@ -160,7 +161,7 @@
                <li class='jc'>{@link oaj.objecttools.TimeMatcherFactory}
        </ul>
        <p>
-               The {@link oaj.objectools.StringMatcherFactory} class provides 
searching based on the following patterns:
+               The {@link oaj.objecttools.StringMatcherFactory} class provides 
searching based on the following patterns:
        </p>
        <ul>
                <li><js>"property=foo"</js> - Simple full word match
@@ -173,7 +174,7 @@
                <li><js>"property=/foo\\s+bar"</js> - Regular expression match
        </ul>
        <p>
-               The {@link oaj.objectools.NumberMatcherFactory} class provides 
searching based on the following patterns:
+               The {@link oaj.objecttools.NumberMatcherFactory} class provides 
searching based on the following patterns:
        </p>
        <ul>
                <li><js>"property=1"</js> - A single number
@@ -185,7 +186,7 @@
                <li><js>"property=!1"</js>,<js>"property=!1-2"</js> - Negation
        </ul>
        <p>
-               The {@link oaj.objectools.TimeMatcherFactory} class provides 
searching based on the following patterns:
+               The {@link oaj.objecttools.TimeMatcherFactory} class provides 
searching based on the following patterns:
        </p>
        <ul>
                <li><js>"property=2011"</js> - A single year
@@ -199,368 +200,144 @@
                
<li><js>"property=&gt;2011"</js>,<js>"property=&gt;=2011"</js>,<js>"property=&lt;2011"</js>,<js>"property=&lt;=2011"</js>
 - Open-ended ranges
                <li><js>"property=2011 - 2013-06-30"</js> - Closed ranges
        </ul>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
oajr.converter.Queryable} REST response converter.
+       </ul>
 
        <h5 class='topic'>ObjectSorter</h5>
        <p>
-               The {@link ObjectSorter} class is designed to sort arrays and 
collections of beans and maps.
+               The {@link oaj.objecttools.ObjectSorter} class is designed to 
sort arrays and collections of maps or beans.
        </p>
-       <h5 class='section'>Example:</h5>
+       <h5 class='figure'>Example:</h5>
        <p class='bjava'> 
        |       MyBean[] <jv>arrayOfBeans</jv> = ...;
        |       ObjectSorter <jv>sorter</jv> = ObjectSorter.<jsm>create</jsm>();
-       |       BeanSession <jv>beanSession</jv> = 
BeanContext.<jsf>DEFAULT</jsf>.createSession();
        |       
-       |       <jc>// Sort beans by foo ascending then bar descending.</jc>
-       |       SortArgs <jv>args</jv> = SortArgs.create("foo,bar-");  
-       |
        |       <jc>// Returns a list of beans sorted accordingly.</jc>         
-       |       Object <jv>result</jv> = sorter.run(<jv>beanSession</jv>, 
<jv>arrayOfBeans</jv>, <jv>args</jv>);  
+       |       List&lt;MyBean&gt; <jv>result</jv> = 
<jv>sorter</jv>.run(<jv>arrayOfBeans</jv>, <js>"foo,bar-"</js>);  
+       </p>
+       <p>
+               The tool can be used against the following data types:
+       </p>
+       <ul>
+               <li>Arrays/collections of maps or beans.
+       </ul>
+       <p>
+               The arguments are a simple comma-delimited list of property 
names optionally suffixed with <js>'+'</js> and <js>'-'</js> to 
+               denote ascending/descending order.
        </p>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
oajr.converter.Queryable} REST response converter.
+       </ul>
        
        <h5 class='topic'>ObjectViewer</h5>
        <p>
-               The {@link ObjectViewer} class is designed to extract 
properties from collections of maps and beans.
+               The {@link oaj.objecttools.ObjectViewer} class is designed to 
extract properties from collections of maps or beans.
        </p>
-       <h5 class='section'>Example:</h5>
+       <h5 class='figure'>Example:</h5>
        <p class='bjava'> 
        |       MyBean[] <jv>arrayOfBeans</jv> = ...;
-       |       ObjectSorter <jv>sorter</jv> = ObjectSorter.<jsm>create</jsm>();
-       |       BeanSession <jv>beanSession</jv> = 
BeanContext.<jsf>DEFAULT</jsf>.createSession();
-       |       
-       |       <jc>// Extract properties 'foo' and 'bar' from the beans.</jc>
-       |       ViewArgs <jv>args</jv> = ViewArgs.create("foo,bar");  
-       |
-       |       <jc>// Returns list of maps with just .</jc>            
-       |       Object <jv>result</jv> = sorter.run(<jv>beanSession</jv>, 
<jv>arrayOfBeans</jv>, <jv>sortArgs</jv>);  
-       </p>
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Null input
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void nullInput() {
-               assertNull(p.run(bs, null, null));
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Simple bean
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       public static class A {
-               public String f1,f2;
-
-               public static A create(String f1, String f2) {
-                       A a = new A();
-                       a.f1 = f1;
-                       a.f2 = f2;
-                       return a;
-               }
-       }
-
-       @Test
-       public void simpleBean() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = A.create("x1","x2");
-               assertObject(p.run(bs, in, sa)).asJson().is("{f1:'x1'}");
-       }
-
-       @Test
-       public void simpleBean_reverseColumns() {
-               ViewArgs sa = new ViewArgs("f2","f1");
-               Object in = A.create("x1","x2");
-               assertObject(p.run(bs, in, 
sa)).asJson().is("{f2:'x2',f1:'x1'}");
-       }
-
-       @Test
-       public void simpleBean_dupColumns() {
-               ViewArgs sa = new ViewArgs("f1","f1");
-               Object in = A.create("x1","x2");
-               assertObject(p.run(bs, in, sa)).asJson().is("{f1:'x1'}");
-       }
-
-       @Test
-       public void simpleBean_nonExistentColumns() {
-               ViewArgs sa = new ViewArgs("fx");
-               Object in = A.create("x1","x2");
-               assertObject(p.run(bs, in, sa)).asJson().is("{}");
-       }
-
-       @Test
-       public void simpleBean_nullColumn() {
-               ViewArgs sa = new ViewArgs("f1",null);
-               Object in = A.create("x1","x2");
-               assertObject(p.run(bs, in, sa)).asJson().is("{f1:'x1'}");
-       }
-
-       @Test
-       public void simpleBean_emptyArgs() {
-               ViewArgs sa = new ViewArgs();
-               Object in = A.create("x1","x2");
-               assertObject(p.run(bs, in, sa)).asJson().is("{}");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Simple BeanMap
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void simpleBeanMap() {
-               ViewArgs sa = new ViewArgs("f1");
-               Object in = bs.toBeanMap(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("{f1:'x1'}");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Simple map
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void simpleMap() {
-               ViewArgs sa = new ViewArgs("f1");
-               Object in = map("f1","x1","f2","x2");
-               assertObject(p.run(bs, in, sa)).asJson().is("{f1:'x1'}");
-       }
-
-       @Test
-       public void simpleMap_reverseColumns() {
-               ViewArgs sa = new ViewArgs("f2","f1");
-               Object in = map("f1","x1","f2","x2");
-               assertObject(p.run(bs, in, 
sa)).asJson().is("{f2:'x2',f1:'x1'}");
-       }
-
-       @Test
-       public void simpleMap_nonExistentColumns() {
-               ViewArgs sa = new ViewArgs("fx");
-               Object in = map("f1","x1","f2","x2");
-               assertObject(p.run(bs, in, sa)).asJson().is("{}");
-       }
-
-       @Test
-       public void simpleMap_nullColumn() {
-               ViewArgs sa = new ViewArgs("f1",null);
-               Object in = map("f1","x1","f2","x2");
-               assertObject(p.run(bs, in, sa)).asJson().is("{f1:'x1'}");
-       }
-
-       @Test
-       public void simpleMap_emptyView() {
-               ViewArgs sa = new ViewArgs();
-               Object in = map("f1","x1","f2","x2");
-               assertObject(p.run(bs, in, sa)).asJson().is("{}");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Bean array
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void beanArray() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = new A[]{A.create("x1","x2")};
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       @Test
-       public void beanArray_reverseColumns() {
-               ViewArgs sa = new ViewArgs("f2","f1");
-               Object in = new A[]{A.create("x1","x2")};
-               assertObject(p.run(bs, in, 
sa)).asJson().is("[{f2:'x2',f1:'x1'}]");
-       }
-
-       @Test
-       public void beanArray_dupColumns() {
-               ViewArgs sa = new ViewArgs("f1","f1");
-               Object in = new A[]{A.create("x1","x2")};
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       @Test
-       public void beanArray_nonExistentColumns() {
-               ViewArgs sa = new ViewArgs("fx");
-               Object in = new A[]{A.create("x1","x2")};
-               assertObject(p.run(bs, in, sa)).asJson().is("[{}]");
-       }
-
-       @Test
-       public void beanArray_nullColumn() {
-               ViewArgs sa = new ViewArgs("f1",null);
-               Object in = new A[]{A.create("x1","x2")};
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       @Test
-       public void beanArray_emptyArgs() {
-               ViewArgs sa = new ViewArgs();
-               Object in = new A[]{A.create("x1","x2")};
-               assertObject(p.run(bs, in, sa)).asJson().is("[{}]");
-       }
-
-       @Test
-       public void beanArray_withNull() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = new A[]{A.create("x1","x2"),null};
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'},null]");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Bean list
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void beanList() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = list(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       @Test
-       public void beanList_reverseColumns() {
-               ViewArgs sa = new ViewArgs("f2","f1");
-               Object in = list(A.create("x1","x2"));
-               assertObject(p.run(bs, in, 
sa)).asJson().is("[{f2:'x2',f1:'x1'}]");
-       }
-
-       @Test
-       public void beanList_dupColumns() {
-               ViewArgs sa = new ViewArgs("f1","f1");
-               Object in = list(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       @Test
-       public void beanList_nonExistentColumns() {
-               ViewArgs sa = new ViewArgs("fx");
-               Object in = list(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{}]");
-       }
-
-       @Test
-       public void beanList_nullColumn() {
-               ViewArgs sa = new ViewArgs("f1",null);
-               Object in = list(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       @Test
-       public void beanList_emptyArgs() {
-               ViewArgs sa = new ViewArgs();
-               Object in = list(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{}]");
-       }
-
-       @Test
-       public void beanList_withNull() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = list(A.create("x1","x2"),null);
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'},null]");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Bean set
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void beanSet() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = set(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       @Test
-       public void beanSet_reverseColumns() {
-               ViewArgs sa = new ViewArgs("f2","f1");
-               Object in = set(A.create("x1","x2"));
-               assertObject(p.run(bs, in, 
sa)).asJson().is("[{f2:'x2',f1:'x1'}]");
-       }
+       |       ObjectViewer <jv>viewer</jv> = ObjectViewer.<jsm>create</jsm>();
 
-       @Test
-       public void beanSet_dupColumns() {
-               ViewArgs sa = new ViewArgs("f1","f1");
-               Object in = set(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       @Test
-       public void beanSet_nonExistentColumns() {
-               ViewArgs sa = new ViewArgs("fx");
-               Object in = set(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{}]");
-       }
-
-       @Test
-       public void beanSet_nullColumn() {
-               ViewArgs sa = new ViewArgs("f1",null);
-               Object in = set(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       @Test
-       public void beanSet_emptyArgs() {
-               ViewArgs sa = new ViewArgs();
-               Object in = set(A.create("x1","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{}]");
-       }
-
-       @Test
-       public void beanSet_withNull() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = set(A.create("x1","x2"),null);
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'},null]");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Other object
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void otherObject() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = "foobar";
-               assertObject(p.run(bs, in, sa)).asJson().is("'foobar'");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Map list
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void mapList() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = list(map("f1","x1","f2","x2"));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // BeanMap list
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void beanMapList() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = list(bs.toBeanMap(A.create("x1","x2")));
-               assertObject(p.run(bs, in, sa)).asJson().is("[{f1:'x1'}]");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Other object list
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       @Test
-       public void otherObjectList() {
-               ViewArgs sa = new ViewArgs("f1");;
-               Object in = list("foobar");
-               assertObject(p.run(bs, in, sa)).asJson().is("['foobar']");
-       }
-       
-       
-        * Designed to provide paging on POJOs consisting of arrays and 
collections.
- *
- * <p>
- * Allows you to quickly return subsets of arrays and collections based on 
position/limit arguments.
-       
+       |       <jc>// Returns the 'foo' and 'bar' properties extracted into a 
list of maps.</jc>               
+       |       List&lt;Map&gt; <jv>result</jv> = 
<jv>viewer</jv>.run(<jv>arrayOfBeans</jv>, <js>"foo,bar"</js>);  
+       </p>
+       <p>
+               The tool can be used against the following data types:
+       </p>
+       <ul>
+               <li>Arrays/collections of maps or beans.
+               <li>Singular maps or beans.
+       </ul>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
oajr.converter.Queryable} REST response converter.
+       </ul>
        
        <h5 class='topic'>ObjectPaginator</h5>
+       <p>
+               The {@link oaj.objecttools.ObjectPaginator} class is designed 
to extract sublists from arrays/collections of maps or beans.
+       </p>
+       <h5 class='figure'>Example:</h5>
+       <p class='bjava'> 
+       |       MyBean[] <jv>arrayOfBeans</jv> = ...;
+       |       ObjectPaginator <jv>paginator</jv> = 
ObjectPaginator.<jsm>create</jsm>();
+       |       
+       |       <jc>// Returns all rows from 100 to 110.</jc>           
+       |       List&lt;MyBean&gt; <jv>result</jv> = 
<jv>paginator</jv>.run(<jv>arrayOfBeans</jv>, 100, 10);  
+       </p>
+       <p>
+               The tool can be used against the following data types:
+       </p>
+       <ul>
+               <li>Arrays/collections of maps or beans.
+       </ul>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
oajr.converter.Queryable} REST response converter.
+       </ul>
+
        <h5 class='topic'>ObjectIntrospector</h5>
+       <p>
+               The {@link oaj.objecttools.ObjectIntrospector} class is used to 
invoke methods on {@code Objects} using arguments in serialized form.
+       </p>
+       <h5 class='figure'>Example:</h5>
+       <p class='bjava'>
+       |       String <jv>string1</jv> = <js>"foobar"</js>;
+       |       String <jv>string2</jv> = ObjectIntrospector
+       |               .create(<jv>string</jv>)
+       |               .invoke(String.<jk>class</jk>, 
<js>"substring(int,int)"</js>, <js>"[3,6]"</js>);  <jc>// "bar"</jc>
+       </p>
+       <p>
+               The arguments passed to the identified method are POJOs 
serialized in JSON format.  Arbitrarily complex arguments can be passed
+               in as arguments.
+       </p>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
oajr.converter.Introspectable} REST response converter.
+               <li class='warn'>This is an extremely powerful but potentially 
dangerous tool.  Use wisely.
+       </ul>
+       
        <h5 class='topic'>ObjectMerger</h5>
+       <p>
+               The {@link oaj.objecttools.ObjectMerger} class is used for 
merging POJOs behind a single interface.
+               This is particularly useful in cases where you want to define 
beans with 'default' values.
+       </p>
+       <p>
+               For example, given the following bean classes:
+       </p>
+
+       <p class='bjava'>
+       |       <jk>public interface</jk> IA {
+       |               String getX();
+       |               <jk>void</jk> setX(String <jv>x</jv>);
+       |       }
+       |
+       |       <jk>public class</jk> A <jk>implements</jk> IA {
+       |               <jk>private</jk> String <jf>x</jf>;
+       |
+       |               <jk>public</jk> A(String <jv>x</jv>) {
+       |                       <jk>this</jk>.<jf>x</jf> = <jv>x</jv>;
+       |               }
+       |
+       |               <jk>public</jk> String getX() {
+       |                       <jk>return</jk> <jf>x</jf>;
+       |               }
+       |
+       |               <jk>public void</jk> setX(String <jv>x</jv>) {
+       |                       <jk>this</jk>.<jf>x</jf> = <jv>x</jv>;
+       |               }
+       |       }
+       </p>
+       <p>
+               The getters will be called in order until the first non-null 
value is returned:
+       </p>
+       <p class='bjava'>
+       |       <jv>merge</jv> = 
ObjectMerger.<jsm>merger</jsm>(IA.<jk>class</jk>, <jk>new</jk> A(<js>"1"</js>), 
<jk>new</jk> A(<js>"2"</js>));
+       |       <jsm>assertEquals</jsm>(<js>"1"</js>, <jv>merge</jv>.getX());
+       |
+       |       <jv>merge</jv> = 
ObjectMerger.<jsm>merger</jsm>(IA.<jk>class</jk>, <jk>new</jk> 
A(<jk>null</jk>), <jk>new</jk> A(<js>"2"</js>));
+       |       <jsm>assertEquals</jsm>(<js>"2"</js>, <jv>merge</jv>.getX());
+       |
+       |       <jv>merge</jv> = 
ObjectMerger.<jsm>merger</jsm>(IA.<jk>class</jk>, <jk>new</jk> 
A(<jk>null</jk>), <jk>new</jk> A(<jk>null</jk>));
+       |       <jsm>assertEquals</jsm>(<jk>null</jk>, <jv>merge</jv>.getX());
+       </p>
+       
 </div>
\ No newline at end of file
diff --git 
a/juneau-doc/docs/Topics/02.juneau-marshall/29.jm.HtmlDetails/04.jm.HtmlAnnotation.html
 
b/juneau-doc/docs/Topics/02.juneau-marshall/29.jm.HtmlDetails/04.jm.HtmlAnnotation.html
index 26630ae3a..b70801b78 100644
--- 
a/juneau-doc/docs/Topics/02.juneau-marshall/29.jm.HtmlDetails/04.jm.HtmlAnnotation.html
+++ 
b/juneau-doc/docs/Topics/02.juneau-marshall/29.jm.HtmlDetails/04.jm.HtmlAnnotation.html
@@ -48,7 +48,7 @@
        </p>
        <h5 class='figure'>Example:</h5>
        <p class='bjava'>
-               |       <jc>// Produces &lt;a href='...'&gt;CLICK ME!&lt;/a&gt; 
when serialized to HTML.</jc>
+               |       <jc>// Produces &lt;a ...&gt;CLICK ME!&lt;/a&gt; when 
serialized to HTML.</jc>
                |       <jk>public class</jk> FileSpace {
                |               <jc>// Add a hyperlink to this bean 
property.</jc>
                |               
<ja>@Html</ja>(link=<js>"servlet:/drive/{drive}"</js>, anchorText=<js>"CLICK 
ME!"</js>)
diff --git a/juneau-doc/src/main/javadoc/overview.html 
b/juneau-doc/src/main/javadoc/overview.html
index a40251cdd..c510d66ef 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -223,7 +223,7 @@
                </ol>
                <li><p><a class='doclink' 
href='#juneau-marshall.jm.Encoders'>Encoders</a><span class='update'>created: 
<b>9.0.0</b></span></p>
                <li><p><a class='doclink' 
href='#juneau-marshall.jm.HttpParts'>HTTP Parts</a><span 
class='update'>created: <b>9.0.0</b>, <b><red>TODO</red></b></span></p>
-               <li><p><a class='doclink' 
href='#juneau-marshall.jm.PojoTools'>POJO Tools</a><span 
class='update'>created: <b>9.0.0</b>, <b><red>TODO</red></b></span></p>
+               <li><p><a class='doclink' 
href='#juneau-marshall.jm.ObjectTools'>Object Tools</a><span 
class='update'>created: <b>9.0.0</b></span></p>
                <li><p><a class='doclink' 
href='#juneau-marshall.jm.JsonDetails'>JSON Details</a></p>
                <ol>
                        <li><p><a class='doclink' 
href='#juneau-marshall.jm.JsonDetails.jm.JsonMethodology'>JSON 
Methodology</a></p>
@@ -6257,14 +6257,334 @@
 
 <!-- 
====================================================================================================
 -->
 
-<h3 class='topic' onclick='toggle(this)'><a 
href='#juneau-marshall.jm.PojoTools' id='juneau-marshall.jm.PojoTools'>2.25 - 
POJO Tools</a><span class='update'>created: <b>9.0.0</b>, 
<b><red>TODO</red></b></span></h3>
-<div class='topic'><!-- START: 2.25 - juneau-marshall.jm.PojoTools -->
+<h3 class='topic' onclick='toggle(this)'><a 
href='#juneau-marshall.jm.ObjectTools' id='juneau-marshall.jm.ObjectTools'>2.25 
- Object Tools</a><span class='update'>created: <b>9.0.0</b></span></h3>
+<div class='topic'><!-- START: 2.25 - juneau-marshall.jm.ObjectTools -->
 <div class='topic'>
        <p>
-               TODO
+               The {@link org.apache.juneau.objecttools} package defines 
convenience utility classes for accessing
+               and manipulating POJOs.  It consists of the following classes:
+       </p>
+       <ul class='javatree'>
+               <li class='jc'>{@link org.apache.juneau.objecttools.ObjectRest}
+               <li class='jc'>{@link 
org.apache.juneau.objecttools.ObjectSearcher}
+               <li class='jc'>{@link 
org.apache.juneau.objecttools.ObjectSorter}
+               <li class='jc'>{@link 
org.apache.juneau.objecttools.ObjectViewer}
+               <li class='jc'>{@link 
org.apache.juneau.objecttools.ObjectPaginator}
+               <li class='jc'>{@link 
org.apache.juneau.objecttools.ObjectIntrospector}
+               <li class='jc'>{@link 
org.apache.juneau.objecttools.ObjectMerger}
+       </ul>
+       
+       <h5 class='topic'>ObjectRest</h5>
+       <p>
+               The {@link org.apache.juneau.objecttools.ObjectRest} class 
provides the ability to perform standard REST operations (GET, PUT, POST, 
DELETE) against nodes in a POJO model.
+               Nodes in the POJO model are addressed using URLs.
+       </p>
+       <p>
+               A POJO model is defined as a tree model where nodes consist of 
consisting of the following:
+       </p>
+       <ul class='spaced-list'>
+               <li>
+                       {@link Map Maps} and Java beans representing JSON 
objects.
+               <li>
+                       {@link Collection Collections} and arrays representing 
JSON arrays.
+               <li>
+                       Java beans.
+       </ul>
+       <p>
+               Leaves of the tree can be any type of object.
+       </p>
+       <p>
+               Use {@link org.apache.juneau.objecttools.ObjectRest#get(String) 
get()} to retrieve an element from a JSON tree.
+               <br>Use {@link 
org.apache.juneau.objecttools.ObjectRest#put(String,Object) put()} to create 
(or overwrite) an element in a JSON tree.
+               <br>Use {@link 
org.apache.juneau.objecttools.ObjectRest#post(String,Object) post()} to add an 
element to a list in a JSON tree.
+               <br>Use {@link 
org.apache.juneau.objecttools.ObjectRest#delete(String) delete()} to remove an 
element from a JSON tree.
+       </p>
+       <h5 class='figure'>Example:</h5>
+       <p class='bjava'>
+       <jc>// Construct an unstructured POJO model</jc>
+       JsonMap <jv>map</jv> = JsonMap.<jsm>ofJson</jsm>(<js>""</js>
+               + <js>"{"</js>
+               + <js>" name:'John Smith', "</js>
+               + <js>" address:{ "</js>
+               + <js>"         streetAddress:'21 2nd Street', "</js>
+               + <js>"         city:'New York', "</js>
+               + <js>"         state:'NY', "</js>
+               + <js>"         postalCode:10021 "</js>
+               + <js>" }, "</js>
+               + <js>" phoneNumbers:[ "</js>
+               + <js>"         '212 555-1111', "</js>
+               + <js>"         '212 555-2222' "</js>
+               + <js>" ], "</js>
+               + <js>" additionalInfo:null, "</js>
+               + <js>" remote:false, "</js>
+               + <js>" height:62.4, "</js>
+               + <js>" 'fico score':' &gt; 640' "</js>
+               + <js>"} "</js>
+       );
+
+       <jc>// Wrap Map inside an ObjectRest object</jc>
+       ObjectRest <jv>johnSmith</jv> = 
ObjectRest.<jsm>create</jsm>(<jv>map</jv>);
+
+       <jc>// Get a simple value at the top level</jc>
+       <jc>// "John Smith"</jc>
+       String <jv>name</jv> = <jv>johnSmith</jv>.getString(<js>"name"</js>);
+
+       <jc>// Change a simple value at the top level</jc>
+       <jv>johnSmith</jv>.put(<js>"name"</js>, <js>"The late John Smith"</js>);
+
+       <jc>// Get a simple value at a deep level</jc>
+       <jc>// "21 2nd Street"</jc>
+       String <jv>streetAddress</jv> = 
<jv>johnSmith</jv>.getString(<js>"address/streetAddress"</js>);
+
+       <jc>// Set a simple value at a deep level</jc>
+       <jv>johnSmith</jv>.put(<js>"address/streetAddress"</js>, <js>"101 
Cemetery Way"</js>);
+
+       <jc>// Get entries in a list</jc>
+       <jc>// "212 555-1111"</jc>
+       String <jv>firstPhoneNumber</jv> = 
<jv>johnSmith</jv>.getString(<js>"phoneNumbers/0"</js>);
+
+       <jc>// Add entries to a list</jc>
+       <jv>johnSmith</jv>.post(<js>"phoneNumbers"</js>, <js>"212 
555-3333"</js>);
+
+       <jc>// Delete entries from a model</jc>
+       <jv>johnSmith</jv>.delete(<js>"fico score"</js>);
+
+       <jc>// Add entirely new structures to the tree</jc>
+       JsonMap <jv>medicalInfo</jv> = JsonMap.<jsm>ofJson</jsm>(<js>""</js>
+               + <js>"{"</js>
+               + <js>" currentStatus: 'deceased',"</js>
+               + <js>" health: 'non-existent',"</js>
+               + <js>" creditWorthiness: 'not good'"</js>
+               + <js>"}"</js>
+       );
+       <jv>johnSmith</jv>.put(<js>"additionalInfo/medicalInfo"</js>, 
<jv>medicalInfo</jv>);
+       </p>
+
+       <p>
+               In the special case of collections/arrays of maps/beans, a 
special XPath-like selector notation can be used in lieu
+               of index numbers on GET requests to return a map/bean with a 
specified attribute value.
+               <br>The syntax is {@code @attr=val}, where attr is the 
attribute name on the child map, and val is the matching value.
+       </p>
+       
+       <h5 class='figure'>Example:</h5>
+       <p class='bjava'>
+       <jc>// Get map/bean with name attribute value of 'foo' from a list of 
items</jc>
+       Map <jv>map</jv> = 
<jv>objectRest</jv>.getMap(<js>"/items/@name=foo"</js>);
+       </p>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
org.apache.juneau.rest.converter.Traversable} REST response converter.
+       </ul>
+       
+       <h5 class='topic'>ObjectSearcher</h5>
+       <p>
+               The {@link org.apache.juneau.objecttools.ObjectSearcher} class 
is designed to provide searches across arrays and collections of maps or beans.
+               It allows you to quickly filter beans and maps using simple yet 
sophisticated search arguments.
+       </p>
+       
+       <h5 class='figure'>Example:</h5>
+       <p class='bjava'> 
+       MyBean[] <jv>arrayOfBeans</jv> = ...;
+       ObjectSearcher <jv>searcher</jv> = ObjectSearcher.<jsm>create</jsm>();
+       
+       <jc>// Returns a list of beans whose 'foo' property is 'X' and 'bar' 
property is 'Y'.</jc>              
+       List&lt;MyBean&gt; <jv>result</jv> = 
<jv>searcher</jv>.run(<jv>arrayOfBeans</jv>, <js>"foo=X,bar=Y"</js>);  
+       </p>
+       <p>
+               The tool can be used against the following data types:
+       </p>
+       <ul>
+               <li>Arrays/collections of maps or beans.
+       </ul>
+       <p>
+               The default searcher is configured with the following matcher 
factories that provides the capabilities of matching
+               against various data types.  This list is extensible:
        </p>
+       <ul class='javatreec'>
+               <li class='jc'>{@link 
org.apache.juneau.objecttools.StringMatcherFactory}
+               <li class='jc'>{@link 
org.apache.juneau.objecttools.NumberMatcherFactory}
+               <li class='jc'>{@link 
org.apache.juneau.objecttools.TimeMatcherFactory}
+       </ul>
+       <p>
+               The {@link org.apache.juneau.objecttools.StringMatcherFactory} 
class provides searching based on the following patterns:
+       </p>
+       <ul>
+               <li><js>"property=foo"</js> - Simple full word match
+               <li><js>"property=fo*"</js>, <js>"property=?ar"</js> - 
Meta-character matching
+               <li><js>"property=foo bar"</js>(implicit), <js>"property=^foo 
^bar"</js>(explicit) - Multiple OR'ed patterns
+               <li><js>"property=+fo* +*ar"</js> - Multiple AND'ed patterns
+               <li><js>"property=fo* -bar"</js> - Negative patterns
+               <li><js>"property='foo bar'"</js> - Patterns with whitespace
+               <li><js>"property=foo\\'bar"</js> - Patterns with single-quotes
+               <li><js>"property=/foo\\s+bar"</js> - Regular expression match
+       </ul>
+       <p>
+               The {@link org.apache.juneau.objecttools.NumberMatcherFactory} 
class provides searching based on the following patterns:
+       </p>
+       <ul>
+               <li><js>"property=1"</js> - A single number
+               <li><js>"property=1 2"</js> - Multiple OR'ed numbers
+               <li><js>"property=-1 -2"</js> - Multiple OR'ed negative numbers
+               <li><js>"property=1-2"</js>,<js>"property=-2--1"</js>  - A 
range of numbers (whitespace ignored)
+               <li><js>"property=1-2 4-5"</js> - Multiple OR'ed ranges
+               
<li><js>"property=&lt;1"</js>,<js>"property=&lt;=1"</js>,<js>"property=&gt;1"</js>,<js>"property=&gt;=1"</js>
 - Open-ended ranges
+               <li><js>"property=!1"</js>,<js>"property=!1-2"</js> - Negation
+       </ul>
+       <p>
+               The {@link org.apache.juneau.objecttools.TimeMatcherFactory} 
class provides searching based on the following patterns:
+       </p>
+       <ul>
+               <li><js>"property=2011"</js> - A single year
+               <li><js>"property=2011 2013 2015"</js> - Multiple years
+               <li><js>"property=2011-01"</js> - A single month
+               <li><js>"property=2011-01-01"</js> - A single day
+               <li><js>"property=2011-01-01T12"</js> - A single hour
+               <li><js>"property=2011-01-01T12:30"</js> - A single minute
+               <li><js>"property=2011-01-01T12:30:45"</js> - A single second
+               
<li><js>"property=&gt;2011"</js>,<js>"property=&gt;=2011"</js>,<js>"property=&lt;2011"</js>,<js>"property=&lt;=2011"</js>
 - Open-ended ranges
+               
<li><js>"property=&gt;2011"</js>,<js>"property=&gt;=2011"</js>,<js>"property=&lt;2011"</js>,<js>"property=&lt;=2011"</js>
 - Open-ended ranges
+               <li><js>"property=2011 - 2013-06-30"</js> - Closed ranges
+       </ul>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
org.apache.juneau.rest.converter.Queryable} REST response converter.
+       </ul>
+
+       <h5 class='topic'>ObjectSorter</h5>
+       <p>
+               The {@link org.apache.juneau.objecttools.ObjectSorter} class is 
designed to sort arrays and collections of maps or beans.
+       </p>
+       <h5 class='figure'>Example:</h5>
+       <p class='bjava'> 
+       MyBean[] <jv>arrayOfBeans</jv> = ...;
+       ObjectSorter <jv>sorter</jv> = ObjectSorter.<jsm>create</jsm>();
+       
+       <jc>// Returns a list of beans sorted accordingly.</jc>         
+       List&lt;MyBean&gt; <jv>result</jv> = 
<jv>sorter</jv>.run(<jv>arrayOfBeans</jv>, <js>"foo,bar-"</js>);  
+       </p>
+       <p>
+               The tool can be used against the following data types:
+       </p>
+       <ul>
+               <li>Arrays/collections of maps or beans.
+       </ul>
+       <p>
+               The arguments are a simple comma-delimited list of property 
names optionally suffixed with <js>'+'</js> and <js>'-'</js> to 
+               denote ascending/descending order.
+       </p>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
org.apache.juneau.rest.converter.Queryable} REST response converter.
+       </ul>
+       
+       <h5 class='topic'>ObjectViewer</h5>
+       <p>
+               The {@link org.apache.juneau.objecttools.ObjectViewer} class is 
designed to extract properties from collections of maps or beans.
+       </p>
+       <h5 class='figure'>Example:</h5>
+       <p class='bjava'> 
+       MyBean[] <jv>arrayOfBeans</jv> = ...;
+       ObjectViewer <jv>viewer</jv> = ObjectViewer.<jsm>create</jsm>();
+       <jc>// Returns the 'foo' and 'bar' properties extracted into a list of 
maps.</jc>               
+       List&lt;Map&gt; <jv>result</jv> = 
<jv>viewer</jv>.run(<jv>arrayOfBeans</jv>, <js>"foo,bar"</js>);  
+       </p>
+       <p>
+               The tool can be used against the following data types:
+       </p>
+       <ul>
+               <li>Arrays/collections of maps or beans.
+               <li>Singular maps or beans.
+       </ul>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
org.apache.juneau.rest.converter.Queryable} REST response converter.
+       </ul>
+       
+       <h5 class='topic'>ObjectPaginator</h5>
+       <p>
+               The {@link org.apache.juneau.objecttools.ObjectPaginator} class 
is designed to extract sublists from arrays/collections of maps or beans.
+       </p>
+       <h5 class='figure'>Example:</h5>
+       <p class='bjava'> 
+       MyBean[] <jv>arrayOfBeans</jv> = ...;
+       ObjectPaginator <jv>paginator</jv> = 
ObjectPaginator.<jsm>create</jsm>();
+       
+       <jc>// Returns all rows from 100 to 110.</jc>           
+       List&lt;MyBean&gt; <jv>result</jv> = 
<jv>paginator</jv>.run(<jv>arrayOfBeans</jv>, 100, 10);  
+       </p>
+       <p>
+               The tool can be used against the following data types:
+       </p>
+       <ul>
+               <li>Arrays/collections of maps or beans.
+       </ul>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
org.apache.juneau.rest.converter.Queryable} REST response converter.
+       </ul>
+
+       <h5 class='topic'>ObjectIntrospector</h5>
+       <p>
+               The {@link org.apache.juneau.objecttools.ObjectIntrospector} 
class is used to invoke methods on {@code Objects} using arguments in 
serialized form.
+       </p>
+       <h5 class='figure'>Example:</h5>
+       <p class='bjava'>
+       String <jv>string1</jv> = <js>"foobar"</js>;
+       String <jv>string2</jv> = ObjectIntrospector
+               .create(<jv>string</jv>)
+               .invoke(String.<jk>class</jk>, <js>"substring(int,int)"</js>, 
<js>"[3,6]"</js>);  <jc>// "bar"</jc>
+       </p>
+       <p>
+               The arguments passed to the identified method are POJOs 
serialized in JSON format.  Arbitrarily complex arguments can be passed
+               in as arguments.
+       </p>
+       <ul class='notes'>
+               <li class='note'>This class is used in the {@link 
org.apache.juneau.rest.converter.Introspectable} REST response converter.
+               <li class='warn'>This is an extremely powerful but potentially 
dangerous tool.  Use wisely.
+       </ul>
+       
+       <h5 class='topic'>ObjectMerger</h5>
+       <p>
+               The {@link org.apache.juneau.objecttools.ObjectMerger} class is 
used for merging POJOs behind a single interface.
+               This is particularly useful in cases where you want to define 
beans with 'default' values.
+       </p>
+       <p>
+               For example, given the following bean classes:
+       </p>
+
+       <p class='bjava'>
+       <jk>public interface</jk> IA {
+               String getX();
+               <jk>void</jk> setX(String <jv>x</jv>);
+       }
+
+       <jk>public class</jk> A <jk>implements</jk> IA {
+               <jk>private</jk> String <jf>x</jf>;
+
+               <jk>public</jk> A(String <jv>x</jv>) {
+                       <jk>this</jk>.<jf>x</jf> = <jv>x</jv>;
+               }
+
+               <jk>public</jk> String getX() {
+                       <jk>return</jk> <jf>x</jf>;
+               }
+
+               <jk>public void</jk> setX(String <jv>x</jv>) {
+                       <jk>this</jk>.<jf>x</jf> = <jv>x</jv>;
+               }
+       }
+       </p>
+       <p>
+               The getters will be called in order until the first non-null 
value is returned:
+       </p>
+       <p class='bjava'>
+       <jv>merge</jv> = ObjectMerger.<jsm>merger</jsm>(IA.<jk>class</jk>, 
<jk>new</jk> A(<js>"1"</js>), <jk>new</jk> A(<js>"2"</js>));
+       <jsm>assertEquals</jsm>(<js>"1"</js>, <jv>merge</jv>.getX());
+
+       <jv>merge</jv> = ObjectMerger.<jsm>merger</jsm>(IA.<jk>class</jk>, 
<jk>new</jk> A(<jk>null</jk>), <jk>new</jk> A(<js>"2"</js>));
+       <jsm>assertEquals</jsm>(<js>"2"</js>, <jv>merge</jv>.getX());
+
+       <jv>merge</jv> = ObjectMerger.<jsm>merger</jsm>(IA.<jk>class</jk>, 
<jk>new</jk> A(<jk>null</jk>), <jk>new</jk> A(<jk>null</jk>));
+       <jsm>assertEquals</jsm>(<jk>null</jk>, <jv>merge</jv>.getX());
+       </p>
+       
 </div>
-</div><!-- END: 2.25 - juneau-marshall.jm.PojoTools -->
+</div><!-- END: 2.25 - juneau-marshall.jm.ObjectTools -->
 
 <!-- 
====================================================================================================
 -->
 
@@ -9506,7 +9826,7 @@
        </p>
        <h5 class='figure'>Example:</h5>
        <p class='bjava'>
-       <jc>// Produces &lt;a href='...'&gt;CLICK ME!&lt;/a&gt; when serialized 
to HTML.</jc>
+       <jc>// Produces &lt;a ...&gt;CLICK ME!&lt;/a&gt; when serialized to 
HTML.</jc>
        <jk>public class</jk> FileSpace {
                <jc>// Add a hyperlink to this bean property.</jc>
                <ja>@Html</ja>(link=<js>"servlet:/drive/{drive}"</js>, 
anchorText=<js>"CLICK ME!"</js>)
@@ -28800,7 +29120,7 @@
                        JSON-schema support.
                </li>
                <li>
-                       New {@link org.apache.juneau.utils.PojoIntrospector} 
class.
+                       New {@del org.apache.juneau.utils.PojoIntrospector} 
class.
                </li>
                <li>
                        Significant REST servlet API improvements.
@@ -30792,7 +31112,7 @@
        
        <h5 class='topic w800'>Core</h5>                
        <ul class='spaced-list'>
-               <li>Simplified {@link org.apache.juneau.utils.PojoIntrospector} 
class.
+               <li>Simplified {@del org.apache.juneau.utils.PojoIntrospector} 
class.
                <li>New {@del ClassUtils#getMethodSignature(Method)} method.
        </ul>
        
@@ -31328,21 +31648,21 @@
                                <li>{@del IOUtils#readFile(String)}
                                <li>{@del IOUtils#write(File,Reader)}
                        </ul>
-               <li>New methods on {@link org.apache.juneau.utils.PojoRest}:
+               <li>New methods on {@del org.apache.juneau.utils.PojoRest}:
                        <ul>
                                <li>{@del PojoRest#get(Class,String,Object)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getString(String)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getString(String,String)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getInt(String)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getInt(String,Integer)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getLong(String)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getLong(String,Long)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getBoolean(String)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getBoolean(String,Boolean)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getMap(String)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getMap(String,Map)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getList(String)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getList(String,List)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getString(String)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getString(String,String)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getInt(String)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getInt(String,Integer)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getLong(String)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getLong(String,Long)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getBoolean(String)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getBoolean(String,Boolean)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getMap(String)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getMap(String,Map)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getList(String)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getList(String,List)}
                                <li>{@del getObjectMap(String)}
                                <li>{@del getObjectMap(String,ObjectMap)}
                                <li>{@del getObjectList(String)}
@@ -31399,9 +31719,9 @@
                <li>Removed <c>org.apache.juneau.utils.CharsetUtils</c> class.
                <li>Removed 
<c>org.apache.juneau.utils.ConcurrentIdentityList</c> class.
                <li>Fixed bug in {@link 
org.apache.juneau.internal.MultiIterable} class.
-               <li>{@link org.apache.juneau.utils.PojoIntrospector} must now 
be instantiated with a <c>ReaderParser</c>.
+               <li>{@del org.apache.juneau.utils.PojoIntrospector} must now be 
instantiated with a <c>ReaderParser</c>.
                        Simplifies the API on the class.
-               <li>{@link org.apache.juneau.utils.PojoRest} must now be 
instantiated with a <c>ReaderParser</c>.
+               <li>{@del org.apache.juneau.utils.PojoRest} must now be 
instantiated with a <c>ReaderParser</c>.
                        Simplifies the API on the class.
                <li>{@del org.apache.juneau.utils.MessageBundle} and 
<c>SafeResourceMultiBundle</c> moved from server component.
                <li>Several bug fixes and performance improvements in {@del 
StringVarResolver}.
@@ -33386,13 +33706,13 @@
                                <li>{@del 
org.apache.juneau.ObjectMap#getList(String,Class,List) 
getList(String,Class,List)}
                        </ul>
                <li>
-                       New methods on {@link org.apache.juneau.utils.PojoRest}:
+                       New methods on {@del org.apache.juneau.utils.PojoRest}:
                        <ul>
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#get(String,Class) get(String,Class)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#get(String,Type,Type...) 
get(String,Type,Type...)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getWithDefault(String,Object) 
getWithDefault(String,Object)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getWithDefault(String,Object,Class) 
getWithDefault(String,Object,Class)}
-                               <li>{@link 
org.apache.juneau.utils.PojoRest#getWithDefault(String,Object,Type,Type...) 
getWithDefault(String,Object,Type,Type...)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#get(String,Class) get(String,Class)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#get(String,Type,Type...) 
get(String,Type,Type...)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getWithDefault(String,Object) 
getWithDefault(String,Object)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getWithDefault(String,Object,Class) 
getWithDefault(String,Object,Class)}
+                               <li>{@del 
org.apache.juneau.utils.PojoRest#getWithDefault(String,Object,Type,Type...) 
getWithDefault(String,Object,Type,Type...)}
                        </ul>
                <li>
                        Fixed bug where {@link 
org.apache.juneau.BeanSession#getMediaType()} wasn't returning a value.
@@ -33403,7 +33723,7 @@
                        the call to <c>getClass()</c> to retrieve the 
annotation value could not be called before calling
                        the <c><jk>super</jk>()</c> method.
                <li>
-                       New class: {@link org.apache.juneau.utils.PojoMerge}
+                       New class: {@del org.apache.juneau.utils.PojoMerge}
                <li>
                        New doc: <dc>2.6.2 - @Pojo annotation</dc>
                <li>
diff --git a/juneau-doc/src/main/javadoc/resources/docs.txt 
b/juneau-doc/src/main/javadoc/resources/docs.txt
index 3cb7a80d1..d74f3723f 100644
--- a/juneau-doc/src/main/javadoc/resources/docs.txt
+++ b/juneau-doc/src/main/javadoc/resources/docs.txt
@@ -144,6 +144,7 @@ jm.MsgPackDetails = #juneau-marshall.jm.MsgPackDetails, 
Overview > juneau-marsha
 jm.MsgPackParsers = #juneau-marshall.jm.MsgPackDetails.jm.MsgPackParsers, 
Overview > juneau-marshall > MessagePack Details > MessagePack Parsers
 jm.MsgPackSerializers = 
#juneau-marshall.jm.MsgPackDetails.jm.MsgPackSerializers, Overview > 
juneau-marshall > MessagePack Details > MessagePack Serializers
 jm.NamePropertyAnnotation = 
#juneau-marshall.jm.JavaBeansSupport.jm.NamePropertyAnnotation, Overview > 
juneau-marshall > Java Beans Support > @NameProperty Annotation
+jm.ObjectTools = #juneau-marshall.jm.ObjectTools, Overview > juneau-marshall > 
Object Tools
 jm.OneWaySwaps = #juneau-marshall.jm.Swaps.jm.OneWaySwaps, Overview > 
juneau-marshall > Swaps > One-way Swaps
 jm.OpenApiDetails = #juneau-marshall.jm.OpenApiDetails, Overview > 
juneau-marshall > OpenAPI Details
 jm.OpenApiMethodology = 
#juneau-marshall.jm.OpenApiDetails.jm.OpenApiMethodology, Overview > 
juneau-marshall > OpenAPI Details > OpenAPI Methodology
@@ -155,7 +156,6 @@ jm.PerMediaTypeSwaps = 
#juneau-marshall.jm.Swaps.jm.PerMediaTypeSwaps, Overview
 jm.PlainTextDetails = #juneau-marshall.jm.PlainTextDetails, Overview > 
juneau-marshall > PlainText Details
 jm.PojoBuilders = #juneau-marshall.jm.JavaBeansSupport.jm.PojoBuilders, 
Overview > juneau-marshall > Java Beans Support > POJO Builders
 jm.PojoCategories = #juneau-marshall.jm.PojoCategories, Overview > 
juneau-marshall > POJO Categories
-jm.PojoTools = #juneau-marshall.jm.PojoTools, Overview > juneau-marshall > 
POJO Tools
 jm.ReadingContinuousStreams = #juneau-marshall.jm.ReadingContinuousStreams, 
Overview > juneau-marshall > Reading Continuous Streams
 jm.Recursion = #juneau-marshall.jm.Recursion, Overview > juneau-marshall > 
Non-Tree Models and Recursion Detection
 jm.SerializerSetsParserSets = #juneau-marshall.jm.SerializerSetsParserSets, 
Overview > juneau-marshall > SerializerSets and ParserSets
diff --git a/juneau-doc/src/main/javadoc/resources/fragments/toc.html 
b/juneau-doc/src/main/javadoc/resources/fragments/toc.html
index cdf4ddec2..dd69ffe04 100644
--- a/juneau-doc/src/main/javadoc/resources/fragments/toc.html
+++ b/juneau-doc/src/main/javadoc/resources/fragments/toc.html
@@ -77,7 +77,7 @@
                </ol>
                <li><p><a class='doclink' 
href='{OVERVIEW_URL}#juneau-marshall.jm.Encoders'>Encoders</a><span 
class='update'>created: <b>9.0.0</b></span></p>
                <li><p><a class='doclink' 
href='{OVERVIEW_URL}#juneau-marshall.jm.HttpParts'>HTTP Parts</a><span 
class='update'>created: <b>9.0.0</b>, <b><red>TODO</red></b></span></p>
-               <li><p><a class='doclink' 
href='{OVERVIEW_URL}#juneau-marshall.jm.PojoTools'>POJO Tools</a><span 
class='update'>created: <b>9.0.0</b>, <b><red>TODO</red></b></span></p>
+               <li><p><a class='doclink' 
href='{OVERVIEW_URL}#juneau-marshall.jm.ObjectTools'>Object Tools</a><span 
class='update'>created: <b>9.0.0</b></span></p>
                <li><p><a class='doclink' 
href='{OVERVIEW_URL}#juneau-marshall.jm.JsonDetails'>JSON Details</a></p>
                <ol>
                        <li><p><a class='doclink' 
href='{OVERVIEW_URL}#juneau-marshall.jm.JsonDetails.jm.JsonMethodology'>JSON 
Methodology</a></p>
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converter/Queryable.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converter/Queryable.java
index e011752df..3fc0e2cf4 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converter/Queryable.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converter/Queryable.java
@@ -12,15 +12,17 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.converter;
 
+import org.apache.juneau.objecttools.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.utils.*;
+import org.apache.juneau.utils.SearchArgs;
 
 /**
- * Converter for enabling of {@link PojoQuery} support on response objects 
returned by a <c>@RestOp</c>-annotated method.
+ * Converter for enabling of search/view/sort/page support on response objects 
returned by a <c>@RestOp</c>-annotated method.
  *
  * <p>
- * When enabled, objects in a POJO tree can be filtered using the 
functionality described in the {@link PojoQuery}
- * class.
+ * When enabled, objects in a POJO tree can be filtered using the 
functionality described in the {@link ObjectSearcher},
+ * {@link ObjectViewer}, {@link ObjectSorter}, and {@link ObjectPaginator} 
classes.
  *
  * <p>
  * The following HTTP request parameters are available for tabular data (e.g. 
{@code Collections} of {@code Maps},
@@ -63,7 +65,10 @@ import org.apache.juneau.utils.*;
  * </ul>
  *
  * <ul class='seealso'>
- *     <li class='jc'>{@link PojoQuery} - Additional information on filtering 
POJO models.
+ *     <li class='jc'>{@link ObjectSearcher} - Additional information on 
searching POJO models.
+ *     <li class='jc'>{@link ObjectViewer} - Additional information on 
filtering POJO models.
+ *     <li class='jc'>{@link ObjectSorter} - Additional information on sorting 
POJO models.
+ *     <li class='jc'>{@link ObjectPaginator} - Additional information on 
paginating POJO models.
  *     <li class='jm'>{@link 
org.apache.juneau.rest.RestOpContext.Builder#converters()} - Registering 
converters with REST resources.
  *     <li class='link'>{@doc jrs.Converters}
  *     <li class='extlink'>{@source}

Reply via email to