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 7d34e65  Testing and minor fixes.
7d34e65 is described below

commit 7d34e6511efee3d43d9305c7986652c6c584d558
Author: JamesBognar <[email protected]>
AuthorDate: Thu Apr 9 09:52:34 2020 -0400

    Testing and minor fixes.
---
 .../juneau/BeanTraversePropertiesComboTest.java    |  54 +++++--
 .../juneau/SerializerPropertiesComboTest.java      |  87 ++++++++++
 .../java/org/apache/juneau/html/CommonTest.java    |   2 +-
 .../java/org/apache/juneau/jena/CommonTest.java    |   2 +-
 .../java/org/apache/juneau/json/CommonTest.java    |   2 +-
 .../java/org/apache/juneau/uon/Common_UonTest.java |   2 +-
 .../juneau/urlencoding/Common_UrlEncodingTest.java |   2 +-
 .../java/org/apache/juneau/xml/CommonTest.java     |   2 +-
 .../main/java/org/apache/juneau/BeanSession.java   |  17 ++
 .../org/apache/juneau/BeanTraverseSession.java     |  17 +-
 .../src/main/java/org/apache/juneau/Session.java   |  19 +--
 .../apache/juneau/html/HtmlSerializerSession.java  |   6 +-
 .../org/apache/juneau/internal/JuneauLogger.java   |  23 ++-
 .../juneau/serializer/SerializerSession.java       |   2 +-
 juneau-doc/docs/ReleaseNotes/8.1.4.html            |   7 +
 .../juneau/rest/client2/RestClientBuilderTest.java | 178 ++++++++++++++++-----
 .../java/org/apache/juneau/rest/BasicRest.java     |  43 +++--
 .../java/org/apache/juneau/rest/RestRequest.java   |   1 -
 .../java/org/apache/juneau/rest/RestServlet.java   |  67 ++++----
 .../apache/juneau/rest/annotation/HookEvent.java   |   2 -
 20 files changed, 406 insertions(+), 129 deletions(-)

diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanTraversePropertiesComboTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanTraversePropertiesComboTest.java
index 082952e..7e27ff8 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanTraversePropertiesComboTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanTraversePropertiesComboTest.java
@@ -29,20 +29,23 @@ public class BeanTraversePropertiesComboTest extends 
ComboRoundTripTest {
        public static class A {
                public int f;
 
-               public static A create() {
-                       A b = new A();
-                       b.f = 1;
-                       return b;
+               public A init() {
+                       f = 1;
+                       return this;
                }
        }
 
        public static class B {
                public Object f;
 
-               public static B create() {
-                       B b = new B();
-                       b.f = b;
-                       return b;
+               public B initRecursion() {
+                       f = this;
+                       return this;
+               }
+
+               public B initA() {
+                       f = new A().init();
+                       return this;
                }
        }
 
@@ -53,7 +56,7 @@ public class BeanTraversePropertiesComboTest extends 
ComboRoundTripTest {
                                new ComboInput<>(
                                        "BEANTRAVERSE_initialDepth",
                                        A.class,
-                                       A.create(),
+                                       new A().init(),
                                        /* Json */              "{f:1}",
                                        /* JsonT */             "{f:1}",
                                        /* JsonR */             
"\t\t{\n\t\t\tf: 1\n\t\t}",
@@ -82,7 +85,7 @@ public class BeanTraversePropertiesComboTest extends 
ComboRoundTripTest {
                                new ComboInput<>(
                                        "BEANTRAVERSE_detectRecursions",
                                        B.class,
-                                       B.create(),
+                                       new B().initRecursion(),
                                        /* Json */              "x",
                                        /* JsonT */             "x",
                                        /* JsonR */             "x",
@@ -112,7 +115,7 @@ public class BeanTraversePropertiesComboTest extends 
ComboRoundTripTest {
                                new ComboInput<>(
                                        "BEANTRAVERSE_ignoreRecursions",
                                        B.class,
-                                       B.create(),
+                                       new B().initRecursion(),
                                        /* Json */              "{}",
                                        /* JsonT */             "{}",
                                        /* JsonR */             "{\n}",
@@ -137,6 +140,35 @@ public class BeanTraversePropertiesComboTest extends 
ComboRoundTripTest {
                                )
                                
.properties(OMap.of(BEANTRAVERSE_ignoreRecursions, true))
                        },
+                       {       /* 3 */
+                               new ComboInput<>(
+                                       "BEANTRAVERSE_maxDepth",
+                                       B.class,
+                                       new B().initA(),
+                                       /* Json */              "{}",
+                                       /* JsonT */             "{}",
+                                       /* JsonR */             "{\n}",
+                                       /* Xml */               "<object/>",
+                                       /* XmlT */              "<object/>",
+                                       /* XmlR */              "<object/>\n",
+                                       /* XmlNs */             "<object/>",
+                                       /* Html */              
"<table></table>",
+                                       /* HtmlT */             
"<table></table>",
+                                       /* HtmlR */             
"<table>\n</table>\n",
+                                       /* Uon */               "()",
+                                       /* UonT */              "()",
+                                       /* UonR */              "(\n)",
+                                       /* UrlEnc */    "",
+                                       /* UrlEncT */   "",
+                                       /* UrlEncR */   "",
+                                       /* MsgPack */   "80",
+                                       /* MsgPackT */  "80",
+                                       /* RdfXml */    
"<rdf:RDF>\n</rdf:RDF>\n",
+                                       /* RdfXmlT */   
"<rdf:RDF>\n</rdf:RDF>\n",
+                                       /* RdfXmlR */   
"<rdf:RDF>\n</rdf:RDF>\n"
+                               )
+                               .properties(OMap.of(BEANTRAVERSE_maxDepth, 1))
+                       },
                });
        }
 
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
index 99bc25a..d489607 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
@@ -99,6 +99,93 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                )
                                .properties(OMap.of(SERIALIZER_addRootType, 
true, BEAN_beanDictionary, BeanWithType.class))
                        },
+                       {       /* 2 */
+                               new ComboInput<>(
+                                       "SERIALIZER_sortCollections",
+                                       String[].class,
+                                       new String[]{"c","a","b"},
+                                       /* Json */              "['a','b','c']",
+                                       /* JsonT */             "['a','b','c']",
+                                       /* JsonR */             
"[\n\t'a',\n\t'b',\n\t'c'\n]",
+                                       /* Xml */               
"<array><string>a</string><string>b</string><string>c</string></array>",
+                                       /* XmlT */              
"<array><string>a</string><string>b</string><string>c</string></array>",
+                                       /* XmlR */              
"<array>\n\t<string>a</string>\n\t<string>b</string>\n\t<string>c</string>\n</array>\n",
+                                       /* XmlNs */             
"<array><string>a</string><string>b</string><string>c</string></array>",
+                                       /* Html */              
"<ul><li>a</li><li>b</li><li>c</li></ul>",
+                                       /* HtmlT */             
"<ul><li>a</li><li>b</li><li>c</li></ul>",
+                                       /* HtmlR */             
"<ul>\n\t<li>a</li>\n\t<li>b</li>\n\t<li>c</li>\n</ul>\n",
+                                       /* Uon */               "@(a,b,c)",
+                                       /* UonT */              "@(a,b,c)",
+                                       /* UonR */              
"@(\n\ta,\n\tb,\n\tc\n)",
+                                       /* UrlEnc */    "0=c&1=a&2=b",
+                                       /* UrlEncT */   "0=c&1=a&2=b",
+                                       /* UrlEncR */   "0=c\n&1=a\n&2=b",
+                                       /* MsgPack */   "93A161A162A163",
+                                       /* MsgPackT */  "93A161A162A163",
+                                       /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>a</rdf:li>\n<rdf:li>b</rdf:li>\n<rdf:li>c</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
+                                       /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>a</rdf:li>\n<rdf:li>b</rdf:li>\n<rdf:li>c</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
+                                       /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Seq>\n    <rdf:li>a</rdf:li>\n    <rdf:li>b</rdf:li>\n    
<rdf:li>c</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n"
+                               )
+                               .properties(OMap.of(SERIALIZER_sortCollections, 
true))
+                       },
+                       {       /* 3 */
+                               new ComboInput<>(
+                                       "SERIALIZER_sortCollections",
+                                       List.class,
+                                       
Collections.unmodifiableList(AList.of("c","a","b")),
+                                       /* Json */              "['a','b','c']",
+                                       /* JsonT */             "['a','b','c']",
+                                       /* JsonR */             
"[\n\t'a',\n\t'b',\n\t'c'\n]",
+                                       /* Xml */               
"<array><string>a</string><string>b</string><string>c</string></array>",
+                                       /* XmlT */              
"<array><string>a</string><string>b</string><string>c</string></array>",
+                                       /* XmlR */              
"<array>\n\t<string>a</string>\n\t<string>b</string>\n\t<string>c</string>\n</array>\n",
+                                       /* XmlNs */             
"<array><string>a</string><string>b</string><string>c</string></array>",
+                                       /* Html */              
"<ul><li>a</li><li>b</li><li>c</li></ul>",
+                                       /* HtmlT */             
"<ul><li>a</li><li>b</li><li>c</li></ul>",
+                                       /* HtmlR */             
"<ul>\n\t<li>a</li>\n\t<li>b</li>\n\t<li>c</li>\n</ul>\n",
+                                       /* Uon */               "@(a,b,c)",
+                                       /* UonT */              "@(a,b,c)",
+                                       /* UonR */              
"@(\n\ta,\n\tb,\n\tc\n)",
+                                       /* UrlEnc */    "0=c&1=a&2=b",
+                                       /* UrlEncT */   "0=c&1=a&2=b",
+                                       /* UrlEncR */   "0=c\n&1=a\n&2=b",
+                                       /* MsgPack */   "93A161A162A163",
+                                       /* MsgPackT */  "93A161A162A163",
+                                       /* RdfXml */    
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>a</rdf:li>\n<rdf:li>b</rdf:li>\n<rdf:li>c</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
+                                       /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>a</rdf:li>\n<rdf:li>b</rdf:li>\n<rdf:li>c</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
+                                       /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Seq>\n    <rdf:li>a</rdf:li>\n    <rdf:li>b</rdf:li>\n    
<rdf:li>c</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n"
+                               )
+                               .properties(OMap.of(SERIALIZER_sortCollections, 
true))
+                       },
+                       {       /* 4 */
+                               new ComboInput<>(
+                                       "SERIALIZER_sortMaps",
+                                       Map.class,
+                                       
Collections.unmodifiableMap(AMap.<String,String>of("c","3","a","1","b","2")),
+                                       /* Json */              
"{a:'1',b:'2',c:'3'}",
+                                       /* JsonT */             
"{a:'1',b:'2',c:'3'}",
+                                       /* JsonR */             "{\n\ta: 
'1',\n\tb: '2',\n\tc: '3'\n}",
+                                       /* Xml */               
"<object><a>1</a><b>2</b><c>3</c></object>",
+                                       /* XmlT */              
"<object><a>1</a><b>2</b><c>3</c></object>",
+                                       /* XmlR */              
"<object>\n\t<a>1</a>\n\t<b>2</b>\n\t<c>3</c>\n</object>\n",
+                                       /* XmlNs */             
"<object><a>1</a><b>2</b><c>3</c></object>",
+                                       /* Html */              
"<table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>2</td></tr><tr><td>c</td><td>3</td></tr></table>",
+                                       /* HtmlT */             
"<table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>2</td></tr><tr><td>c</td><td>3</td></tr></table>",
+                                       /* HtmlR */             
"<table>\n\t<tr>\n\t\t<td>a</td>\n\t\t<td>1</td>\n\t</tr>\n\t<tr>\n\t\t<td>b</td>\n\t\t<td>2</td>\n\t</tr>\n\t<tr>\n\t\t<td>c</td>\n\t\t<td>3</td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"(a='1',b='2',c='3')",
+                                       /* UonT */              
"(a='1',b='2',c='3')",
+                                       /* UonR */              
"(\n\ta='1',\n\tb='2',\n\tc='3'\n)",
+                                       /* UrlEnc */    "a='1'&b='2'&c='3'",
+                                       /* UrlEncT */   "a='1'&b='2'&c='3'",
+                                       /* UrlEncR */   "a='1'\n&b='2'\n&c='3'",
+                                       /* MsgPack */   
"83A161A131A162A132A163A133",
+                                       /* MsgPackT */  
"83A161A131A162A132A163A133",
+                                       /* RdfXml */    
"<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n<jp:b>2</jp:b>\n<jp:c>3</jp:c>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n<jp:b>2</jp:b>\n<jp:c>3</jp:c>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:a>1</jp:a>\n    <jp:b>2</jp:b>\n    <jp:c>3</jp:c>\n 
 </rdf:Description>\n</rdf:RDF>\n"
+                               )
+                               .properties(OMap.of(SERIALIZER_sortMaps, true))
+                       },
                });
        }
 
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/CommonTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/CommonTest.java
index 345ead1..cf3df4c 100755
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/CommonTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/CommonTest.java
@@ -380,7 +380,7 @@ public class CommonTest {
        
//====================================================================================================
        @Test
        public void testRecursion() throws Exception {
-               HtmlSerializerBuilder s = 
HtmlSerializer.create().sq().addKeyValueTableHeaders();
+               HtmlSerializerBuilder s = 
HtmlSerializer.create().sq().addKeyValueTableHeaders().maxDepth(Integer.MAX_VALUE);
 
                R1 r1 = new R1();
                R2 r2 = new R2();
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jena/CommonTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jena/CommonTest.java
index 16a2477..799f700 100755
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jena/CommonTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jena/CommonTest.java
@@ -298,7 +298,7 @@ public class CommonTest {
        
//====================================================================================================
        @Test
        public void testRecursion() throws Exception {
-               RdfSerializerBuilder s = 
RdfSerializer.create().xmlabbrev().sq();
+               RdfSerializerBuilder s = 
RdfSerializer.create().xmlabbrev().sq().maxDepth(Integer.MAX_VALUE);
 
                R1 r1 = new R1();
                R2 r2 = new R2();
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/CommonTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/CommonTest.java
index 1843a81..f931230 100755
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/CommonTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/CommonTest.java
@@ -258,7 +258,7 @@ public class CommonTest {
        
//====================================================================================================
        @Test
        public void testRecursion() throws Exception {
-               JsonSerializerBuilder s = JsonSerializer.create().ssq();
+               JsonSerializerBuilder s = 
JsonSerializer.create().ssq().maxDepth(Integer.MAX_VALUE);
 
                R1 r1 = new R1();
                R2 r2 = new R2();
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/uon/Common_UonTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/uon/Common_UonTest.java
index cb76fe0..227bff5 100755
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/uon/Common_UonTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/uon/Common_UonTest.java
@@ -250,7 +250,7 @@ public class Common_UonTest {
        
//====================================================================================================
        @Test
        public void testRecursion() throws Exception {
-               UonSerializerBuilder s = UonSerializer.create();
+               UonSerializerBuilder s = 
UonSerializer.create().maxDepth(Integer.MAX_VALUE);
 
                R1 r1 = new R1();
                R2 r2 = new R2();
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
index 3b48477..f67f025 100755
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
@@ -252,7 +252,7 @@ public class Common_UrlEncodingTest {
        
//====================================================================================================
        @Test
        public void testRecursion() throws Exception {
-               UrlEncodingSerializerBuilder s = UrlEncodingSerializer.create();
+               UrlEncodingSerializerBuilder s = 
UrlEncodingSerializer.create().maxDepth(Integer.MAX_VALUE);
 
                R1 r1 = new R1();
                R2 r2 = new R2();
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/CommonTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/CommonTest.java
index 52e088c..007b804 100755
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/CommonTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/CommonTest.java
@@ -269,7 +269,7 @@ public class CommonTest {
        
//====================================================================================================
        @Test
        public void testRecursion() throws Exception {
-               XmlSerializerBuilder s = 
XmlSerializer.create().enableNamespaces(false);
+               XmlSerializerBuilder s = 
XmlSerializer.create().enableNamespaces(false).maxDepth(Integer.MAX_VALUE);
 
                R1 r1 = new R1();
                R2 r2 = new R2();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
index 4911c6d..fa5e17f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
@@ -18,10 +18,12 @@ import static org.apache.juneau.BeanContext.*;
 
 import java.io.*;
 import java.lang.reflect.*;
+import java.text.*;
 import java.time.*;
 import java.util.*;
 import java.util.Date;
 import java.util.concurrent.atomic.*;
+import java.util.logging.*;
 
 import org.apache.juneau.collections.*;
 import org.apache.juneau.http.*;
@@ -41,6 +43,8 @@ import org.apache.juneau.transform.*;
 @SuppressWarnings({"unchecked","rawtypes"})
 public class BeanSession extends Session {
 
+       private static Logger LOG = 
Logger.getLogger(BeanSession.class.getName());
+
        private final BeanContext ctx;
        private final Locale locale;
        private final TimeZone timeZone;
@@ -1158,6 +1162,19 @@ public class BeanSession extends Session {
                return ctx._class();
        }
 
+       /**
+        * Logs a warning message.
+        *
+        * @param msg The warning message.
+        * @param args Optional {@link MessageFormat}-style arguments.
+        */
+       @Override
+       public void addWarning(String msg, Object... args) {
+               if (debug)
+                       LOG.log(Level.WARNING, msg, args);
+               super.addWarning(msg, args);
+       }
+
        
//-----------------------------------------------------------------------------------------------------------------
        // Properties
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
index e038ed9..2f03183 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
@@ -51,6 +51,8 @@ public class BeanTraverseSession extends BeanSession {
        /** The current indentation depth into the model. */
        public int indent;
 
+       private int depth;
+
 
        /**
         * Create a new session using properties specified in the context.
@@ -108,6 +110,7 @@ public class BeanTraverseSession extends BeanSession {
         */
        protected final ClassMeta<?> push(String attrName, Object o, 
ClassMeta<?> eType) throws BeanRecursionException {
                indent++;
+               depth++;
                isBottom = true;
                if (o == null)
                        return null;
@@ -115,9 +118,9 @@ public class BeanTraverseSession extends BeanSession {
                ClassMeta<?> cm = (eType != null && c == eType.getInnerClass()) 
? eType : ((o instanceof ClassMeta) ? (ClassMeta<?>)o : getClassMeta(c));
                if (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
                        return cm;
+               if (depth > getMaxDepth())
+                       return null;
                if (isDetectRecursions() || isDebug()) {
-                       if (stack.size() > getMaxDepth())
-                               return null;
                        if (willRecurse(attrName, o, cm))
                                return null;
                        isBottom = false;
@@ -150,10 +153,20 @@ public class BeanTraverseSession extends BeanSession {
        }
 
        /**
+        * Returns <jk>true</jk> if we're about to exceed the max depth for the 
document.
+        * 
+        * @return <jk>true</jk> if we're about to exceed the max depth for the 
document.
+        */
+       protected final boolean willExceedDepth() {
+               return (depth >= getMaxDepth());
+       }
+
+       /**
         * Pop an object off the stack.
         */
        protected final void pop() {
                indent--;
+               depth--;
                if ((isDetectRecursions() || isDebug()) && ! isBottom)  {
                        Object o = stack.removeLast().o;
                        Object o2 = set.remove(o);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java
index e514264..80973e2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java
@@ -33,8 +33,6 @@ import org.apache.juneau.reflect.*;
  */
 public abstract class Session {
 
-       private JuneauLogger logger;
-
        private final OMap properties;
        private Map<String,Object> cache;
        private List<String> warnings;                 // Any warnings 
encountered.
@@ -258,10 +256,9 @@ public abstract class Session {
         * @param msg The warning message.
         * @param args Optional {@link MessageFormat}-style arguments.
         */
-       public final void addWarning(String msg, Object... args) {
+       public void addWarning(String msg, Object... args) {
                if (warnings == null)
                        warnings = new LinkedList<>();
-               getLogger().warning(msg, args);
                warnings.add((warnings.size() + 1) + ": " + format(msg, args));
        }
 
@@ -284,20 +281,6 @@ public abstract class Session {
        }
 
        /**
-        * Returns the logger associated with this session.
-        *
-        * <p>
-        * Subclasses can override this method to provide their own logger.
-        *
-        * @return The logger associated with this session.
-        */
-       protected final JuneauLogger getLogger() {
-               if (logger == null)
-                       logger = JuneauLogger.getLogger(getClass());
-               return logger;
-       }
-
-       /**
         * Throws a {@link BeanRuntimeException} if any warnings occurred in 
this session.
         */
        public void checkForWarnings() {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index 3c892e5..84d8b27 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -389,7 +389,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                return cr;
        }
 
-       @SuppressWarnings({ "rawtypes" })
+       @SuppressWarnings({ "rawtypes", "unchecked" })
        private void serializeMap(XmlWriter out, Map m, ClassMeta<?> sType,
                        ClassMeta<?> eKeyType, ClassMeta<?> eValueType, String 
typeName, BeanPropertyMeta ppMeta) throws IOException, SerializeException {
 
@@ -413,6 +413,10 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                        out.sTag(i+2, "th").append("value").eTag("th").nl(i+3);
                        out.ie(i+1).eTag("tr").nl(i+2);
                }
+
+               if (isSortMaps())
+                       m = sort(m);
+
                for (Map.Entry e : (Set<Map.Entry>)m.entrySet()) {
 
                        Object key = generalize(e.getKey(), keyType);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/JuneauLogger.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/JuneauLogger.java
index 783cf8d..c86a7c9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/JuneauLogger.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/JuneauLogger.java
@@ -25,7 +25,10 @@ import org.apache.juneau.serializer.*;
 
 /**
  * Wraps and extends the {@link java.util.logging.Logger} class to provide 
some additional convenience methods.
+ *
+ * @deprecated Methods introduced in Java 8 Logging API renders this class 
obsolete.
  */
+@Deprecated
 public class JuneauLogger extends java.util.logging.Logger {
 
        private static final WriterSerializer serializer = 
JsonSerializer.create().ssq().build();
@@ -39,7 +42,7 @@ public class JuneauLogger extends java.util.logging.Logger {
         * Get logger for specified class.
         *
         * @param forClass The class to create a logger for.
-        * @return A new <l>Logger</l>.
+        * @return A new <l>BasicLogger</l>.
         */
        public static JuneauLogger getLogger(Class<?> forClass) {
                return getLogger(forClass.getName());
@@ -49,7 +52,7 @@ public class JuneauLogger extends java.util.logging.Logger {
         * Get logger for specified class.
         *
         * @param loggerName The logger name.
-        * @return A new <l>Logger</l>.
+        * @return A new <l>BasicLogger</l>.
         */
        public static JuneauLogger getLogger(String loggerName) {
                return new 
JuneauLogger(java.util.logging.Logger.getLogger(loggerName));
@@ -67,7 +70,7 @@ public class JuneauLogger extends java.util.logging.Logger {
         *              <li>A path relative to the package of the class.  E.g. 
<js>"nls/Messages"</js>.
         *      </ol>
         *      Both <js>'.'</js> and <js>'/'</js> can be used as path 
delimiters.
-        * @return A new <l>Logger</l>.
+        * @return A new <l>BasicLogger</l>.
         */
        public static JuneauLogger getLogger(Class<?> forClass, String 
resourceBundleName) {
                return new 
JuneauLogger(java.util.logging.Logger.getLogger(forClass.getName(), 
resolveResourceBundleName(forClass, resourceBundleName)));
@@ -85,18 +88,28 @@ public class JuneauLogger extends java.util.logging.Logger {
         *              <li>A path relative to the package of the class.  E.g. 
<js>"nls/Messages"</js>.
         *      </ol>
         *      Both <js>'.'</js> and <js>'/'</js> can be used as path 
delimiters.
-        * @return A new <l>Logger</l>.
+        * @return A new <l>BasicLogger</l>.
         */
        public static synchronized JuneauLogger getLogger(String name, String 
resourceBundleName) {
                return new 
JuneauLogger(java.util.logging.Logger.getLogger(name, resourceBundleName));
        }
 
        /**
+        * Wrap the specified logger
+        *
+        * @param logger The java logger to use for logging.
+        * @return A new <l>BasicLogger</l>.
+        */
+       public static synchronized JuneauLogger 
getLogger(java.util.logging.Logger logger) {
+               return new JuneauLogger(logger);
+       }
+
+       /**
         * Constructor.
         *
         * @param innerLogger The wrapped logger.
         */
-       protected JuneauLogger(java.util.logging.Logger innerLogger) {
+       public JuneauLogger(java.util.logging.Logger innerLogger) {
                super(innerLogger.getName(), 
innerLogger.getResourceBundleName());
                this.innerLogger = innerLogger;
                this.rb = getResourceBundle();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 5ac2445..19fc8a2 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -355,7 +355,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
                }
 
                try {
-                       if (isTrimNullProperties() && willRecurse(attrName, 
value, cm))
+                       if (isTrimNullProperties() && (willRecurse(attrName, 
value, cm) || willExceedDepth()))
                                return true;
                } catch (BeanRecursionException e) {
                        throw new SerializeException(e);
diff --git a/juneau-doc/docs/ReleaseNotes/8.1.4.html 
b/juneau-doc/docs/ReleaseNotes/8.1.4.html
index 993ee96..ec0fba7 100644
--- a/juneau-doc/docs/ReleaseNotes/8.1.4.html
+++ b/juneau-doc/docs/ReleaseNotes/8.1.4.html
@@ -189,7 +189,14 @@
                Fixed bug in JSON/UON/URL-Encoding serializers where 
indentation was not correct of first line when {@link 
oaj.BeanTraverseContext#BEANTRAVERSE_initialIndent}
                used.
        <li>
+               Fixed bug in JSON/UON/URL-Encoding serializers where properties 
past the max depth were being serialized as null instead
+               of being treated as null and not being serialized at all.
+       <li>
+               Fixed bug in HTML serializer where tables of maps were not 
sorted if <jsf>SERIALIZER_sortMaps</jsf> was specified.
+       <li>
                HTML-Schema support is being deprecated due to low-use and 
difficulty in maintaining.  It will be removed in 9.0.
+       <li>
+               <c>JuneauLogger</c> class is being deprecated.  Improvements in 
logging in Java 8 make it obsolete.
 </ul>
 
 <h5 class='topic w800'>juneau-rest-server</h5>
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientBuilderTest.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientBuilderTest.java
index b8659ec..50520cc 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientBuilderTest.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientBuilderTest.java
@@ -57,10 +57,9 @@ public class RestClientBuilderTest {
        public static class Bean {
                public int f;
 
-               public static Bean create() {
-                       Bean b = new Bean();
-                       b.f = 1;
-                       return b;
+               public Bean init() {
+                       f = 1;
+                       return this;
                }
 
                public void check() {
@@ -73,7 +72,7 @@ public class RestClientBuilderTest {
                }
        }
 
-       public static Bean bean = Bean.create();
+       public static Bean bean = new Bean().init();
 
        @Rest
        public static class A extends BasicRest {
@@ -2066,10 +2065,9 @@ public class RestClientBuilderTest {
        public static class L1 {
                public Object f1;
 
-               public static L1 create() {
-                       L1 l = new L1();
-                       l.f1 = L2.create();
-                       return l;
+               public L1 init() {
+                       f1 = new L2().init();
+                       return this;
                }
        }
 
@@ -2077,21 +2075,22 @@ public class RestClientBuilderTest {
        public static class L2 {
                public int f2;
 
-               public static L2 create() {
-                       L2 l = new L2();
-                       l.f2 = 1;
-                       return l;
+               public L2 init() {
+                       f2 = 1;
+                       return this;
                }
        }
 
        @Test
        public void l01a_serializer_addBeanTypes() throws Exception {
+               L1 l1 = new L1().init();
+
                MockRestClient
                        .create(A.class)
                        .simpleJson()
                        .addBeanTypes(true)
                        .build()
-                       .post("/echoBody", L1.create())
+                       .post("/echoBody", l1)
                        .run()
                        .getBody().assertValue("{f1:{_type:'L',f2:1}}");
 
@@ -2100,7 +2099,7 @@ public class RestClientBuilderTest {
                        .simpleJson()
                        .addBeanTypes(false)
                        .build()
-                       .post("/echoBody", L1.create())
+                       .post("/echoBody", l1)
                        .run()
                        .getBody().assertValue("{f1:{f2:1}}");
 
@@ -2109,19 +2108,21 @@ public class RestClientBuilderTest {
                        .simpleJson()
                        .addBeanTypes()
                        .build()
-                       .post("/echoBody", L1.create())
+                       .post("/echoBody", l1)
                        .run()
                        .getBody().assertValue("{f1:{_type:'L',f2:1}}");
        }
 
        @Test
        public void l03_serializer_addRootType() throws Exception {
+               L2 l2 = new L2().init();
+
                MockRestClient
                        .create(A.class)
                        .simpleJson()
                        .addRootType(true)
                        .build()
-                       .post("/echoBody", L2.create())
+                       .post("/echoBody", l2)
                        .run()
                        .getBody().assertValue("{f2:1}");
 
@@ -2131,7 +2132,7 @@ public class RestClientBuilderTest {
                        .addBeanTypes()
                        .addRootType(false)
                        .build()
-                       .post("/echoBody", L2.create())
+                       .post("/echoBody", l2)
                        .run()
                        .getBody().assertValue("{f2:1}");
 
@@ -2141,7 +2142,7 @@ public class RestClientBuilderTest {
                        .addBeanTypes()
                        .addRootType(true)
                        .build()
-                       .post("/echoBody", L2.create())
+                       .post("/echoBody", l2)
                        .run()
                        .getBody().assertValue("{_type:'L',f2:1}");
 
@@ -2151,7 +2152,7 @@ public class RestClientBuilderTest {
                        .addBeanTypes()
                        .addRootType()
                        .build()
-                       .post("/echoBody", L2.create())
+                       .post("/echoBody", l2)
                        .run()
                        .getBody().assertValue("{_type:'L',f2:1}");
        }
@@ -2223,28 +2224,123 @@ public class RestClientBuilderTest {
                        .getBody().assertValue("\t\t{\n\t\t\tf: 1\n\t\t}");
        }
 
-//     public RestClientBuilder initialDepth(int value) {
+       public static class L10 extends SerializerListener {
+               public static volatile Throwable T;
+               public static volatile String MSG;
+
+               @Override
+               public void onError(SerializerSession session, Throwable t, 
String msg) {
+                       T = t;
+                       MSG = msg;
+               }
+       }
+
+       public static class L10a {
+               public int getFoo() {
+                       throw new RuntimeException("Foo!");
+               }
+       }
+
+       @Test
+       public void l10_serializer_listenerSClass() throws Exception {
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .listenerS(L10.class)
+                       .ws()
+                       .build()
+                       .post("/echoBody", new L10a())
+                       .run();
+               assertTrue(L10.T.getLocalizedMessage().contains("Exception 
occurred while getting property 'foo'"));
+               assertTrue(L10.MSG.contains("Exception occurred while getting 
property 'foo'"));
+       }
+
+       public static class L11 {
+               public Bean f;
+
+               public L11 init() {
+                       f = bean;
+                       return this;
+               }
+       }
+
+       @Test
+       public void l11_serializer_maxDepth() throws Exception {
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .maxDepth(1)
+                       .build()
+                       .post("/echoBody", new L11().init())
+                       .run()
+                       .getBody().assertValue("{}");
+       }
+
+       @Test
+       public void l12_serializer_sortCollections() throws Exception {
+               String[] s = new String[]{"c","a","b"};
+
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .sortCollections(true)
+                       .build()
+                       .post("/echoBody", s)
+                       .run()
+                       .getBody().assertValue("['a','b','c']");
+
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .sortCollections()
+                       .build()
+                       .post("/echoBody", s)
+                       .run()
+                       .getBody().assertValue("['a','b','c']");
+
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .sortCollections(false)
+                       .build()
+                       .post("/echoBody", s)
+                       .run()
+                       .getBody().assertValue("['c','a','b']");
+       }
+
+       @Test
+       public void l14_serializer_sortMapsBoolean() throws Exception {
+               AMap<String,Integer> m = AMap.of("c", 3, "a", 1, "b", 2);
+
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .sortMaps(true)
+                       .build()
+                       .post("/echoBody", m)
+                       .run()
+                       .getBody().assertValue("{a:1,b:2,c:3}");
+
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .sortMaps()
+                       .build()
+                       .post("/echoBody", m)
+                       .run()
+                       .getBody().assertValue("{a:1,b:2,c:3}");
+
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .sortMaps(false)
+                       .build()
+                       .post("/echoBody", m)
+                       .run()
+                       .getBody().assertValue("{c:3,a:1,b:2}");
+       }
+//     public RestClientBuilder sortMaps(boolean value) {
 
-//     @Test
-//     public void l10_serializer_listenerSClass() throws Exception { fail(); }
-////   public RestClientBuilder listenerS(Class<? extends SerializerListener> 
value) {
-//
-//     @Test
-//     public void l11_serializer_maxDepth() throws Exception { fail(); }
-////   public RestClientBuilder maxDepth(int value) {
-//
-//     @Test
-//     public void l12_serializer_sortCollectionsBoolean() throws Exception { 
fail(); }
-////   public RestClientBuilder sortCollections(boolean value) {
-//
-//     @Test
-//     public void l13_serializer_sortCollections() throws Exception { fail(); 
}
-////   public RestClientBuilder sortCollections() {
-//
-//     @Test
-//     public void l14_serializer_sortMapsBoolean() throws Exception { fail(); 
}
-////   public RestClientBuilder sortMaps(boolean value) {
-//
 //     @Test
 //     public void l15_serializer_sortMaps() throws Exception { fail(); }
 ////   public RestClientBuilder sortMaps() {
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRest.java
index 771888e..c045d25 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRest.java
@@ -18,6 +18,7 @@ import java.io.*;
 import java.lang.reflect.Method;
 import java.text.*;
 import java.util.*;
+import java.util.function.*;
 import java.util.logging.*;
 
 import javax.servlet.*;
@@ -51,7 +52,7 @@ import org.apache.juneau.http.exception.*;
 )
 public abstract class BasicRest implements BasicRestConfig, BasicRestMethods, 
RestCallHandler, RestInfoProvider, RestCallLogger, RestResourceResolver, 
ClasspathResourceFinder {
 
-       private JuneauLogger logger = JuneauLogger.getLogger(getClass());
+       private Logger logger = Logger.getLogger(getClass().getName());
        private volatile RestContext context;
        private RestCallHandler callHandler;
        private RestInfoProvider infoProvider;
@@ -130,56 +131,74 @@ public abstract class BasicRest implements 
BasicRestConfig, BasicRestMethods, Re
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
-        * Log a message.
+        * Log a message at {@link Level#INFO} level.
+        *
+        * <p>
+        * Subclasses can intercept the handling of these messages by 
overriding {@link #doLog(Level, Throwable, Supplier)}.
         *
         * @param msg The message to log.
         */
        public void log(String msg) {
-               logger.info(msg);
+               doLog(Level.INFO, null, () -> msg);
        }
 
        /**
         * Log a message.
         *
+        * <p>
+        * Subclasses can intercept the handling of these messages by 
overriding {@link #doLog(Level, Throwable, Supplier)}.
+        *
         * @param msg The message to log.
         * @param cause The cause.
         */
        public void log(String msg, Throwable cause) {
-               logger.info(cause, msg);
+               doLog(Level.INFO, null, () -> msg);
        }
 
        /**
         * Log a message.
         *
+        * <p>
+        * Subclasses can intercept the handling of these messages by 
overriding {@link #doLog(Level, Throwable, Supplier)}.
+        *
         * @param level The log level.
         * @param msg The message to log.
         * @param args Optional {@link MessageFormat}-style arguments.
         */
        public void log(Level level, String msg, Object...args) {
-               logger.log(level, msg, args);
+               doLog(level, null, () -> StringUtils.format(msg, args));
        }
 
        /**
         * Log a message.
         *
+        * <p>
+        * Subclasses can intercept the handling of these messages by 
overriding {@link #doLog(Level, Throwable, Supplier)}.
+        *
         * @param level The log level.
+        * @param cause The cause.
         * @param msg The message to log.
         * @param args Optional {@link MessageFormat}-style arguments.
         */
-       public void logObjects(Level level, String msg, Object...args) {
-               logger.logObjects(level, msg, args);
+       public void log(Level level, Throwable cause, String msg, 
Object...args) {
+               doLog(level, cause, () -> StringUtils.format(msg, args));
        }
 
        /**
-        * Log a message.
+        * Main logger method.
+        *
+        * <p>
+        * The default behavior logs a message to the Java logger of the class 
name.
+        *
+        * <p>
+        * Subclasses can override this method to implement their own logger 
handling.
         *
         * @param level The log level.
-        * @param cause The cause.
+        * @param cause Optional throwable.
         * @param msg The message to log.
-        * @param args Optional {@link MessageFormat}-style arguments.
         */
-       public void log(Level level, Throwable cause, String msg, 
Object...args) {
-               logger.log(level, cause, msg, args);
+       protected void doLog(Level level, Throwable cause, Supplier<String> 
msg) {
+               logger.log(level, cause, msg);
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 4efb852..ac1cd3d 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -1778,7 +1778,6 @@ public final class RestRequest extends 
HttpServletRequestWrapper {
         *      <li class='jf'>{@link 
org.apache.juneau.rest.RestContext#REST_logger}
         *      <li class='jac'>{@link org.apache.juneau.rest.RestLogger}
         *      <li class='jm'>{@link 
org.apache.juneau.rest.RestServlet#log(Level, String, Object...)}
-        *      <li class='jm'>{@link 
org.apache.juneau.rest.RestServlet#logObjects(Level, String, Object...)}
         *      <li class='link'>{@doc juneau-rest-server.LoggingAndDebugging}
         * </ul>
         *
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
index 603b197..c7d4caa 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
@@ -22,6 +22,7 @@ import java.io.*;
 import java.lang.reflect.Method;
 import java.text.*;
 import java.util.*;
+import java.util.function.*;
 import java.util.logging.*;
 
 import javax.servlet.*;
@@ -50,7 +51,7 @@ public abstract class RestServlet extends HttpServlet 
implements RestCallHandler
        private volatile Exception initException;
        private boolean isInitialized = false;  // Should not be volatile.
        private volatile RestResourceResolver resourceResolver = new 
BasicRestResourceResolver();
-       private JuneauLogger logger = JuneauLogger.getLogger(getClass());
+       private Logger logger = Logger.getLogger(getClass().getName());
        private RestCallHandler callHandler;
        private RestInfoProvider infoProvider;
        private RestCallLogger callLogger;
@@ -186,69 +187,77 @@ public abstract class RestServlet extends HttpServlet 
implements RestCallHandler
        // Convenience logger methods
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Override /* GenericServlet */
-       public void log(String msg) {
-               super.log(msg);
-       }
-
-       @Override /* GenericServlet */
-       public void log(String msg, Throwable cause) {
-               super.log(msg, cause);
-       }
-
        /**
-        * Convenience method for calling {@link #log(String)} with message 
arguments.
+        * Log a message at {@link Level#INFO} level.
         *
-        * @param msg The message containing {@link MessageFormat}-style 
arguments.
-        * @param args The arguments.
+        * <p>
+        * Subclasses can intercept the handling of these messages by 
overriding {@link #doLog(Level, Throwable, Supplier)}.
+        *
+        * @param msg The message to log.
         */
-       public void log(String msg, Object...args) {
-               super.log(args.length == 0 ? msg : MessageFormat.format(msg, 
args));
+       @Override /* GenericServlet */
+       public void log(String msg) {
+               doLog(Level.INFO, null, () -> msg);
        }
 
        /**
-        * Convenience method for calling {@link #log(String)} with message 
arguments.
+        * Log a message.
+        *
+        * <p>
+        * Subclasses can intercept the handling of these messages by 
overriding {@link #doLog(Level, Throwable, Supplier)}.
         *
-        * @param msg The message containing {@link MessageFormat}-style 
arguments.
+        * @param msg The message to log.
         * @param cause The cause.
-        * @param args The arguments.
         */
-       public void log(String msg, Throwable cause, Object...args) {
-               super.log(args.length == 0 ? msg : MessageFormat.format(msg, 
args), cause);
+       @Override /* GenericServlet */
+       public void log(String msg, Throwable cause) {
+               doLog(Level.INFO, null, () -> msg);
        }
 
        /**
         * Log a message.
         *
+        * <p>
+        * Subclasses can intercept the handling of these messages by 
overriding {@link #doLog(Level, Throwable, Supplier)}.
+        *
         * @param level The log level.
         * @param msg The message to log.
         * @param args Optional {@link MessageFormat}-style arguments.
         */
        public void log(Level level, String msg, Object...args) {
-               logger.log(level, msg, args);
+               doLog(level, null, () -> StringUtils.format(msg, args));
        }
 
        /**
         * Log a message.
         *
+        * <p>
+        * Subclasses can intercept the handling of these messages by 
overriding {@link #doLog(Level, Throwable, Supplier)}.
+        *
         * @param level The log level.
+        * @param cause The cause.
         * @param msg The message to log.
         * @param args Optional {@link MessageFormat}-style arguments.
         */
-       public void logObjects(Level level, String msg, Object...args) {
-               logger.logObjects(level, msg, args);
+       public void log(Level level, Throwable cause, String msg, 
Object...args) {
+               doLog(level, cause, () -> StringUtils.format(msg, args));
        }
 
        /**
-        * Log a message.
+        * Main logger method.
+        *
+        * <p>
+        * The default behavior logs a message to the Java logger of the class 
name.
+        *
+        * <p>
+        * Subclasses can override this method to implement their own logger 
handling.
         *
         * @param level The log level.
-        * @param cause The cause.
+        * @param cause Optional throwable.
         * @param msg The message to log.
-        * @param args Optional {@link MessageFormat}-style arguments.
         */
-       public void log(Level level, Throwable cause, String msg, 
Object...args) {
-               logger.log(level, cause, msg, args);
+       protected void doLog(Level level, Throwable cause, Supplier<String> 
msg) {
+               logger.log(level, cause, msg);
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HookEvent.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HookEvent.java
index 79889f7..2d9dc4c 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HookEvent.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HookEvent.java
@@ -24,7 +24,6 @@ import org.apache.juneau.config.*;
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.http.*;
 import org.apache.juneau.http.exception.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.utils.*;
 
@@ -158,7 +157,6 @@ public enum HookEvent {
         *                      <li>{@link RequestFormData}
         *                      <li>{@link HttpMethod}
         *                      <li>{@link Logger}
-        *                      <li>{@link JuneauLogger}
         *                      <li>{@link RestContext}
         *                      <li>{@link org.apache.juneau.parser.Parser}
         *                      <li>{@link Locale}

Reply via email to