[TEXT-122 ]Allow full customization with new API org.apache.commons.text.lookup.StringLookupFactory.interpolatorStringLookup(Map<String, StringLookup>, StringLookup, boolean).
Project: http://git-wip-us.apache.org/repos/asf/commons-text/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-text/commit/faa9a23e Tree: http://git-wip-us.apache.org/repos/asf/commons-text/tree/faa9a23e Diff: http://git-wip-us.apache.org/repos/asf/commons-text/diff/faa9a23e Branch: refs/heads/release Commit: faa9a23e89f3a7f30f9c7503319b439b93ac64ee Parents: 49db4cb Author: Gary Gregory <garydgreg...@gmail.com> Authored: Thu Apr 19 11:58:24 2018 -0600 Committer: Gary Gregory <garydgreg...@gmail.com> Committed: Thu Apr 19 11:58:24 2018 -0600 ---------------------------------------------------------------------- src/changes/changes.xml | 1 + .../text/lookup/InterpolatorStringLookup.java | 314 +++++++------- .../text/lookup/StringLookupFactory.java | 412 ++++++++++--------- ...titutorWithInterpolatorStringLookupTest.java | 28 ++ 4 files changed, 414 insertions(+), 341 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-text/blob/faa9a23e/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 22c9896..d97ead2 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -48,6 +48,7 @@ The <action> type attribute can be add,update,fix,remove. <release version="1.4" date="2018-MM-DD" description="Release 1.4"> <action issue="TEXT-119" type="fix" dev="pschumacher">Remove mention of SQL escaping from user guide</action> <action issue="TEXT-121" type="update" dev="ggregory" due-to="pschumacher">Update Java requirement from version 7 to 8.</action> + <action issue="TEXT-122" type="update" dev="ggregory">Allow full customization with new API org.apache.commons.text.lookup.StringLookupFactory.interpolatorStringLookup(Map<String, StringLookup>, StringLookup, boolean).</action> </release> <release version="1.3" date="2018-03-16" description="Release 1.3"> http://git-wip-us.apache.org/repos/asf/commons-text/blob/faa9a23e/src/main/java/org/apache/commons/text/lookup/InterpolatorStringLookup.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/text/lookup/InterpolatorStringLookup.java b/src/main/java/org/apache/commons/text/lookup/InterpolatorStringLookup.java index 798c234..e5c16a0 100644 --- a/src/main/java/org/apache/commons/text/lookup/InterpolatorStringLookup.java +++ b/src/main/java/org/apache/commons/text/lookup/InterpolatorStringLookup.java @@ -1,149 +1,165 @@ -/* - * 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.commons.text.lookup; - -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -/** - * Proxies other {@link StringLookup}s using a keys within ${} markers using the format "${StringLookup:Key}". - * <p> - * The following lookups are used by default: - * </p> - * <ul> - * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> - * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> - * <li>"java" for the {@link JavaPlatformStringLookup}.</li> - * <li>"date" for the {@link DateStringLookup}.</li> - * </ul> - */ -class InterpolatorStringLookup extends AbstractStringLookup { - - /** Constant for the prefix separator. */ - private static final char PREFIX_SEPARATOR = ':'; - - /** The default string lookup. */ - private final StringLookup defaultStringLookup; - - /** The map of String lookups keyed by prefix. */ - private final Map<String, StringLookup> stringLookupMap = new HashMap<>(); - - /** - * Creates an instance using only lookups that work without initial properties and are stateless. - * <p> - * The following lookups are installed: - * </p> - * <ul> - * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> - * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> - * <li>"java" for the {@link JavaPlatformStringLookup}.</li> - * <li>"date" for the {@link DateStringLookup}.</li> - * </ul> - */ - InterpolatorStringLookup() { - this((Map<String, String>) null); - } - - /** - * Creates an instance using only lookups that work without initial properties and are stateless. - * <p> - * The following lookups are installed: - * </p> - * <ul> - * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> - * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> - * <li>"java" for the {@link JavaPlatformStringLookup}.</li> - * <li>"date" for the {@link DateStringLookup}.</li> - * </ul> - * - * @param <V> - * the map's value type. - * @param defaultMap - * the default map for string lookups. - */ - <V> InterpolatorStringLookup(final Map<String, V> defaultMap) { - this(MapStringLookup.on(defaultMap == null ? new HashMap<String, V>() : defaultMap)); - stringLookupMap.put("sys", SystemPropertyStringLookup.INSTANCE); - stringLookupMap.put("env", EnvironmentVariableStringLookup.INSTANCE); - stringLookupMap.put("java", JavaPlatformStringLookup.INSTANCE); - stringLookupMap.put("date", DateStringLookup.INSTANCE); - stringLookupMap.put("localhost", LocalHostStringLookup.INSTANCE); - } - - /** - * Creates an instance with the given lookup. - * - * @param defaultStringLookup - * the default lookup. - */ - InterpolatorStringLookup(final StringLookup defaultStringLookup) { - this.defaultStringLookup = defaultStringLookup; - } - - /** - * Gets the lookup map. - * - * @return the lookup map. - */ - public Map<String, StringLookup> getStringLookupMap() { - return stringLookupMap; - } - - /** - * Resolves the specified variable. This implementation will try to extract a variable prefix from the given - * variable name (the first colon (':') is used as prefix separator). It then passes the name of the variable with - * the prefix stripped to the lookup object registered for this prefix. If no prefix can be found or if the - * associated lookup object cannot resolve this variable, the default lookup object will be used. - * - * @param var - * the name of the variable whose value is to be looked up - * @return the value of this variable or <b>null</b> if it cannot be resolved - */ - @Override - public String lookup(String var) { - if (var == null) { - return null; - } - - final int prefixPos = var.indexOf(PREFIX_SEPARATOR); - if (prefixPos >= 0) { - final String prefix = var.substring(0, prefixPos).toLowerCase(Locale.US); - final String name = var.substring(prefixPos + 1); - final StringLookup lookup = stringLookupMap.get(prefix); - String value = null; - if (lookup != null) { - value = lookup.lookup(name); - } - - if (value != null) { - return value; - } - var = var.substring(prefixPos + 1); - } - if (defaultStringLookup != null) { - return defaultStringLookup.lookup(var); - } - return null; - } - - @Override - public String toString() { - return getClass().getName() + " [stringLookupMap=" + stringLookupMap + ", defaultStringLookup=" - + defaultStringLookup + "]"; - } -} +/* + * 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.commons.text.lookup; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Proxies other {@link StringLookup}s using a keys within ${} markers using the format "${StringLookup:Key}". + * <p> + * The following lookups are used by default: + * </p> + * <ul> + * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> + * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> + * <li>"java" for the {@link JavaPlatformStringLookup}.</li> + * <li>"date" for the {@link DateStringLookup}.</li> + * </ul> + */ +class InterpolatorStringLookup extends AbstractStringLookup { + + /** Constant for the prefix separator. */ + private static final char PREFIX_SEPARATOR = ':'; + + /** The default string lookup. */ + private final StringLookup defaultStringLookup; + + /** The map of String lookups keyed by prefix. */ + private final Map<String, StringLookup> stringLookupMap; + + /** + * Creates an instance using only lookups that work without initial properties and are stateless. + * <p> + * The following lookups are installed: + * </p> + * <ul> + * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> + * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> + * <li>"java" for the {@link JavaPlatformStringLookup}.</li> + * <li>"date" for the {@link DateStringLookup}.</li> + * </ul> + */ + InterpolatorStringLookup() { + this((Map<String, String>) null); + } + + /** + * Creates an instance using only lookups that work without initial properties and are stateless. + * <p> + * The following lookups are installed: + * </p> + * <ul> + * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> + * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> + * <li>"java" for the {@link JavaPlatformStringLookup}.</li> + * <li>"date" for the {@link DateStringLookup}.</li> + * </ul> + * + * @param <V> + * the map's value type. + * @param defaultMap + * the default map for string lookups. + */ + <V> InterpolatorStringLookup(final Map<String, V> defaultMap) { + this(MapStringLookup.on(defaultMap == null ? new HashMap<String, V>() : defaultMap)); + } + + /** + * Creates an instance with the given lookup. + * + * @param defaultStringLookup + * the default lookup. + */ + InterpolatorStringLookup(final StringLookup defaultStringLookup) { + this(new HashMap<>(), defaultStringLookup, true); + } + + /** + * Creates a fully customized instance. + */ + InterpolatorStringLookup(final Map<String, StringLookup> stringLookupMap, final StringLookup defaultStringLookup, + final boolean addDefaultLookups) { + super(); + this.defaultStringLookup = defaultStringLookup; + this.stringLookupMap = new HashMap<>(stringLookupMap.size()); + for (final Entry<String, StringLookup> entry : stringLookupMap.entrySet()) { + this.stringLookupMap.put(entry.getKey().toLowerCase(Locale.ROOT), entry.getValue()); + } + if (addDefaultLookups) { + this.stringLookupMap.put("sys", SystemPropertyStringLookup.INSTANCE); + this.stringLookupMap.put("env", EnvironmentVariableStringLookup.INSTANCE); + this.stringLookupMap.put("java", JavaPlatformStringLookup.INSTANCE); + this.stringLookupMap.put("date", DateStringLookup.INSTANCE); + this.stringLookupMap.put("localhost", LocalHostStringLookup.INSTANCE); + } + } + + /** + * Gets the lookup map. + * + * @return the lookup map. + */ + public Map<String, StringLookup> getStringLookupMap() { + return stringLookupMap; + } + + /** + * Resolves the specified variable. This implementation will try to extract a variable prefix from the given + * variable name (the first colon (':') is used as prefix separator). It then passes the name of the variable with + * the prefix stripped to the lookup object registered for this prefix. If no prefix can be found or if the + * associated lookup object cannot resolve this variable, the default lookup object will be used. + * + * @param var + * the name of the variable whose value is to be looked up + * @return the value of this variable or <b>null</b> if it cannot be resolved + */ + @Override + public String lookup(String var) { + if (var == null) { + return null; + } + + final int prefixPos = var.indexOf(PREFIX_SEPARATOR); + if (prefixPos >= 0) { + final String prefix = var.substring(0, prefixPos).toLowerCase(Locale.ROOT); + final String name = var.substring(prefixPos + 1); + final StringLookup lookup = stringLookupMap.get(prefix); + String value = null; + if (lookup != null) { + value = lookup.lookup(name); + } + + if (value != null) { + return value; + } + var = var.substring(prefixPos + 1); + } + if (defaultStringLookup != null) { + return defaultStringLookup.lookup(var); + } + return null; + } + + @Override + public String toString() { + return getClass().getName() + " [stringLookupMap=" + stringLookupMap + ", defaultStringLookup=" + + defaultStringLookup + "]"; + } +} http://git-wip-us.apache.org/repos/asf/commons-text/blob/faa9a23e/src/main/java/org/apache/commons/text/lookup/StringLookupFactory.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/text/lookup/StringLookupFactory.java b/src/main/java/org/apache/commons/text/lookup/StringLookupFactory.java index ac4d4c9..78a1ab3 100644 --- a/src/main/java/org/apache/commons/text/lookup/StringLookupFactory.java +++ b/src/main/java/org/apache/commons/text/lookup/StringLookupFactory.java @@ -1,192 +1,220 @@ -/* - * 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.commons.text.lookup; - -import java.util.Map; - -/** - * Provides access to lookups defined in this package. - * - * @since 1.3 - */ -public final class StringLookupFactory { - - /** - * Defines the singleton for this class. - */ - public static final StringLookupFactory INSTANCE = new StringLookupFactory(); - - /** - * No need to build instances for now. - */ - private StringLookupFactory() { - // empty - } - - /** - * Returns the DateStringLookup singleton instance to format the current date with the format given in the key in a - * format compatible with {@link java.text.SimpleDateFormat}. - * - * @return the DateStringLookup singleton instance. - */ - public StringLookup dateStringLookup() { - return DateStringLookup.INSTANCE; - } - - /** - * Returns the EnvironmentVariableStringLookup singleton instance where the lookup key is an environment variable - * name. - * - * @return the EnvironmentVariableStringLookup singleton instance. - */ - public StringLookup environmentVariableStringLookup() { - return EnvironmentVariableStringLookup.INSTANCE; - } - - /** - * Returns a new InterpolatorStringLookup. - * <p> - * The following lookups are used by default: - * </p> - * <ul> - * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> - * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> - * <li>"java" for the {@link JavaPlatformStringLookup}.</li> - * <li>"date" for the {@link DateStringLookup}.</li> - * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names.</li> - * </ul> - * - * @return a new InterpolatorStringLookup. - */ - public StringLookup interpolatorStringLookup() { - return new InterpolatorStringLookup(); - } - - /** - * Returns a new InterpolatorStringLookup. - * <p> - * The following lookups are used by default: - * </p> - * <ul> - * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> - * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> - * <li>"java" for the {@link JavaPlatformStringLookup}.</li> - * <li>"date" for the {@link DateStringLookup}.</li> - * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names.</li> - * </ul> - * - * @param <V> - * the value type the default string lookup's map. - * @param map - * the default map for string lookups. - * @return a new InterpolatorStringLookup. - */ - public <V> StringLookup interpolatorStringLookup(final Map<String, V> map) { - return new InterpolatorStringLookup(map); - } - - /** - * Returns a new InterpolatorStringLookup. - * <p> - * The following lookups are used by default: - * </p> - * <ul> - * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> - * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> - * <li>"java" for the {@link JavaPlatformStringLookup}.</li> - * <li>"date" for the {@link DateStringLookup}.</li> - * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names.</li> - * </ul> - * - * @param defaultStringLookup - * the default string lookup. - * @return a new InterpolatorStringLookup. - */ - public StringLookup interpolatorStringLookup(final StringLookup defaultStringLookup) { - return new InterpolatorStringLookup(defaultStringLookup); - } - - /** - * Returns the JavaPlatformStringLookup singleton instance. - * - * @return the JavaPlatformStringLookup singleton instance. - */ - public StringLookup javaPlatformStringLookup() { - return JavaPlatformStringLookup.INSTANCE; - } - - /** - * Returns the LocalHostStringLookup singleton instance where the lookup key is one of: - * <ul> - * <li><b>name</b>: for the local host name, for example {@code EXAMPLE}.</li> - * <li><b>canonical-name</b>: for the local canonical host name, for example {@code EXAMPLE.apache.org}.</li> - * <li><b>address</b>: for the local host address, for example {@code 192.168.56.1}.</li> - * </ul> - * - * @return the DateStringLookup singleton instance. - */ - public StringLookup localHostStringLookup() { - return LocalHostStringLookup.INSTANCE; - } - - /** - * Returns a new map-based lookup where the request for a lookup is answered with the value for that key. - * - * @param <V> - * the map value type. - * @param map - * the map. - * @return a new MapStringLookup. - */ - public <V> StringLookup mapStringLookup(final Map<String, V> map) { - return MapStringLookup.on(map); - } - - /** - * Returns the NullStringLookup singleton instance which always returns null. - * - * @return the NullStringLookup singleton instance. - */ - public StringLookup nullStringLookup() { - return NullStringLookup.INSTANCE; - } - - /** - * Returns the ResourceBundleStringLookup singleton instance. - * <p> - * Looks up the value for a given key in the format "BundleName:BundleKey". - * </p> - * <p> - * For example: "com.domain.messages:MyKey". - * </p> - * - * @return the ResourceBundleStringLookup singleton instance. - */ - public StringLookup resourceBundleStringLookup() { - return ResourceBundleStringLookup.INSTANCE; - } - - /** - * Returns the SystemPropertyStringLookup singleton instance where the lookup key is a system property name. - * - * @return the SystemPropertyStringLookup singleton instance. - */ - public StringLookup systemPropertyStringLookup() { - return SystemPropertyStringLookup.INSTANCE; - } -} +/* + * 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.commons.text.lookup; + +import java.util.Map; + +/** + * Provides access to lookups defined in this package. + * + * @since 1.3 + */ +public final class StringLookupFactory { + + /** + * Defines the singleton for this class. + */ + public static final StringLookupFactory INSTANCE = new StringLookupFactory(); + + /** + * No need to build instances for now. + */ + private StringLookupFactory() { + // empty + } + + /** + * Returns the DateStringLookup singleton instance to format the current date with the format given in the key in a + * format compatible with {@link java.text.SimpleDateFormat}. + * + * @return the DateStringLookup singleton instance. + */ + public StringLookup dateStringLookup() { + return DateStringLookup.INSTANCE; + } + + /** + * Returns the EnvironmentVariableStringLookup singleton instance where the lookup key is an environment variable + * name. + * + * @return the EnvironmentVariableStringLookup singleton instance. + */ + public StringLookup environmentVariableStringLookup() { + return EnvironmentVariableStringLookup.INSTANCE; + } + + /** + * Returns a new InterpolatorStringLookup. + * <p> + * The following lookups are used by default: + * </p> + * <ul> + * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> + * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> + * <li>"java" for the {@link JavaPlatformStringLookup}.</li> + * <li>"date" for the {@link DateStringLookup}.</li> + * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names.</li> + * </ul> + * + * @return a new InterpolatorStringLookup. + */ + public StringLookup interpolatorStringLookup() { + return new InterpolatorStringLookup(); + } + + /** + * Returns a new InterpolatorStringLookup. + * <p> + * The following lookups are used by default: + * </p> + * <ul> + * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> + * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> + * <li>"java" for the {@link JavaPlatformStringLookup}.</li> + * <li>"date" for the {@link DateStringLookup}.</li> + * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names.</li> + * </ul> + * + * @param <V> + * the value type the default string lookup's map. + * @param map + * the default map for string lookups. + * @return a new InterpolatorStringLookup. + */ + public <V> StringLookup interpolatorStringLookup(final Map<String, V> map) { + return new InterpolatorStringLookup(map); + } + + /** + * Returns a new InterpolatorStringLookup. + * <p> + * The following lookups are used by default: + * </p> + * <ul> + * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> + * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> + * <li>"java" for the {@link JavaPlatformStringLookup}.</li> + * <li>"date" for the {@link DateStringLookup}.</li> + * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names.</li> + * </ul> + * + * @param defaultStringLookup + * the default string lookup. + * @return a new InterpolatorStringLookup. + */ + public StringLookup interpolatorStringLookup(final StringLookup defaultStringLookup) { + return new InterpolatorStringLookup(defaultStringLookup); + } + + /** + * Returns a new InterpolatorStringLookup. + * <p> + * If {@code addDefaultLookups} is true, the following lookups are used in addition to the ones provided in + * {@code stringLookupMap}: + * </p> + * <ul> + * <li>"sys" for the {@link SystemPropertyStringLookup}.</li> + * <li>"env" for the {@link EnvironmentVariableStringLookup}.</li> + * <li>"java" for the {@link JavaPlatformStringLookup}.</li> + * <li>"date" for the {@link DateStringLookup}.</li> + * <li>"localhost" for the {@link LocalHostStringLookup}, see {@link #localHostStringLookup()} for key names.</li> + * </ul> + * + * @param stringLookupMap + * the map of string lookups. + * @param defaultStringLookup + * the default string lookup. + * @param addDefaultLookups + * whether to use lookups as described above. + * @return a new InterpolatorStringLookup. + * @since 1.4 + */ + public StringLookup interpolatorStringLookup(Map<String, StringLookup> stringLookupMap, + final StringLookup defaultStringLookup, final boolean addDefaultLookups) { + return new InterpolatorStringLookup(stringLookupMap, defaultStringLookup, addDefaultLookups); + } + + /** + * Returns the JavaPlatformStringLookup singleton instance. + * + * @return the JavaPlatformStringLookup singleton instance. + */ + public StringLookup javaPlatformStringLookup() { + return JavaPlatformStringLookup.INSTANCE; + } + + /** + * Returns the LocalHostStringLookup singleton instance where the lookup key is one of: + * <ul> + * <li><b>name</b>: for the local host name, for example {@code EXAMPLE}.</li> + * <li><b>canonical-name</b>: for the local canonical host name, for example {@code EXAMPLE.apache.org}.</li> + * <li><b>address</b>: for the local host address, for example {@code 192.168.56.1}.</li> + * </ul> + * + * @return the DateStringLookup singleton instance. + */ + public StringLookup localHostStringLookup() { + return LocalHostStringLookup.INSTANCE; + } + + /** + * Returns a new map-based lookup where the request for a lookup is answered with the value for that key. + * + * @param <V> + * the map value type. + * @param map + * the map. + * @return a new MapStringLookup. + */ + public <V> StringLookup mapStringLookup(final Map<String, V> map) { + return MapStringLookup.on(map); + } + + /** + * Returns the NullStringLookup singleton instance which always returns null. + * + * @return the NullStringLookup singleton instance. + */ + public StringLookup nullStringLookup() { + return NullStringLookup.INSTANCE; + } + + /** + * Returns the ResourceBundleStringLookup singleton instance. + * <p> + * Looks up the value for a given key in the format "BundleName:BundleKey". + * </p> + * <p> + * For example: "com.domain.messages:MyKey". + * </p> + * + * @return the ResourceBundleStringLookup singleton instance. + */ + public StringLookup resourceBundleStringLookup() { + return ResourceBundleStringLookup.INSTANCE; + } + + /** + * Returns the SystemPropertyStringLookup singleton instance where the lookup key is a system property name. + * + * @return the SystemPropertyStringLookup singleton instance. + */ + public StringLookup systemPropertyStringLookup() { + return SystemPropertyStringLookup.INSTANCE; + } +} http://git-wip-us.apache.org/repos/asf/commons-text/blob/faa9a23e/src/test/java/org/apache/commons/text/StringSubstitutorWithInterpolatorStringLookupTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/text/StringSubstitutorWithInterpolatorStringLookupTest.java b/src/test/java/org/apache/commons/text/StringSubstitutorWithInterpolatorStringLookupTest.java index 0eb1b3d..33157b7 100644 --- a/src/test/java/org/apache/commons/text/StringSubstitutorWithInterpolatorStringLookupTest.java +++ b/src/test/java/org/apache/commons/text/StringSubstitutorWithInterpolatorStringLookupTest.java @@ -22,6 +22,7 @@ import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map; +import org.apache.commons.text.lookup.StringLookup; import org.apache.commons.text.lookup.StringLookupFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -29,6 +30,33 @@ import org.junit.jupiter.api.Test; public class StringSubstitutorWithInterpolatorStringLookupTest { @Test + public void testCustomMapWithDefaults() { + testCustomMapWithDefaults(true); + } + + private void testCustomMapWithDefaults(final boolean addDefaultLookups) { + final String key = "key"; + final String value = "value"; + final Map<String, String> map = new HashMap<>(); + map.put(key, value); + final StringLookup mapStringLookup = StringLookupFactory.INSTANCE.mapStringLookup(map); + final Map<String, StringLookup> stringLookupMap = new HashMap<>(); + stringLookupMap.put("customLookup", mapStringLookup); + final StringSubstitutor strSubst = new StringSubstitutor( + StringLookupFactory.INSTANCE.interpolatorStringLookup(stringLookupMap, null, addDefaultLookups)); + if (addDefaultLookups) { + final String spKey = "user.name"; + Assertions.assertEquals(System.getProperty(spKey), strSubst.replace("${sys:" + spKey + "}")); + } + Assertions.assertEquals("value", strSubst.replace("${customLookup:key}")); + } + + @Test + public void testCustomMapWithoutDefaults() { + testCustomMapWithDefaults(false); + } + + @Test public void testLocalHostLookup_Address() throws UnknownHostException { final StringSubstitutor strSubst = new StringSubstitutor( StringLookupFactory.INSTANCE.interpolatorStringLookup());