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 e2516d9  Clean up builders.
e2516d9 is described below

commit e2516d93b27665c318091c6477b183641597c25c
Author: JamesBognar <[email protected]>
AuthorDate: Sat Aug 7 18:21:07 2021 -0400

    Clean up builders.
---
 .../main/java/org/apache/juneau/config/Config.java | 292 ++-------------------
 .../org/apache/juneau/config/ConfigBuilder.java    | 194 +++++++-------
 .../juneau/config/store/ConfigClasspathStore.java  |   1 +
 .../config/store/ConfigClasspathStoreBuilder.java  |   1 +
 .../juneau/config/store/ConfigFileStore.java       |   1 +
 .../config/store/ConfigFileStoreBuilder.java       |  13 +-
 .../juneau/config/store/ConfigMemoryStore.java     |   1 +
 .../config/store/ConfigMemoryStoreBuilder.java     |   1 +
 .../apache/juneau/config/store/ConfigStore.java    |   1 +
 .../juneau/config/store/ConfigStoreBuilder.java    |   1 +
 .../java/org/apache/juneau/ContextBuilder.java     |   8 +-
 11 files changed, 151 insertions(+), 363 deletions(-)

diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java
index a6572be..5f7360f 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java
@@ -26,7 +26,6 @@ import java.util.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.collections.*;
-import org.apache.juneau.config.encode.*;
 import org.apache.juneau.config.encode.ConfigEncoder;
 import org.apache.juneau.config.event.*;
 import org.apache.juneau.config.internal.*;
@@ -39,6 +38,7 @@ import org.apache.juneau.svl.*;
 
 /**
  * Main configuration API class.
+ * {@review}
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc juneau-config}
@@ -149,259 +149,20 @@ public final class Config extends Context implements 
ConfigEventListener, Writab
        }
 
        
//-------------------------------------------------------------------------------------------------------------------
-       // Configurable properties
-       
//-------------------------------------------------------------------------------------------------------------------
-
-       static final String PREFIX = "Config";
-
-       /**
-        * Configuration property:  Configuration name.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_name CONFIG_name}
-        *      <li><b>Name:</b>  <js>"Config.name.s"</js>
-        *      <li><b>Data type:</b>  <c>String</c>
-        *      <li><b>System property:</b>  <c>Config.name</c>
-        *      <li><b>Environment variable:</b>  <c>CONFIG_NAME</c>
-        *      <li><b>Default:</b>  <js>"Configuration.cfg"</js>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
ConfigBuilder#name(String)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * Specifies the configuration name.
-        * <br>This is typically the configuration file name, although
-        * the name can be anything identifiable by the {@link ConfigStore} 
used for retrieving and storing the configuration.
-        */
-       public static final String CONFIG_name = PREFIX + ".name.s";
-
-       /**
-        * Configuration property:  Configuration store.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_store CONFIG_store}
-        *      <li><b>Name:</b>  <js>"Config.store.o"</js>
-        *      <li><b>Data type:</b>  {@link 
org.apache.juneau.config.store.ConfigStore}
-        *      <li><b>Default:</b>  {@link 
org.apache.juneau.config.store.ConfigFileStore#DEFAULT}
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#store(ConfigStore)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * The configuration store used for retrieving and storing 
configurations.
-        */
-       public static final String CONFIG_store = PREFIX + ".store.o";
-
-       /**
-        * Configuration property:  POJO serializer.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_serializer CONFIG_serializer}
-        *      <li><b>Name:</b>  <js>"Config.serializer.o"</js>
-        *      <li><b>Data type:</b>  {@link 
org.apache.juneau.serializer.WriterSerializer}
-        *      <li><b>Default:</b>  {@link 
org.apache.juneau.json.SimpleJsonSerializer#DEFAULT}
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#serializer(Class)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#serializer(WriterSerializer)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * The serializer to use for serializing POJO values.
-        */
-       public static final String CONFIG_serializer = PREFIX + ".serializer.o";
-
-       /**
-        * Configuration property:  POJO parser.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_parser CONFIG_parser}
-        *      <li><b>Name:</b>  <js>"Config.parser.o"</js>
-        *      <li><b>Data type:</b>  {@link 
org.apache.juneau.parser.ReaderParser}
-        *      <li><b>Default:</b>  {@link 
org.apache.juneau.json.JsonParser#DEFAULT}
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#parser(Class)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#parser(ReaderParser)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * The parser to use for parsing values to POJOs.
-        */
-       public static final String CONFIG_parser = PREFIX + ".parser.o";
-
-       /**
-        * Configuration property:  Value encoder.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_encoder CONFIG_encoder}
-        *      <li><b>Name:</b>  <js>"Config.encoder.o"</js>
-        *      <li><b>Data type:</b>  {@link 
org.apache.juneau.config.encode.ConfigEncoder}
-        *      <li><b>Default:</b>  {@link 
org.apache.juneau.config.encode.ConfigXorEncoder#INSTANCE}
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#encoder(Class)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#encoder(ConfigEncoder)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * The encoder to use for encoding encoded configuration values.
-        */
-       public static final String CONFIG_encoder = PREFIX + ".encoder.o";
-
-       /**
-        * Configuration property:  SVL variable resolver.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_varResolver CONFIG_varResolver}
-        *      <li><b>Name:</b>  <js>"Config.varResolver.o"</js>
-        *      <li><b>Data type:</b>  {@link org.apache.juneau.svl.VarResolver}
-        *      <li><b>Default:</b>  {@link 
org.apache.juneau.svl.VarResolver#DEFAULT}
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#varResolver(Class)}
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#varResolver(VarResolver)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * The resolver to use for resolving SVL variables.
-        */
-       public static final String CONFIG_varResolver = PREFIX + 
".varResolver.o";
-
-       /**
-        * Configuration property:  Binary value line length.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_binaryLineLength CONFIG_binaryLineLength}
-        *      <li><b>Name:</b>  <js>"Config.binaryLineLength.i"</js>
-        *      <li><b>Data type:</b>  <jk>int</jk>
-        *      <li><b>System property:</b>  <c>Config.binaryLineLength</c>
-        *      <li><b>Environment variable:</b>  <c>CONFIG_BINARYLINELENGTH</c>
-        *      <li><b>Default:</b>  <c>-1</c>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#binaryLineLength(int)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * When serializing binary values, lines will be split after this many 
characters.
-        * <br>Use <c>-1</c> to represent no line splitting.
-        */
-       public static final String CONFIG_binaryLineLength = PREFIX + 
".binaryLineLength.i";
-
-       /**
-        * Configuration property:  Binary value format.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_binaryFormat CONFIG_binaryFormat}
-        *      <li><b>Name:</b>  <js>"Config.binaryFormat.s"</js>
-        *      <li><b>Data type:</b>  {@link org.apache.juneau.BinaryFormat}
-        *      <li><b>System property:</b>  <c>Config.binaryFormat</c>
-        *      <li><b>Environment variable:</b>  <c>CONFIG_BINARYFORMAT</c>
-        *      <li><b>Default:</b>  {@link 
org.apache.juneau.BinaryFormat#BASE64}
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#binaryFormat(BinaryFormat)}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * The format to use when persisting byte arrays.
-        *
-        * <p>
-        * Possible values:
-        * <ul>
-        *      <li>{@link BinaryFormat#BASE64} - BASE64-encoded string.
-        *      <li>{@link BinaryFormat#HEX} - Hexadecimal.
-        *      <li>{@link BinaryFormat#SPACED_HEX} - Hexadecimal with spaces 
between bytes.
-        * </ul>
-        */
-       public static final String CONFIG_binaryFormat = PREFIX + 
".binaryFormat.s";
-
-       /**
-        * Configuration property:  Multi-line values should always be on 
separate lines.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_multiLineValuesOnSeparateLines 
CONFIG_multiLineValuesOnSeparateLines}
-        *      <li><b>Name:</b>  
<js>"Config.multiLineValuesOnSeparateLines.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  
<c>Config.multiLineValuesOnSeparateLine</c>
-        *      <li><b>Environment variable:</b>  
<c>CONFIG_MULTILINEVALUESONSEPARATELINE</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#multiLineValuesOnSeparateLines()}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * When enabled, multi-line values will always be placed on a separate 
line from the key.
-        */
-       public static final String CONFIG_multiLineValuesOnSeparateLines = 
PREFIX + ".multiLineValuesOnSeparateLines.b";
-
-       /**
-        * Configuration property:  Read-only.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.config.Config#CONFIG_readOnly CONFIG_readOnly}
-        *      <li><b>Name:</b>  <js>"Config.readOnly.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  <c>Config.readOnly</c>
-        *      <li><b>Environment variable:</b>  <c>CONFIG_READONLY</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#readOnly()}
-        *              </ul>
-        * </ul>
-        *
-        * <h5 class='section'>Description:</h5>
-        * <p>
-        * When enabled, attempts to call any setters on this object will throw 
an {@link UnsupportedOperationException}.
-        */
-       public static final String CONFIG_readOnly = PREFIX + ".readOnly.b";
-
-       
//-------------------------------------------------------------------------------------------------------------------
        // Instance
        
//-------------------------------------------------------------------------------------------------------------------
 
-       private final String name;
-       private final ConfigStore store;
-       private final WriterSerializer serializer;
-       private final ReaderParser parser;
-       private final ConfigEncoder encoder;
+       final String name;
+       final ConfigStore store;
+       final WriterSerializer serializer;
+       final ReaderParser parser;
+       final ConfigEncoder encoder;
+       final VarResolver varResolver;
+       final int binaryLineLength;
+       final BinaryFormat binaryFormat;
+       final boolean multiLineValuesOnSeparateLines, readOnly;
+
        private final VarResolverSession varSession;
-       private final int binaryLineLength;
-       private final BinaryFormat binaryFormat;
-       private final boolean multiLineValuesOnSeparateLines, readOnly;
        private final ConfigMap configMap;
        private final BeanSession beanSession;
        private final List<ConfigEventListener> listeners = 
Collections.synchronizedList(new LinkedList<ConfigEventListener>());
@@ -440,31 +201,31 @@ public final class Config extends Context implements 
ConfigEventListener, Writab
        /**
         * Constructor.
         *
-        * @param cp
-        *      The property store containing all the settings for this object.
+        * @param builder The builder for this object.
         * @throws IOException Thrown by underlying stream.
         */
-       public Config(ContextProperties cp) throws IOException {
-               super(cp, true);
+       public Config(ConfigBuilder builder) throws IOException {
+               super(builder);
 
-               name = cp.getString(CONFIG_name).orElse("Configuration.cfg");
-               store = cp.getInstance(CONFIG_store, 
ConfigStore.class).orElse(ConfigFileStore.DEFAULT);
+               name = builder.name;
+               store = builder.store;
                configMap = store.getMap(name);
                configMap.register(this);
-               serializer = cp.getInstance(CONFIG_serializer, 
WriterSerializer.class).orElse(SimpleJsonSerializer.DEFAULT);
-               parser = cp.getInstance(CONFIG_parser, 
ReaderParser.class).orElse(JsonParser.DEFAULT);
+               serializer = builder.serializer;
+               parser = builder.parser;
                beanSession = parser.createBeanSession();
-               encoder = cp.getInstance(CONFIG_encoder, 
ConfigEncoder.class).orElse(ConfigXorEncoder.INSTANCE);
-               varSession = cp.getInstance(CONFIG_varResolver, 
VarResolver.class).orElse(VarResolver.DEFAULT)
+               encoder = builder.encoder;
+               varResolver = builder.varResolver;
+               varSession = varResolver
                        .copy()
                        .vars(ConfigVar.class)
                        .bean(Config.class, this)
                        .build()
                        .createSession();
-               binaryLineLength = 
cp.getInteger(CONFIG_binaryLineLength).orElse(-1);
-               binaryFormat = cp.get(CONFIG_binaryFormat, 
BinaryFormat.class).orElse(BinaryFormat.BASE64);
-               multiLineValuesOnSeparateLines = 
getBoolean(CONFIG_multiLineValuesOnSeparateLines, false);
-               readOnly = getBoolean(CONFIG_readOnly, false);
+               binaryLineLength = builder.binaryLineLength;
+               binaryFormat = builder.binaryFormat;
+               multiLineValuesOnSeparateLines = 
builder.multiLineValuesOnSeparateLines;
+               readOnly = builder.readOnly;
        }
 
        Config(Config copyFrom, VarResolverSession varSession) {
@@ -476,6 +237,7 @@ public final class Config extends Context implements 
ConfigEventListener, Writab
                serializer = copyFrom.serializer;
                parser = copyFrom.parser;
                encoder = copyFrom.encoder;
+               varResolver = copyFrom.varResolver;
                this.varSession = varSession;
                binaryLineLength = copyFrom.binaryLineLength;
                binaryFormat = copyFrom.binaryFormat;
@@ -1000,7 +762,7 @@ public final class Config extends Context implements 
ConfigEventListener, Writab
         * </p>
         *
         * <p>
-        * Byte arrays are stored as encoded strings, typically BASE64, but 
dependent on the {@link #CONFIG_binaryFormat} setting.
+        * Byte arrays are stored as encoded strings, typically BASE64, but 
dependent on the {@link ConfigBuilder#binaryFormat(BinaryFormat)} setting.
         *
         * @param key The key.
         * @return The value, or <jk>null</jk> if the section or key does not 
exist.
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 e4ca351..72801c2 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
@@ -12,8 +12,9 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.config;
 
-import static org.apache.juneau.config.Config.*;
+import static org.apache.juneau.internal.ExceptionUtils.*;
 
+import java.io.*;
 import java.lang.reflect.*;
 import java.util.*;
 
@@ -29,6 +30,7 @@ import org.apache.juneau.svl.*;
 
 /**
  * Builder for creating instances of {@link Config Configs}.
+ * {@review}
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bcode w800'>
@@ -43,11 +45,31 @@ import org.apache.juneau.svl.*;
 @FluentSetters
 public class ConfigBuilder extends ContextBuilder {
 
+       String name;
+       ConfigStore store;
+       WriterSerializer serializer;
+       ReaderParser parser;
+       ConfigEncoder encoder;
+       VarResolver varResolver;
+       int binaryLineLength;
+       BinaryFormat binaryFormat;
+       boolean multiLineValuesOnSeparateLines, readOnly;
+
        /**
         * Constructor, default settings.
         */
        public ConfigBuilder() {
                super();
+               name = env("Config.name", "Configuration.cfg");
+               store = ConfigFileStore.DEFAULT;
+               serializer = SimpleJsonSerializer.DEFAULT;
+               parser = JsonParser.DEFAULT;
+               encoder = ConfigXorEncoder.INSTANCE;
+               varResolver = VarResolver.DEFAULT;
+               binaryLineLength = env("Config.binaryLineLength", -1);
+               binaryFormat = env("Config.binaryFormat", BinaryFormat.BASE64);
+               multiLineValuesOnSeparateLines = 
env("Config.multiLineValuesOnSeparateLines", false);
+               readOnly = env("Config.readOnly", false);
        }
 
        /**
@@ -57,11 +79,25 @@ public class ConfigBuilder extends ContextBuilder {
         */
        public ConfigBuilder(Config copyFrom) {
                super(copyFrom);
+               name = copyFrom.name;
+               store = copyFrom.store;
+               serializer = copyFrom.serializer;
+               parser = copyFrom.parser;
+               encoder = copyFrom.encoder;
+               varResolver = copyFrom.varResolver;
+               binaryLineLength = copyFrom.binaryLineLength;
+               binaryFormat = copyFrom.binaryFormat;
+               multiLineValuesOnSeparateLines = 
copyFrom.multiLineValuesOnSeparateLines;
+               readOnly = copyFrom.readOnly;
        }
 
        @Override /* ContextBuilder */
        public Config build() {
-               return build(Config.class);
+               try {
+                       return new Config(this);
+               } catch (IOException e) {
+                       throw runtimeException(e);
+               }
        }
 
 
@@ -70,7 +106,7 @@ public class ConfigBuilder extends ContextBuilder {
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  Configuration 
name.
+        * Configuration name.
         *
         * <p>
         * Specifies the configuration name.
@@ -79,15 +115,21 @@ public class ConfigBuilder extends ContextBuilder {
         *
         * @param value
         *      The new value for this property.
-        *      <br>The default is <js>"Configuration"</js>.
+        *      <br>The default is the first value found:
+        *      <ul>
+        *              <li>System property <js>"Config.name"
+        *              <li>Environment variable <js>"CONFIG_NAME"
+        *              <li><js>"Configuration.cfg"</js>
+        *      </ul>
         * @return This object (for method chaining).
         */
        public ConfigBuilder name(String value) {
-               return set(CONFIG_name, value);
+               name = value;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  Configuration 
store.
+        * Configuration store.
         *
         * <p>
         * The configuration store used for retrieving and storing 
configurations.
@@ -98,11 +140,12 @@ public class ConfigBuilder extends ContextBuilder {
         * @return This object (for method chaining).
         */
        public ConfigBuilder store(ConfigStore value) {
-               return set(CONFIG_store, value);
+               store = value;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  Configuration 
store.
+        * Configuration store.
         *
         * <p>
         * Convenience method for calling 
<code>store(ConfigMemoryStore.<jsf>DEFAULT</jsf>)</code>.
@@ -110,41 +153,28 @@ public class ConfigBuilder extends ContextBuilder {
         * @return This object (for method chaining).
         */
        public ConfigBuilder memStore() {
-               return set(CONFIG_store, ConfigMemoryStore.DEFAULT);
+               store = ConfigMemoryStore.DEFAULT;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  POJO serializer.
+        * POJO serializer.
         *
         * <p>
         * The serializer to use for serializing POJO values.
         *
         * @param value
         *      The new value for this property.
-        *      <br>The default is {@link SimpleJsonSerializer#DEFAULT}.
+        *      <br>The default is {@link SimpleJsonSerializer#DEFAULT}
         * @return This object (for method chaining).
         */
        public ConfigBuilder serializer(WriterSerializer value) {
-               return set(CONFIG_serializer, value);
+               serializer = value;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  POJO serializer.
-        *
-        * <p>
-        * The serializer to use for serializing POJO values.
-        *
-        * @param value
-        *      The new value for this property.
-        *      <br>The default is {@link SimpleJsonSerializer#DEFAULT}.
-        * @return This object (for method chaining).
-        */
-       public ConfigBuilder serializer(Class<? extends WriterSerializer> 
value) {
-               return set(CONFIG_serializer, value);
-       }
-
-       /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  POJO parser.
+        * POJO parser.
         *
         * <p>
         * The parser to use for parsing values to POJOs.
@@ -155,26 +185,12 @@ public class ConfigBuilder extends ContextBuilder {
         * @return This object (for method chaining).
         */
        public ConfigBuilder parser(ReaderParser value) {
-               return set(CONFIG_parser, value);
-       }
-
-       /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  POJO parser.
-        *
-        * <p>
-        * The parser to use for parsing values to POJOs.
-        *
-        * @param value
-        *      The new value for this property.
-        *      <br>The default is {@link JsonParser#DEFAULT}.
-        * @return This object (for method chaining).
-        */
-       public ConfigBuilder parser(Class<? extends ReaderParser> value) {
-               return set(CONFIG_parser, value);
+               parser = value;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  Value encoder.
+        * Value encoder.
         *
         * <p>
         * The encoder to use for encoding encoded configuration values.
@@ -185,26 +201,12 @@ public class ConfigBuilder extends ContextBuilder {
         * @return This object (for method chaining).
         */
        public ConfigBuilder encoder(ConfigEncoder value) {
-               return set(CONFIG_encoder, value);
-       }
-
-       /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  Value encoder.
-        *
-        * <p>
-        * The encoder to use for encoding encoded configuration values.
-        *
-        * @param value
-        *      The new value for this property.
-        *      <br>The default is {@link ConfigXorEncoder#INSTANCE}.
-        * @return This object (for method chaining).
-        */
-       public ConfigBuilder encoder(Class<? extends ConfigEncoder> value) {
-               return set(CONFIG_encoder, value);
+               encoder = value;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  SVL variable 
resolver.
+        * SVL variable resolver.
         *
         * <p>
         * The resolver to use for resolving SVL variables.
@@ -215,26 +217,12 @@ public class ConfigBuilder extends ContextBuilder {
         * @return This object (for method chaining).
         */
        public ConfigBuilder varResolver(VarResolver value) {
-               return set(CONFIG_varResolver, value);
-       }
-
-       /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  SVL variable 
resolver.
-        *
-        * <p>
-        * The resolver to use for resolving SVL variables.
-        *
-        * @param value
-        *      The new value for this property.
-        *      <br>The default is {@link VarResolver#DEFAULT}.
-        * @return This object (for method chaining).
-        */
-       public ConfigBuilder varResolver(Class<? extends VarResolver> value) {
-               return set(CONFIG_varResolver, value);
+               varResolver = value;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  Binary value 
line length.
+        * Binary value line length.
         *
         * <p>
         * When serializing binary values, lines will be split after this many 
characters.
@@ -242,15 +230,21 @@ public class ConfigBuilder extends ContextBuilder {
         *
         * @param value
         *      The new value for this property.
-        *      <br>The default is <c>-1</c>.
+        *      <br>The default is the first value found:
+        *      <ul>
+        *              <li>System property <js>"Config.binaryLineLength"
+        *              <li>Environment variable <js>"CONFIG_BINARYLINELENGTH"
+        *              <li><c>-1</c>
+        *      </ul>
         * @return This object (for method chaining).
         */
        public ConfigBuilder binaryLineLength(int value) {
-               return set(CONFIG_binaryLineLength, value);
+               binaryLineLength = value;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  Binary value 
format.
+        * Binary value format.
         *
         * <p>
         * The format to use when persisting byte arrays.
@@ -265,35 +259,59 @@ public class ConfigBuilder extends ContextBuilder {
         *
         * @param value
         *      The new value for this property.
-        *      <br>The default is {@link BinaryFormat#BASE64}.
+        *      <br>The default is the first value found:
+        *      <ul>
+        *              <li>System property <js>"Config.binaryFormat"
+        *              <li>Environment variable <js>"CONFIG_BINARYFORMAT"
+        *              <li>{@link BinaryFormat#BASE64}
+        *      </ul>
         * @return This object (for method chaining).
         */
        public ConfigBuilder binaryFormat(BinaryFormat value) {
-               return set(CONFIG_binaryFormat, value);
+               binaryFormat = value;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  Multi-line 
values on separate lines.
+        * Multi-line values on separate lines.
         *
         * <p>
         * When enabled, multi-line values will always be placed on a separate 
line from the key.
         *
+        * <p>
+        * The default is the first value found:
+        *      <ul>
+        *              <li>System property 
<js>"Config.multiLineValuesOnSeparateLine"
+        *              <li>Environment variable 
<js>"CONFIG_MULTILINEVALUESONSEPARATELINE"
+        *              <li><jk>false</jk>
+        *      </ul>
+        *
         * @return This object (for method chaining).
         */
        public ConfigBuilder multiLineValuesOnSeparateLines() {
-               return set(CONFIG_multiLineValuesOnSeparateLines);
+               multiLineValuesOnSeparateLines = true;
+               return this;
        }
 
        /**
-        * <i><l>Config</l> configuration property:&emsp;</i>  Beans on 
separate lines.
+        * Read-only mode.
         *
         * <p>
         * When enabled, attempts to call any setters on this object will throw 
an {@link UnsupportedOperationException}.
         *
+        * <p>
+        *      The default is the first value found:
+        *      <ul>
+        *              <li>System property <js>"Config.readOnly"
+        *              <li>Environment variable <js>"CONFIG_READONLY"
+        *              <li><jk>false</jk>
+        *      </ul>
+        *
         * @return This object (for method chaining).
         */
        public ConfigBuilder readOnly() {
-               return set(CONFIG_readOnly);
+               readOnly = true;
+               return this;
        }
 
        // <FluentSetters>
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStore.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStore.java
index a3c61a9..6664fb8 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStore.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStore.java
@@ -23,6 +23,7 @@ import org.apache.juneau.internal.*;
 
 /**
  * Classpath-based storage location for configuration files.
+ * {@review}
  *
  * <p>
  * Looks inside the JVM classpath for configuration files.
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStoreBuilder.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStoreBuilder.java
index a9d6382..286bf6a 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStoreBuilder.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStoreBuilder.java
@@ -22,6 +22,7 @@ import org.apache.juneau.svl.*;
 
 /**
  * Builder for {@link ConfigClasspathStore} objects.
+ * {@review}
  */
 @FluentSetters
 public class ConfigClasspathStoreBuilder extends ConfigStoreBuilder {
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
index 6f7d626..d5cbc99 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
@@ -30,6 +30,7 @@ import org.apache.juneau.internal.*;
 
 /**
  * Filesystem-based storage location for configuration files.
+ * {@review}
  *
  * <p>
  * Points to a file system directory containing configuration files.
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 23aa4b3..66b9127 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
@@ -24,6 +24,7 @@ import org.apache.juneau.svl.*;
 
 /**
  * Builder for {@link ConfigFileStore} objects.
+ * {@review}
  */
 @FluentSetters
 public class ConfigFileStoreBuilder extends ConfigStoreBuilder {
@@ -38,12 +39,12 @@ public class ConfigFileStoreBuilder extends 
ConfigStoreBuilder {
         */
        public ConfigFileStoreBuilder() {
                super();
-               directory = env(String.class, "ConfigFileStore.directory", ".");
-               charset = env(Charset.class, "ConfigFileStore.charset", 
Charset.defaultCharset());
-               enableWatcher = env(Boolean.class, 
"ConfigFileStore.enableWatcher", false);
-               watcherSensitivity = env(WatcherSensitivity.class, 
"ConfigFileStore.watcherSensitivity", WatcherSensitivity.MEDIUM);
-               updateOnWrite = env(Boolean.class, 
"ConfigFileStore.updateOnWrite", false);
-               extensions = env(String.class, "ConfigFileStore.extensions", 
"cfg");
+               directory = env("ConfigFileStore.directory", ".");
+               charset = env("ConfigFileStore.charset", 
Charset.defaultCharset());
+               enableWatcher = env("ConfigFileStore.enableWatcher", false);
+               watcherSensitivity = env("ConfigFileStore.watcherSensitivity", 
WatcherSensitivity.MEDIUM);
+               updateOnWrite = env("ConfigFileStore.updateOnWrite", false);
+               extensions = env("ConfigFileStore.extensions", "cfg");
        }
 
        /**
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStore.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStore.java
index 3408556..a463d2b 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStore.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStore.java
@@ -22,6 +22,7 @@ import org.apache.juneau.collections.*;
 
 /**
  * Filesystem-based storage location for configuration files.
+ * {@review}
  *
  * <p>
  * Points to a file system directory containing configuration files.
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStoreBuilder.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStoreBuilder.java
index 5e93834..4f04255 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStoreBuilder.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStoreBuilder.java
@@ -22,6 +22,7 @@ import org.apache.juneau.svl.*;
 
 /**
  * Builder for {@link ConfigMemoryStore} objects.
+ * {@review}
  */
 @FluentSetters
 public class ConfigMemoryStoreBuilder extends ConfigStoreBuilder {
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStore.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStore.java
index 8d7f9ff..7be7427 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStore.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStore.java
@@ -23,6 +23,7 @@ import org.apache.juneau.config.internal.*;
 
 /**
  * Represents a storage location for configuration files.
+ * {@review}
  *
  * <p>
  * Content stores require two methods to be implemented:
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStoreBuilder.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStoreBuilder.java
index 47bc730..b2384a5 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStoreBuilder.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStoreBuilder.java
@@ -22,6 +22,7 @@ import org.apache.juneau.svl.*;
 
 /**
  * Base builder class for {@link ConfigStore} objects.
+ * {@review}
  */
 @FluentSetters
 public abstract class ConfigStoreBuilder extends ContextBuilder {
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 b2b14dd..ed2ea08 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
@@ -60,7 +60,7 @@ public abstract class ContextBuilder {
         */
        public ContextBuilder() {
                this.cpb = ContextProperties.create();
-               debug = env(Boolean.class, CONTEXT_debug, false);
+               debug = env("Context.debug", false);
        }
 
        /**
@@ -70,7 +70,7 @@ public abstract class ContextBuilder {
         */
        public ContextBuilder(Context copyFrom) {
                this.cpb = copyFrom == null ? ContextProperties.DEFAULT.copy() 
: copyFrom.properties.copy();
-               this.debug = copyFrom == null ? env(Boolean.class, 
CONTEXT_debug, false) : copyFrom.debug;
+               this.debug = copyFrom == null ? env("Context.debug", false) : 
copyFrom.debug;
        }
 
        /**
@@ -877,18 +877,18 @@ public abstract class ContextBuilder {
         * 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 c The value type.
         * @param name The property name.
         * @param def The default value if not found.
         * @return The default value.
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
-       protected <T> T env(Class<T> c, String name, T def) {
+       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);

Reply via email to