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<MyBean> <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<MyBean> <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=<1"</js>,<js>"property=<=1"</js>,<js>"property=>1"</js>,<js>"property=>=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=>2011"</js>,<js>"property=>=2011"</js>,<js>"property=<2011"</js>,<js>"property=<=2011"</js>
- Open-ended ranges
+ *
<li><js>"property=>2011"</js>,<js>"property=>=2011"</js>,<js>"property=<2011"</js>,<js>"property=<=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<MyBean> <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<Map> <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<MyBean> <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=>2011"</js>,<js>"property=>=2011"</js>,<js>"property=<2011"</js>,<js>"property=<=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<MyBean> <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<Map> <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<MyBean> <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 <a href='...'>CLICK ME!</a>
when serialized to HTML.</jc>
+ | <jc>// Produces <a ...>CLICK ME!</a> 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':' > 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<MyBean> <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=<1"</js>,<js>"property=<=1"</js>,<js>"property=>1"</js>,<js>"property=>=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=>2011"</js>,<js>"property=>=2011"</js>,<js>"property=<2011"</js>,<js>"property=<=2011"</js>
- Open-ended ranges
+
<li><js>"property=>2011"</js>,<js>"property=>=2011"</js>,<js>"property=<2011"</js>,<js>"property=<=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<MyBean> <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<Map> <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<MyBean> <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 <a href='...'>CLICK ME!</a> when serialized
to HTML.</jc>
+ <jc>// Produces <a ...>CLICK ME!</a> 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}