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 db6f4ee  Context API refactoring.
db6f4ee is described below

commit db6f4ee4ece87b646f5fdb7dea5d80565004b2f3
Author: JamesBognar <[email protected]>
AuthorDate: Fri Oct 1 16:21:58 2021 -0400

    Context API refactoring.
---
 .../org/apache/juneau/config/ConfigBuilder.java    |   1 +
 .../config/store/ConfigFileStoreBuilder.java       |   2 +
 .../org/apache/juneau/jena/RdfParserBuilder.java   |   2 +
 .../apache/juneau/jena/RdfSerializerBuilder.java   |   2 +
 .../java/org/apache/juneau/BeanContextBuilder.java |   1 +
 .../org/apache/juneau/BeanTraverseBuilder.java     |   2 +
 .../src/main/java/org/apache/juneau/Context.java   |  48 +-
 .../java/org/apache/juneau/ContextBuilder.java     |  87 +--
 .../java/org/apache/juneau/SystemProperties.java   |  85 ---
 .../org/apache/juneau/html/HtmlDocSerializer.java  |   5 +-
 .../juneau/html/HtmlSchemaDocSerializer.java       |  22 +-
 .../html/HtmlSchemaDocSerializerBuilder.java       | 805 +++++++++++++++++++++
 .../apache/juneau/html/HtmlSerializerBuilder.java  |   2 +
 .../java/org/apache/juneau/internal/SystemEnv.java |  89 +++
 .../org/apache/juneau/internal/SystemUtils.java    |  75 --
 .../org/apache/juneau/json/JsonParserBuilder.java  |   2 +
 .../apache/juneau/json/JsonSerializerBuilder.java  |   2 +
 .../jsonschema/JsonSchemaGeneratorBuilder.java     |   2 +
 .../juneau/msgpack/MsgPackSerializerBuilder.java   |   2 +
 .../juneau/parser/InputStreamParserBuilder.java    |   2 +
 .../org/apache/juneau/parser/ParserBuilder.java    |   2 +
 .../apache/juneau/parser/ReaderParserBuilder.java  |   2 +
 .../serializer/OutputStreamSerializerBuilder.java  |   2 +
 .../juneau/serializer/SerializerBuilder.java       |   2 +
 .../juneau/serializer/WriterSerializerBuilder.java |   2 +
 .../org/apache/juneau/uon/UonParserBuilder.java    |   2 +
 .../apache/juneau/uon/UonSerializerBuilder.java    |   2 +
 .../urlencoding/UrlEncodingParserBuilder.java      |   2 +
 .../urlencoding/UrlEncodingSerializerBuilder.java  |   2 +
 .../org/apache/juneau/xml/XmlParserBuilder.java    |   2 +
 .../apache/juneau/xml/XmlSerializerBuilder.java    |   2 +
 .../juneau/microservice/jetty/JettyLogger.java     |   5 +-
 .../microservice/jetty/JettyMicroservice.java      |   9 +-
 .../org/apache/juneau/rest/RestContextBuilder.java |   1 +
 .../juneau/rest/logging/BasicRestLogger.java       |  16 +-
 .../org/apache/juneau/rest/logging/RestLogger.java |   9 +
 36 files changed, 1008 insertions(+), 292 deletions(-)

diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/ConfigBuilder.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/ConfigBuilder.java
index 6ec48a0..6f5118b 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/ConfigBuilder.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/ConfigBuilder.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.config;
 
 import static org.apache.juneau.internal.ExceptionUtils.*;
+import static org.apache.juneau.internal.SystemEnv.*;
 
 import java.io.*;
 import java.lang.reflect.*;
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStoreBuilder.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStoreBuilder.java
index 345fa8e..e1aaa4d 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStoreBuilder.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStoreBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.config.store;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.io.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
index b591fe6..01e7826 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.jena;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
index 8269960..94d3160 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.jena;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
index 8b910a1..29add48 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
@@ -15,6 +15,7 @@ package org.apache.juneau;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.Visibility.*;
 import static java.util.Arrays.*;
+import static org.apache.juneau.internal.SystemEnv.*;
 
 import java.beans.*;
 import java.io.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
index b8e93d7..d3ca6ed 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
index fbab483..8570005 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
@@ -14,6 +14,7 @@ package org.apache.juneau;
 
 import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.CollectionUtils.*;
+import static org.apache.juneau.internal.ExceptionUtils.*;
 import static java.util.Optional.*;
 
 import java.lang.annotation.*;
@@ -48,6 +49,10 @@ import org.apache.juneau.utils.*;
  */
 public abstract class Context implements MetaProvider {
 
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Static
+       
//-----------------------------------------------------------------------------------------------------------------
+
        private static final Map<Class<?>,MethodInfo> BUILDER_CREATE_METHODS = 
new ConcurrentHashMap<>();
 
        /**
@@ -66,7 +71,7 @@ public abstract class Context implements MetaProvider {
                        if (mi == null) {
                                mi = 
ClassInfo.of(type).getBuilderCreateMethod();
                                if (mi == null)
-                                       throw new RuntimeException("Could not 
find builder create method on class " + type);
+                                       throw runtimeException("Could not find 
builder create method on class {0}", type);
                                BUILDER_CREATE_METHODS.put(type, mi);
                        }
                        ContextBuilder b = (ContextBuilder)mi.invoke(null);
@@ -77,8 +82,11 @@ public abstract class Context implements MetaProvider {
                }
        }
 
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Instance
+       
//-----------------------------------------------------------------------------------------------------------------
+
        final List<Annotation> annotations;
-       private final int identityCode;
        final boolean debug;
 
        private final ReflectionMap<Annotation> annotationMap;
@@ -89,7 +97,6 @@ public abstract class Context implements MetaProvider {
         * @param copyFrom The context to copy from.
         */
        protected Context(Context copyFrom) {
-               identityCode = copyFrom.identityCode;
                annotationMap = copyFrom.annotationMap;
                annotations = copyFrom.annotations;
                debug = copyFrom.debug;
@@ -102,7 +109,6 @@ public abstract class Context implements MetaProvider {
         */
        protected Context(ContextBuilder builder) {
                debug = builder.debug;
-               identityCode = System.identityHashCode(this);
                annotations = 
ofNullable(builder.annotations).orElse(emptyList());
 
                ReflectionMap.Builder<Annotation> rmb = 
ReflectionMap.create(Annotation.class);
@@ -178,18 +184,19 @@ public abstract class Context implements MetaProvider {
         */
        public abstract SessionArgs createDefaultSessionArgs();
 
-       @Override /* Object */
-       public int hashCode() {
-               return identityCode;
-       }
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Properties
+       
//-----------------------------------------------------------------------------------------------------------------
 
        /**
-        * Returns a uniqueness identity code for this context.
+        * Debug mode.
         *
-        * @return A uniqueness identity code.
+        * @see ContextBuilder#debug()
+        * @return
+        *      <jk>true</jk> if debug mode is enabled.
         */
-       public int identityCode() {
-               return identityCode;
+       public boolean isDebug() {
+               return debug;
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -450,20 +457,6 @@ public abstract class Context implements MetaProvider {
                return getAnnotations(a, c == null ? null : c.inner()).size() > 
0;
        }
 
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Properties
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       /**
-        * Debug mode.
-        *
-        * @see ContextBuilder#debug()
-        * @return
-        *      <jk>true</jk> if debug mode is enabled.
-        */
-       public boolean isDebug() {
-               return debug;
-       }
 
        
//-----------------------------------------------------------------------------------------------------------------
        // Other methods
@@ -491,7 +484,8 @@ public abstract class Context implements MetaProvider {
                                OMap
                                        .create()
                                        .filtered()
-                                       .a("identityCode", identityCode)
+                                       .a("annotations", annotations)
+                                       .a("debug", debug)
                        );
        }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
index 5e05f68..b23f3d3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
@@ -17,12 +17,11 @@ import static org.apache.juneau.reflect.ReflectionFilters.*;
 import static org.apache.juneau.Visibility.*;
 import static java.util.stream.Collectors.*;
 import static java.util.Arrays.*;
+import static org.apache.juneau.internal.SystemEnv.*;
 
 import java.lang.annotation.*;
 import java.lang.reflect.*;
-import java.nio.charset.*;
 import java.util.*;
-import java.util.concurrent.*;
 import java.util.function.*;
 
 import org.apache.juneau.annotation.*;
@@ -670,90 +669,6 @@ public abstract class ContextBuilder {
        // Helper methods.
        
//-----------------------------------------------------------------------------------------------------------------
 
-       /**
-        * Looks up a default value from the environment.
-        *
-        * <p>
-        * First looks in system properties.  Then converts the name to 
env-safe and looks in the system environment.
-        * Then returns the default if it can't be found.
-        *
-        * @param name The property name.
-        * @param def The default value if not found.
-        * @return The default value.
-        */
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       protected <T> T env(String name, T def) {
-               String s = System.getProperty(name);
-               if (s == null)
-                       s = System.getenv(envName(name));
-               if (s == null)
-                       return def;
-               Class<?> c = def.getClass();
-               if (c.isEnum())
-                       return (T)Enum.valueOf((Class<? extends Enum>) c, s);
-               Function<String,T> f = (Function<String,T>)ENV_FUNCTIONS.get(c);
-               if (f == null)
-                       throw runtimeException("Invalid env type: {0}", c);
-               return f.apply(s);
-       }
-
-       private static final Map<Class<?>,Function<String,?>> ENV_FUNCTIONS = 
new IdentityHashMap<>();
-       static {
-               ENV_FUNCTIONS.put(String.class, x -> x);
-               ENV_FUNCTIONS.put(Boolean.class, x -> Boolean.valueOf(x));
-               ENV_FUNCTIONS.put(Charset.class, x -> Charset.forName(x));
-       }
-
-       private static final ConcurrentHashMap<String,String> PROPERTY_TO_ENV = 
new ConcurrentHashMap<>();
-       private static String envName(String name) {
-               String name2 = PROPERTY_TO_ENV.get(name);
-               if (name2 == null) {
-                       name2 = name.toUpperCase().replace(".", "_");
-                       PROPERTY_TO_ENV.put(name, name2);
-               }
-               return name2;
-       }
-
-       /**
-        * Creates a list from an array of objects.
-        *
-        * @param objects The objects to create a list from.
-        * @return A new list not backed by the array.
-        */
-       @SuppressWarnings("unchecked")
-       protected <T> List<T> list(T...objects) {
-               return new ArrayList<>(Arrays.asList(objects));
-       }
-
-       /**
-        * Appends to an existing list.
-        *
-        * @param list The list to append to.
-        * @param objects The objects to append.
-        * @return The same list, or a new list if the list was <jk>null</jk>.
-        */
-       @SuppressWarnings("unchecked")
-       protected <T> List<T> append(List<T> list, T...objects) {
-               if (list == null)
-                       return list(objects);
-               list.addAll(Arrays.asList(objects));
-               return list;
-       }
-
-       /**
-        * Prepends to an existing list.
-        *
-        * @param list The list to prepend to.
-        * @param objects The objects to prepend.
-        * @return The same list, or a new list if the list was <jk>null</jk>.
-        */
-       @SuppressWarnings("unchecked")
-       protected <T> List<T> prepend(List<T> list, T...objects) {
-               if (list == null)
-                       return list(objects);
-               list.addAll(0, Arrays.asList(objects));
-               return list;
-       }
 
        // <FluentSetters>
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/SystemProperties.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/SystemProperties.java
deleted file mode 100644
index 53aae7c..0000000
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/SystemProperties.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau;
-
-import org.apache.juneau.internal.*;
-import org.apache.juneau.reflect.*;
-
-/**
- * Utility class for getting system property values.
- */
-public class SystemProperties {
-
-       /**
-        * Returns the specified system property or environment variable value 
as the specified type.
-        *
-        * <p>
-        * First does a lookup on the system property with the specified 
property name (e.g. <js>"juneau.stackTraceCacheTimeout"</js>)
-        * <br>
-        * If not found, then searches it as an env var (e.g. 
<js>"JUNEAU_STACKTRACETIMEOUT"</js>).
-        * <br>
-        * If found, converts the string value using any number of string 
mutaters (e.g. public string constructors, static
-        * creators, etc...)
-        *
-        * @param <T> The type to convert the value to.
-        * @param c The type to convert the value to.
-        * @param propertyName The system property name.
-        * @param def The default value if not found.
-        * @return The converted property, or <jk>null</jk> if property not set.
-        */
-       public static <T> T getProperty(Class<T> c, String propertyName, T def) 
{
-               String p = getProperty(propertyName, null);
-               if (p != null) {
-                       Mutater<String,T> t = Mutaters.get(String.class, c);
-                       return t == def ? null : t.mutate(p);
-               }
-               return def;
-       }
-
-       /**
-        * Returns the specified system property or environment variable value 
as the specified type.
-        *
-        * <p>
-        * First does a lookup on the system property with the specified 
property name (e.g. <js>"juneau.stackTraceCacheTimeout"</js>)
-        * <br>
-        * If not found, then searches it as an env var (e.g. 
<js>"JUNEAU_STACKTRACETIMEOUT"</js>).
-        *
-        * @param propertyName The system property name.
-        * @param def The default value if not found.
-        * @return The converted property, or <jk>null</jk> if property not set.
-        */
-       public static String getProperty(String propertyName, String def) {
-               propertyName = StringUtils.emptyIfNull(propertyName);
-               String p = System.getProperty(propertyName);
-               try {
-                       if (p == null)
-                                p = System.getenv(propertyName.replace('.', 
'_').replace('-', '_').toUpperCase());
-               } catch (SecurityException e) {}
-               return p == null ? def : p;
-       }
-
-       /**
-        * Returns the specified system property or environment variable value 
as the specified type.
-        *
-        * <p>
-        * First does a lookup on the system property with the specified 
property name (e.g. <js>"juneau.stackTraceCacheTimeout"</js>)
-        * <br>
-        * If not found, then searches it as an env var (e.g. 
<js>"JUNEAU_STACKTRACETIMEOUT"</js>).
-        *
-        * @param propertyName The system property name.
-        * @return The converted property, or <jk>null</jk> if property not set.
-        */
-       public static String getProperty(String propertyName) {
-               return getProperty(propertyName, null);
-       }
-}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
index 11931e6..ee4f9a9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
@@ -146,9 +146,8 @@ public class HtmlDocSerializer extends 
HtmlStrippedDocSerializer {
 
        @Override /* XmlSerializer */
        public HtmlSerializer getSchemaSerializer() {
-               int TODO;
-//             if (schemaSerializer == null)
-//                     schemaSerializer = (HtmlSchemaDocSerializer) 
HtmlDocSerializer.create().type(HtmlSchemaDocSerializer.class).beanContext(getBeanContext()).build();
+               if (schemaSerializer == null)
+                       schemaSerializer = 
HtmlSchemaDocSerializer.create().beanContext(getBeanContext()).build();
                return schemaSerializer;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
index 1fc905b..b6b91be 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
@@ -39,10 +39,30 @@ import org.apache.juneau.serializer.*;
 public final class HtmlSchemaDocSerializer extends HtmlDocSerializer {
 
        
//-----------------------------------------------------------------------------------------------------------------
+       // Static
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       /**
+        * Instantiates a new clean-slate {@link HtmlSchemaDocSerializer} 
object.
+        *
+        * <p>
+        * This is equivalent to simply calling <code><jk>new</jk> 
HtmlSchemaDocSerializerBuilder()</code>.
+        *
+        * <p>
+        * Note that this method creates a builder initialized to all default 
settings, whereas {@link #copy()} copies
+        * the settings of the object called on.
+        *
+        * @return A new {@link HtmlSchemaDocSerializerBuilder} object.
+        */
+       public static HtmlSchemaDocSerializerBuilder create() {
+               return new HtmlSchemaDocSerializerBuilder();
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
        // Instance
        
//-----------------------------------------------------------------------------------------------------------------
 
-       private final JsonSchemaGenerator generator;
+       final JsonSchemaGenerator generator;
 
        /**
         * Constructor.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializerBuilder.java
new file mode 100644
index 0000000..49cabab
--- /dev/null
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializerBuilder.java
@@ -0,0 +1,805 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.html;
+
+import java.lang.annotation.*;
+import java.lang.reflect.*;
+import java.nio.charset.*;
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.collections.*;
+import org.apache.juneau.http.header.*;
+import org.apache.juneau.internal.*;
+import org.apache.juneau.json.*;
+import org.apache.juneau.jsonschema.*;
+import org.apache.juneau.jsonschema.annotation.*;
+import org.apache.juneau.xml.*;
+
+/**
+ * Builder class for building instances of HTML Doc Schema serializers.
+ */
+@FluentSetters
+public class HtmlSchemaDocSerializerBuilder extends HtmlDocSerializerBuilder {
+
+       JsonSchemaGeneratorBuilder generatorBuilder;
+
+       /**
+        * Constructor, default settings.
+        */
+       protected HtmlSchemaDocSerializerBuilder() {
+               super();
+               produces("text/html");
+               accept("text/html+schema");
+               type(HtmlSchemaDocSerializer.class);
+               generatorBuilder = (JsonSchemaGeneratorBuilder) 
JsonSchemaGenerator.create().beanContext(beanContext());
+       }
+
+       /**
+        * Copy constructor.
+        *
+        * @param copyFrom The bean to copy from.
+        */
+       protected HtmlSchemaDocSerializerBuilder(HtmlSchemaDocSerializer 
copyFrom) {
+               super(copyFrom);
+               generatorBuilder = (JsonSchemaGeneratorBuilder) 
copyFrom.generator.copy().beanContext(beanContext());
+       }
+
+       /**
+        * Copy constructor.
+        *
+        * @param copyFrom The builder to copy from.
+        */
+       protected HtmlSchemaDocSerializerBuilder(HtmlSchemaDocSerializerBuilder 
copyFrom) {
+               super(copyFrom);
+               generatorBuilder = (JsonSchemaGeneratorBuilder) 
copyFrom.generatorBuilder.copy().beanContext(beanContext());
+       }
+
+       @Override /* ContextBuilder */
+       public HtmlSchemaDocSerializerBuilder copy() {
+               return new HtmlSchemaDocSerializerBuilder(this);
+       }
+
+       @Override /* ContextBuilder */
+       public HtmlSchemaDocSerializer build() {
+               return (HtmlSchemaDocSerializer)super.build();
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Properties
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       /**
+        * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  
Add descriptions.
+        *
+        * <p>
+        * Identifies which categories of types that descriptions should be 
automatically added to generated schemas.
+        * <p>
+        * The description is the result of calling {@link 
ClassMeta#getFullName()}.
+        *
+        * <ul class='seealso'>
+        *      <li class='jm'>{@link 
JsonSchemaGeneratorBuilder#addDescriptionsTo(TypeCategory...)}
+        * </ul>
+        *
+        * @param values
+        *      The values to add to this setting.
+        *      <br>The default is an empty string.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public HtmlSchemaDocSerializerBuilder 
addDescriptionsTo(TypeCategory...values) {
+               generatorBuilder.addDescriptionsTo(values);
+               return this;
+       }
+
+       /**
+        * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  
Add examples.
+        *
+        * <p>
+        * Identifies which categories of types that examples should be 
automatically added to generated schemas.
+        * <p>
+        * The examples come from calling {@link 
ClassMeta#getExample(BeanSession,JsonParserSession)} which in turn gets examples
+        * from the following:
+        * <ul class='javatree'>
+        *      <li class='ja'>{@link Example}
+        *      <li class='ja'>{@link Marshalled#example() Marshalled(example)}
+        * </ul>
+        *
+        * <ul class='seealso'>
+        *      <li class='jm'>{@link 
JsonSchemaGeneratorBuilder#addExamplesTo(TypeCategory...)}
+        * </ul>
+        *
+        * @param values
+        *      The values to add to this setting.
+        *      <br>The default is an empty string.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public HtmlSchemaDocSerializerBuilder 
addExamplesTo(TypeCategory...values) {
+               generatorBuilder.addExamplesTo(values);
+               return this;
+       }
+
+       /**
+        * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  
Allow nested descriptions.
+        *
+        * <p>
+        * Identifies whether nested descriptions are allowed in schema 
definitions.
+        *
+        * <ul class='seealso'>
+        *      <li class='jm'>{@link 
JsonSchemaGeneratorBuilder#allowNestedDescriptions()}
+        * </ul>
+        *
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public HtmlSchemaDocSerializerBuilder allowNestedDescriptions() {
+               generatorBuilder.allowNestedDescriptions();
+               return this;
+       }
+
+       /**
+        * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  
Allow nested examples.
+        *
+        * <p>
+        * Identifies whether nested examples are allowed in schema definitions.
+        *
+        * <ul class='seealso'>
+        *      <li class='jm'>{@link 
JsonSchemaGeneratorBuilder#allowNestedExamples()}
+        * </ul>
+        *
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public HtmlSchemaDocSerializerBuilder allowNestedExamples() {
+               generatorBuilder.allowNestedExamples();
+               return this;
+       }
+
+       /**
+        * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  
Schema definition mapper.
+        *
+        * <p>
+        * Interface to use for converting Bean classes to definition IDs and 
URIs.
+        * <p>
+        * Used primarily for defining common definition sections for beans in 
Swagger JSON.
+        * <p>
+        * This setting is ignored if {@link 
JsonSchemaGeneratorBuilder#useBeanDefs()} is not enabled.
+        *
+        * <ul class='seealso'>
+        *      <li class='jm'>{@link 
JsonSchemaGeneratorBuilder#beanDefMapper(Class)}
+        * </ul>
+        *
+        * @param value
+        *      The new value for this property.
+        *      <br>The default is {@link 
org.apache.juneau.jsonschema.BasicBeanDefMapper}.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public HtmlSchemaDocSerializerBuilder beanDefMapper(Class<? extends 
BeanDefMapper> value) {
+               generatorBuilder.beanDefMapper(value);
+               return this;
+       }
+
+       /**
+        * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  
Default schemas.
+        *
+        * <p>
+        * Allows you to override or provide custom schema information for 
particular class types.
+        * <p>
+        * Keys are full class names.
+        *
+        * <ul class='seealso'>
+        *      <li class='jf'>{@link Schema#value}
+        * </ul>
+        *
+        * @param c
+        *      The class to define a default schema for.
+        * @param schema
+        *      The schema.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public HtmlSchemaDocSerializerBuilder defaultSchema(Class<?> c, OMap 
schema) {
+               return 
annotations(SchemaAnnotation.create(c).value(schema.toString()).build());
+       }
+
+       /**
+        * <i><l>HtmlSchemaSerializer</l> configuration property:&emsp;</i>  
Use bean definitions.
+        *
+        * <p>
+        * When enabled, schemas on beans will be serialized as the following:
+        * <p class='bcode w800'>
+        *      {
+        *              type: <js>'object'</js>,
+        *              <js>'$ref'</js>: <js>'#/definitions/TypeId'</js>
+        *      }
+        * </p>
+        *
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public HtmlSchemaDocSerializerBuilder useBeanDefs() {
+               generatorBuilder.useBeanDefs();
+               return this;
+       }
+
+       // <FluentSetters>
+
+       @Override /* GENERATED - ContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanContext(BeanContext value) {
+               super.beanContext(value);
+               return this;
+       }
+
+       @Override /* GENERATED - ContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
applyAnnotations(java.lang.Class<?>...fromClasses) {
+               super.applyAnnotations(fromClasses);
+               return this;
+       }
+
+       @Override /* GENERATED - ContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
applyAnnotations(Method...fromMethods) {
+               super.applyAnnotations(fromMethods);
+               return this;
+       }
+
+       @Override /* GENERATED - ContextBuilder */
+       public HtmlSchemaDocSerializerBuilder apply(AnnotationWorkList work) {
+               super.apply(work);
+               return this;
+       }
+
+       @Override /* GENERATED - ContextBuilder */
+       public HtmlSchemaDocSerializerBuilder debug() {
+               super.debug();
+               return this;
+       }
+
+       @Override /* GENERATED - ContextBuilder */
+       public HtmlSchemaDocSerializerBuilder locale(Locale value) {
+               super.locale(value);
+               return this;
+       }
+
+       @Override /* GENERATED - ContextBuilder */
+       public HtmlSchemaDocSerializerBuilder mediaType(MediaType value) {
+               super.mediaType(value);
+               return this;
+       }
+
+       @Override /* GENERATED - ContextBuilder */
+       public HtmlSchemaDocSerializerBuilder timeZone(TimeZone value) {
+               super.timeZone(value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder annotations(Annotation...values) {
+               super.annotations(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanClassVisibility(Visibility 
value) {
+               super.beanClassVisibility(value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
beanConstructorVisibility(Visibility value) {
+               super.beanConstructorVisibility(value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanFieldVisibility(Visibility 
value) {
+               super.beanFieldVisibility(value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanInterceptor(Class<?> on, 
Class<? extends org.apache.juneau.transform.BeanInterceptor<?>> value) {
+               super.beanInterceptor(on, value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanMapPutReturnsOldValue() {
+               super.beanMapPutReturnsOldValue();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanMethodVisibility(Visibility 
value) {
+               super.beanMethodVisibility(value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanProperties(Map<String,Object> 
values) {
+               super.beanProperties(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanProperties(Class<?> 
beanClass, String properties) {
+               super.beanProperties(beanClass, properties);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanProperties(String 
beanClassName, String properties) {
+               super.beanProperties(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
beanPropertiesExcludes(Map<String,Object> values) {
+               super.beanPropertiesExcludes(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanPropertiesExcludes(Class<?> 
beanClass, String properties) {
+               super.beanPropertiesExcludes(beanClass, properties);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanPropertiesExcludes(String 
beanClassName, String properties) {
+               super.beanPropertiesExcludes(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
beanPropertiesReadOnly(Map<String,Object> values) {
+               super.beanPropertiesReadOnly(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanPropertiesReadOnly(Class<?> 
beanClass, String properties) {
+               super.beanPropertiesReadOnly(beanClass, properties);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanPropertiesReadOnly(String 
beanClassName, String properties) {
+               super.beanPropertiesReadOnly(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
beanPropertiesWriteOnly(Map<String,Object> values) {
+               super.beanPropertiesWriteOnly(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanPropertiesWriteOnly(Class<?> 
beanClass, String properties) {
+               super.beanPropertiesWriteOnly(beanClass, properties);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanPropertiesWriteOnly(String 
beanClassName, String properties) {
+               super.beanPropertiesWriteOnly(beanClassName, properties);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beansRequireDefaultConstructor() {
+               super.beansRequireDefaultConstructor();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beansRequireSerializable() {
+               super.beansRequireSerializable();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beansRequireSettersForGetters() {
+               super.beansRequireSettersForGetters();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder beanDictionary(Class<?>...values) 
{
+               super.beanDictionary(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder dictionaryOn(Class<?> on, 
java.lang.Class<?>...values) {
+               super.dictionaryOn(on, values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
disableBeansRequireSomeProperties() {
+               super.disableBeansRequireSomeProperties();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder disableIgnoreMissingSetters() {
+               super.disableIgnoreMissingSetters();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder disableIgnoreTransientFields() {
+               super.disableIgnoreTransientFields();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
disableIgnoreUnknownNullBeanProperties() {
+               super.disableIgnoreUnknownNullBeanProperties();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder disableInterfaceProxies() {
+               super.disableInterfaceProxies();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public <T> HtmlSchemaDocSerializerBuilder example(Class<T> pojoClass, T 
o) {
+               super.example(pojoClass, o);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public <T> HtmlSchemaDocSerializerBuilder example(Class<T> pojoClass, 
String json) {
+               super.example(pojoClass, json);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder findFluentSetters() {
+               super.findFluentSetters();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder findFluentSetters(Class<?> on) {
+               super.findFluentSetters(on);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
ignoreInvocationExceptionsOnGetters() {
+               super.ignoreInvocationExceptionsOnGetters();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
ignoreInvocationExceptionsOnSetters() {
+               super.ignoreInvocationExceptionsOnSetters();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder ignoreUnknownBeanProperties() {
+               super.ignoreUnknownBeanProperties();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder implClass(Class<?> 
interfaceClass, Class<?> implClass) {
+               super.implClass(interfaceClass, implClass);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
implClasses(Map<Class<?>,Class<?>> values) {
+               super.implClasses(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder interfaceClass(Class<?> on, 
Class<?> value) {
+               super.interfaceClass(on, value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
interfaces(java.lang.Class<?>...value) {
+               super.interfaces(value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder notBeanClasses(Class<?>...values) 
{
+               super.notBeanClasses(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder notBeanPackages(String...values) {
+               super.notBeanPackages(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder propertyNamer(Class<? extends 
org.apache.juneau.PropertyNamer> value) {
+               super.propertyNamer(value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder propertyNamer(Class<?> on, 
Class<? extends org.apache.juneau.PropertyNamer> value) {
+               super.propertyNamer(on, value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder sortProperties() {
+               super.sortProperties();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder 
sortProperties(java.lang.Class<?>...on) {
+               super.sortProperties(on);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder stopClass(Class<?> on, Class<?> 
value) {
+               super.stopClass(on, value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder swaps(Class<?>...values) {
+               super.swaps(values);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder typeName(Class<?> on, String 
value) {
+               super.typeName(on, value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder typePropertyName(String value) {
+               super.typePropertyName(value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder typePropertyName(Class<?> on, 
String value) {
+               super.typePropertyName(on, value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder useEnumNames() {
+               super.useEnumNames();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanContextBuilder */
+       public HtmlSchemaDocSerializerBuilder useJavaBeanIntrospector() {
+               super.useJavaBeanIntrospector();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanTraverseBuilder */
+       public HtmlSchemaDocSerializerBuilder detectRecursions() {
+               super.detectRecursions();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanTraverseBuilder */
+       public HtmlSchemaDocSerializerBuilder ignoreRecursions() {
+               super.ignoreRecursions();
+               return this;
+       }
+
+       @Override /* GENERATED - BeanTraverseBuilder */
+       public HtmlSchemaDocSerializerBuilder initialDepth(int value) {
+               super.initialDepth(value);
+               return this;
+       }
+
+       @Override /* GENERATED - BeanTraverseBuilder */
+       public HtmlSchemaDocSerializerBuilder maxDepth(int value) {
+               super.maxDepth(value);
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder addBeanTypes() {
+               super.addBeanTypes();
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder addRootType() {
+               super.addRootType();
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder keepNullProperties() {
+               super.keepNullProperties();
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder listener(Class<? extends 
org.apache.juneau.serializer.SerializerListener> value) {
+               super.listener(value);
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder sortCollections() {
+               super.sortCollections();
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder sortMaps() {
+               super.sortMaps();
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder trimEmptyCollections() {
+               super.trimEmptyCollections();
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder trimEmptyMaps() {
+               super.trimEmptyMaps();
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder trimStrings() {
+               super.trimStrings();
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder uriContext(UriContext value) {
+               super.uriContext(value);
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder uriRelativity(UriRelativity 
value) {
+               super.uriRelativity(value);
+               return this;
+       }
+
+       @Override /* GENERATED - SerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder uriResolution(UriResolution 
value) {
+               super.uriResolution(value);
+               return this;
+       }
+
+       @Override /* GENERATED - WriterSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder fileCharset(Charset value) {
+               super.fileCharset(value);
+               return this;
+       }
+
+       @Override /* GENERATED - WriterSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder maxIndent(int value) {
+               super.maxIndent(value);
+               return this;
+       }
+
+       @Override /* GENERATED - WriterSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder quoteChar(char value) {
+               super.quoteChar(value);
+               return this;
+       }
+
+       @Override /* GENERATED - WriterSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder sq() {
+               super.sq();
+               return this;
+       }
+
+       @Override /* GENERATED - WriterSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder streamCharset(Charset value) {
+               super.streamCharset(value);
+               return this;
+       }
+
+       @Override /* GENERATED - WriterSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder useWhitespace() {
+               super.useWhitespace();
+               return this;
+       }
+
+       @Override /* GENERATED - WriterSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder ws() {
+               super.ws();
+               return this;
+       }
+
+       @Override /* GENERATED - XmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder addNamespaceUrisToRoot() {
+               super.addNamespaceUrisToRoot();
+               return this;
+       }
+
+       @Override /* GENERATED - XmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder disableAutoDetectNamespaces() {
+               super.disableAutoDetectNamespaces();
+               return this;
+       }
+
+       @Override /* GENERATED - XmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder enableNamespaces() {
+               super.enableNamespaces();
+               return this;
+       }
+
+       @Override /* GENERATED - XmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder namespaces(Namespace...values) {
+               super.namespaces(values);
+               return this;
+       }
+
+       @Override /* GENERATED - XmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder ns() {
+               super.ns();
+               return this;
+       }
+
+       @Override /* GENERATED - HtmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder addKeyValueTableHeaders() {
+               super.addKeyValueTableHeaders();
+               return this;
+       }
+
+       @Override /* GENERATED - HtmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder disableDetectLabelParameters() {
+               super.disableDetectLabelParameters();
+               return this;
+       }
+
+       @Override /* GENERATED - HtmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder disableDetectLinksInStrings() {
+               super.disableDetectLinksInStrings();
+               return this;
+       }
+
+       @Override /* GENERATED - HtmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder labelParameter(String value) {
+               super.labelParameter(value);
+               return this;
+       }
+
+       @Override /* GENERATED - HtmlSerializerBuilder */
+       public HtmlSchemaDocSerializerBuilder uriAnchorText(AnchorText value) {
+               super.uriAnchorText(value);
+               return this;
+       }
+
+       // </FluentSetters>
+}
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
index 406ddbe..6254e15 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.html;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/SystemEnv.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/SystemEnv.java
new file mode 100644
index 0000000..bc5bf89
--- /dev/null
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/SystemEnv.java
@@ -0,0 +1,89 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.internal;
+
+import static org.apache.juneau.internal.ExceptionUtils.*;
+
+import java.nio.charset.*;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.function.*;
+
+/**
+ * Utility methods for accessing system properties and environment variables.
+ */
+public class SystemEnv {
+
+       /**
+        * Looks up a system property or environment variable.
+        *
+        * <p>
+        * First looks in system properties.  Then converts the name to 
env-safe and looks in the system environment.
+        * Then returns the default if it can't be found.
+        *
+        * @param name The property name.
+        * @param def The default value if not found.
+        * @return The default value.
+        */
+       public static <T> T env(String name, T def) {
+               return env(name).map(x -> toType(x, def)).orElse(def);
+       }
+
+       /**
+        * Looks up a system property or environment variable.
+        *
+        * <p>
+        * First looks in system properties.  Then converts the name to 
env-safe and looks in the system environment.
+        * Then returns the default if it can't be found.
+        *
+        * @param name The property name.
+        * @return The value if found.
+        */
+       public static Optional<String> env(String name) {
+               String s = System.getProperty(name);
+               if (s == null)
+                       s = System.getenv(envName(name));
+               return Optional.ofNullable(s);
+       }
+
+       @SuppressWarnings({ "unchecked", "rawtypes" })
+       private static <T> T toType(String s, T def) {
+               if (s == null || def == null)
+                       return null;
+               Class<T> c = (Class<T>)def.getClass();
+               if (c == String.class)
+                       return (T)s;
+               if (c.isEnum())
+                       return (T)Enum.valueOf((Class<? extends Enum>) c, s);
+               Function<String,T> f = (Function<String,T>)ENV_FUNCTIONS.get(c);
+               if (f == null)
+                       throw runtimeException("Invalid env type: {0}", c);
+               return f.apply(s);
+       };
+
+       private static final Map<Class<?>,Function<String,?>> ENV_FUNCTIONS = 
new IdentityHashMap<>();
+       static {
+               ENV_FUNCTIONS.put(Boolean.class, x -> Boolean.valueOf(x));
+               ENV_FUNCTIONS.put(Charset.class, x -> Charset.forName(x));
+       }
+
+       private static final ConcurrentHashMap<String,String> PROPERTY_TO_ENV = 
new ConcurrentHashMap<>();
+       private static String envName(String name) {
+               String name2 = PROPERTY_TO_ENV.get(name);
+               if (name2 == null) {
+                       name2 = name.toUpperCase().replace(".", "_");
+                       PROPERTY_TO_ENV.put(name, name2);
+               }
+               return name2;
+       }
+}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/SystemUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/SystemUtils.java
index b66ce15..ec83ff7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/SystemUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/SystemUtils.java
@@ -41,79 +41,4 @@ public class SystemUtils {
                SHUTDOWN_MESSAGES.add(message);
        }
 
-       /**
-        * Returns the first non-<jk>null</jk> system property.
-        *
-        * @param def
-        *      The default value if none are found.
-        *      Can be <jk>null</jk>.
-        * @param keys
-        *      The system properties to look for.
-        * @return
-        *      The first non-<jk>null</jk> system property, or the default 
value if non were found.
-        */
-       public static String getFirstString(String def, String...keys) {
-               for (String key : keys) {
-                       String v = System.getProperty(key);
-                       if (v != null)
-                               return v;
-               }
-               return def;
-       }
-
-       /**
-        * Returns the first non-<jk>null</jk> boolean system property.
-        *
-        * @param def
-        *      The default value if none are found.
-        *      Can be <jk>null</jk>.
-        * @param keys
-        *      The system properties to look for.
-        * @return
-        *      The first non-<jk>null</jk> system property, or the default 
value if non were found.
-        */
-       public static Boolean getFirstBoolean(Boolean def, String...keys) {
-               String s = getFirstString(null, keys);
-               return s == null ? def : Boolean.parseBoolean(s);
-       }
-
-       /**
-        * Returns the first non-<jk>null</jk> integer system property.
-        *
-        * @param def
-        *      The default value if none are found.
-        *      Can be <jk>null</jk>.
-        * @param keys
-        *      The system properties to look for.
-        * @return
-        *      The first non-<jk>null</jk> system property, or the default 
value if non were found.
-        */
-       public static Integer getFirstInteger(Integer def, String...keys) {
-               String s = getFirstString(null, keys);
-               return s == null ? def : Integer.parseInt(s);
-       }
-
-       /**
-        * Convenience method for setting a system property value.
-        *
-        * @param key The system property key.
-        * @param value The system property value.
-        * @param overwrite Overwrite the previous value if it exists.
-        */
-       public static void setProperty(String key, Object value, boolean 
overwrite) {
-               if (value != null) {
-                       if (System.getProperty(key) == null || overwrite)
-                               System.setProperty(key, 
StringUtils.stringify(value));
-               }
-       }
-
-       /**
-        * Convenience method for setting a system property value.
-        *
-        * @param key The system property key.
-        * @param value The system property value.
-        */
-       public static void setProperty(String key, Object value) {
-               setProperty(key, value, true);
-       }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserBuilder.java
index ef0d782..5269e50 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.json;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
index 18725ad..04f0e0d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.json;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
index 6741db9..ec4f05e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.jsonschema;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
index b433fc7..bd84c0a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.msgpack;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/InputStreamParserBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/InputStreamParserBuilder.java
index 2022f0a..1f08e15 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/InputStreamParserBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/InputStreamParserBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.parser;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserBuilder.java
index 642e064..21afafa 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.parser;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ReaderParserBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ReaderParserBuilder.java
index 74975ac..4c85335 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ReaderParserBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ReaderParserBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.parser;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
index ee0e93f..0a87189 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.serializer;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
index dd663c6..e79a604 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.serializer;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
index 483cb3f..d9a9fed 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.serializer;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserBuilder.java
index ca6d1ca..869ea44 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.uon;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
index 39bbbd3..c127146 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.uon;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
index c2b3987..aa5858e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.urlencoding;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
index 191fc00..d055e6a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.urlencoding;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
index 0fbeee9..4fdc029 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.xml;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
index e787bd7..3817741 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.xml;
 
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
diff --git 
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyLogger.java
 
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyLogger.java
index 52c96f0..1551039 100644
--- 
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyLogger.java
+++ 
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyLogger.java
@@ -13,9 +13,10 @@
 package org.apache.juneau.microservice.jetty;
 
 import static java.util.logging.Level.*;
+import static org.apache.juneau.internal.SystemEnv.*;
+
 import java.util.logging.*;
 
-import org.apache.juneau.internal.*;
 import org.eclipse.jetty.util.log.AbstractLogger;
 
 /**
@@ -37,7 +38,7 @@ import org.eclipse.jetty.util.log.AbstractLogger;
  *
  */
 public class JettyLogger extends AbstractLogger {
-       private static final boolean SHOW_SOURCE = 
SystemUtils.getFirstBoolean(true, "org.eclipse.jetty.util.log.SOURCE", 
"org.eclipse.jetty.util.log.javautil.SOURCE");
+       private static final boolean SHOW_SOURCE = 
env("org.eclipse.jetty.util.log.SOURCE", 
env("org.eclipse.jetty.util.log.javautil.SOURCE", true));
 
        private Level configuredLevel;
        private Logger logger;
diff --git 
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
 
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
index 8e23c59..0067d05 100644
--- 
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
+++ 
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
@@ -12,9 +12,9 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.microservice.jetty;
 
-import static org.apache.juneau.internal.SystemUtils.*;
 import static org.apache.juneau.internal.ExceptionUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
+
 import java.io.*;
 import java.net.*;
 import java.util.*;
@@ -323,7 +323,9 @@ public class JettyMicroservice extends Microservice {
 
                int[] ports = ObjectUtils.firstNonNull(builder.ports, 
cf.getObjectWithDefault("Jetty/port", mf.getWithDefault("Jetty-Port", new 
int[]{8000}, int[].class), int[].class));
                int availablePort = findOpenPort(ports);
-               setProperty("availablePort", availablePort, false);
+
+               if (System.getProperty("availablePort") == null)
+                       System.setProperty("availablePort", 
String.valueOf(availablePort));
 
                String jettyXml = builder.jettyXml;
                String jettyConfig = cf.getString("Jetty/config", 
mf.getString("Jetty-Config", "jetty.xml"));
@@ -382,7 +384,8 @@ public class JettyMicroservice extends Microservice {
                for (Map.Entry<String,Object> e : 
builder.servletAttributes.entrySet())
                        addServletAttribute(e.getKey(), e.getValue());
 
-               setProperty("juneau.serverPort", availablePort, false);
+               if (System.getProperty("juneau.serverPort") == null)
+                       System.setProperty("juneau.serverPort", 
String.valueOf(availablePort));
 
                return server;
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index 840e827..9f008bf 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -22,6 +22,7 @@ import static 
org.apache.juneau.rest.logging.RestLoggingDetail.*;
 import static java.util.Arrays.*;
 import static java.util.Optional.*;
 import static java.util.logging.Level.*;
+import static org.apache.juneau.internal.SystemEnv.*;
 
 import java.lang.annotation.*;
 import java.lang.reflect.Method;
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/BasicRestLogger.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/BasicRestLogger.java
index f602edf..264c5b1 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/BasicRestLogger.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/BasicRestLogger.java
@@ -15,10 +15,6 @@ package org.apache.juneau.rest.logging;
 import static org.apache.juneau.internal.ObjectUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.rest.logging.RestLoggingDetail.*;
-import static org.apache.juneau.Enablement.*;
-import static org.apache.juneau.SystemProperties.*;
-import static java.util.logging.Level.*;
-
 import java.util.*;
 import java.util.function.*;
 import java.util.logging.*;
@@ -108,15 +104,15 @@ public class BasicRestLogger implements RestLogger {
         * @param builder The builder object.
         */
        public BasicRestLogger(RestLogger.Builder builder) {
-               this.logger = firstNonNull(builder.logger, 
Logger.getLogger(getProperty(String.class, SP_logger, "global")));
+               this.logger = builder.logger;
                this.thrownStore = builder.thrownStore;
                this.normalRules = builder.normalRules.toArray(new 
RestLoggerRule[builder.normalRules.size()]);
                this.debugRules = builder.debugRules.toArray(new 
RestLoggerRule[builder.debugRules.size()]);
-               this.enabled = firstNonNull(builder.enabled, 
getProperty(Enablement.class, SP_enabled, ALWAYS));
-               this.enabledTest = firstNonNull(builder.enabledTest, x -> 
false);
-               this.requestDetail = firstNonNull(builder.requestDetail, 
getProperty(RestLoggingDetail.class, SP_requestDetail, STATUS_LINE));
-               this.responseDetail = firstNonNull(builder.responseDetail, 
getProperty(RestLoggingDetail.class, SP_responseDetail, STATUS_LINE));
-               this.level = firstNonNull(builder.level, 
getProperty(Level.class, SP_level, OFF));
+               this.enabled = builder.enabled;
+               this.enabledTest = builder.enabledTest;
+               this.requestDetail = builder.requestDetail;
+               this.responseDetail = builder.responseDetail;
+               this.level = builder.level;
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/RestLogger.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/RestLogger.java
index 003f477..9c0cc48 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/RestLogger.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/RestLogger.java
@@ -12,7 +12,10 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.logging;
 
+import static java.util.logging.Level.*;
 import static org.apache.juneau.Enablement.*;
+import static org.apache.juneau.internal.SystemEnv.*;
+import static org.apache.juneau.rest.logging.RestLoggingDetail.*;
 
 import java.util.*;
 import java.util.function.*;
@@ -161,6 +164,12 @@ public interface RestLogger {
                 */
                protected Builder() {
                        super(BasicRestLogger.class);
+                       logger = Logger.getLogger(env(SP_logger, "global"));
+                       enabled = env(SP_enabled, ALWAYS);
+                       enabledTest = x -> false;
+                       requestDetail = env(SP_requestDetail, STATUS_LINE);
+                       responseDetail = env(SP_responseDetail, STATUS_LINE);
+                       level = env(SP_level).map(Level::parse).orElse(OFF);
                }
 
                /**

Reply via email to