Repository: logging-log4j2 Updated Branches: refs/heads/LOG4J2-1651 2ec161ce6 -> a57406223
Start code to read prop files. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/a5740622 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/a5740622 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/a5740622 Branch: refs/heads/LOG4J2-1651 Commit: a57406223fe3a8c9ec1ddd371391d917568313d9 Parents: 2ec161c Author: Gary Gregory <[email protected]> Authored: Sat Nov 5 19:56:52 2016 -0700 Committer: Gary Gregory <[email protected]> Committed: Sat Nov 5 19:56:52 2016 -0700 ---------------------------------------------------------------------- .../logging/log4j/util/PropertiesUtil.java | 640 ++++++++++--------- .../config/plugins/processor/PluginCache.java | 17 +- 2 files changed, 336 insertions(+), 321 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a5740622/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java index af0b29e..bc5120c 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java @@ -1,310 +1,330 @@ -/* - * 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.logging.log4j.util; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; - -/** - * <em>Consider this class private.</em> - * <p> - * Helps access properties. This utility provides a method to override system properties by specifying properties in a - * properties file. - * </p> - */ -public final class PropertiesUtil { - - private static final PropertiesUtil LOG4J_PROPERTIES = new PropertiesUtil("log4j2.component.properties"); - - private final Properties props; - - /** - * Constructs a PropertiesUtil using a given Properties object as its source of defined properties. - * - * @param props the Properties to use by default - */ - public PropertiesUtil(final Properties props) { - this.props = props; - } - - /** - * Constructs a PropertiesUtil for a given properties file name on the classpath. The properties specified in this - * file are used by default. If a property is not defined in this file, then the equivalent system property is used. - * - * @param propertiesFileName the location of properties file to load - */ - public PropertiesUtil(final String propertiesFileName) { - final Properties properties = new Properties(); - for (final URL url : LoaderUtil.findResources(propertiesFileName)) { - try (final InputStream in = url.openStream()) { - properties.load(in); - } catch (final IOException ioe) { - LowLevelLogUtil.logException("Unable to read " + url.toString(), ioe); - } - } - this.props = properties; - } - - /** - * Loads and closes the given property input stream. If an error occurs, log to the status logger. - * - * @param in a property input stream. - * @param source a source object describing the source, like a resource string or a URL. - * @return a new Properties object - */ - static Properties loadClose(final InputStream in, final Object source) { - final Properties props = new Properties(); - if (null != in) { - try { - props.load(in); - } catch (final IOException e) { - LowLevelLogUtil.logException("Unable to read " + source, e); - } finally { - try { - in.close(); - } catch (final IOException e) { - LowLevelLogUtil.logException("Unable to close " + source, e); - } - } - } - return props; - } - - /** - * Returns the PropertiesUtil used by Log4j. - * - * @return the main Log4j PropertiesUtil instance. - */ - public static PropertiesUtil getProperties() { - return LOG4J_PROPERTIES; - } - - /** - * Gets the named property as a boolean value. If the property matches the string {@code "true"} (case-insensitive), - * then it is returned as the boolean value {@code true}. Any other non-{@code null} text in the property is - * considered {@code false}. - * - * @param name the name of the property to look up - * @return the boolean value of the property or {@code false} if undefined. - */ - public boolean getBooleanProperty(final String name) { - return getBooleanProperty(name, false); - } - - /** - * Gets the named property as a boolean value. - * - * @param name the name of the property to look up - * @param defaultValue the default value to use if the property is undefined - * @return the boolean value of the property or {@code defaultValue} if undefined. - */ - public boolean getBooleanProperty(final String name, final boolean defaultValue) { - final String prop = getStringProperty(name); - return (prop == null) ? defaultValue : "true".equalsIgnoreCase(prop); - } - - /** - * Gets the named property as a Charset value. - * - * @param name the name of the property to look up - * @return the Charset value of the property or {@link Charset#defaultCharset()} if undefined. - */ - public Charset getCharsetProperty(final String name) { - return getCharsetProperty(name, Charset.defaultCharset()); - } - - /** - * Gets the named property as a Charset value. - * - * @param name the name of the property to look up - * @param defaultValue the default value to use if the property is undefined - * @return the Charset value of the property or {@code defaultValue} if undefined. - */ - public Charset getCharsetProperty(String name, Charset defaultValue) { - final String prop = getStringProperty(name); - return prop == null ? defaultValue : Charset.forName(name); - } - - /** - * Gets the named property as a double. - * - * @param name the name of the property to look up - * @param defaultValue the default value to use if the property is undefined - * @return the parsed double value of the property or {@code defaultValue} if it was undefined or could not be parsed. - */ - public double getDoubleProperty(final String name, final double defaultValue) { - final String prop = getStringProperty(name); - if (prop != null) { - try { - return Double.parseDouble(prop); - } catch (final Exception ignored) { - return defaultValue; - } - } - return defaultValue; - } - - /** - * Gets the named property as an integer. - * - * @param name the name of the property to look up - * @param defaultValue the default value to use if the property is undefined - * @return the parsed integer value of the property or {@code defaultValue} if it was undefined or could not be - * parsed. - */ - public int getIntegerProperty(final String name, final int defaultValue) { - final String prop = getStringProperty(name); - if (prop != null) { - try { - return Integer.parseInt(prop); - } catch (final Exception ignored) { - return defaultValue; - } - } - return defaultValue; - } - - /** - * Gets the named property as a long. - * - * @param name the name of the property to look up - * @param defaultValue the default value to use if the property is undefined - * @return the parsed long value of the property or {@code defaultValue} if it was undefined or could not be parsed. - */ - public long getLongProperty(final String name, final long defaultValue) { - final String prop = getStringProperty(name); - if (prop != null) { - try { - return Long.parseLong(prop); - } catch (final Exception ignored) { - return defaultValue; - } - } - return defaultValue; - } - - /** - * Gets the named property as a String. - * - * @param name the name of the property to look up - * @return the String value of the property or {@code null} if undefined. - */ - public String getStringProperty(final String name) { - String prop = null; - try { - prop = System.getProperty(name); - } catch (final SecurityException ignored) { - // Ignore - } - return prop == null ? props.getProperty(name) : prop; - } - - /** - * Gets the named property as a String. - * - * @param name the name of the property to look up - * @param defaultValue the default value to use if the property is undefined - * @return the String value of the property or {@code defaultValue} if undefined. - */ - public String getStringProperty(final String name, final String defaultValue) { - final String prop = getStringProperty(name); - return (prop == null) ? defaultValue : prop; - } - - /** - * Return the system properties or an empty Properties object if an error occurs. - * - * @return The system properties. - */ - public static Properties getSystemProperties() { - try { - return new Properties(System.getProperties()); - } catch (final SecurityException ex) { - LowLevelLogUtil.logException("Unable to access system properties.", ex); - // Sandboxed - can't read System Properties - return new Properties(); - } - } - - /** - * Extracts properties that start with or are equals to the specific prefix and returns them in a new Properties - * object with the prefix removed. - * - * @param properties The Properties to evaluate. - * @param prefix The prefix to extract. - * @return The subset of properties. - */ - public static Properties extractSubset(final Properties properties, final String prefix) { - final Properties subset = new Properties(); - - if (prefix == null || prefix.length() == 0) { - return subset; - } - - final String prefixToMatch = prefix.charAt(prefix.length() - 1) != '.' ? prefix + '.' : prefix; - - final List<String> keys = new ArrayList<>(); - - for (final String key : properties.stringPropertyNames()) { - if (key.startsWith(prefixToMatch)) { - subset.setProperty(key.substring(prefixToMatch.length()), properties.getProperty(key)); - keys.add(key); - } - } - for (final String key : keys) { - properties.remove(key); - } - - return subset; - } - - /** - * Partitions a properties map based on common key prefixes up to the first period. - * - * @param properties properties to partition - * @return the partitioned properties where each key is the common prefix (minus the period) and the values are - * new property maps without the prefix and period in the key - * @since 2.6 - */ - public static Map<String, Properties> partitionOnCommonPrefixes(final Properties properties) { - final Map<String, Properties> parts = new ConcurrentHashMap<>(); - for (final String key : properties.stringPropertyNames()) { - final String prefix = key.substring(0, key.indexOf('.')); - if (!parts.containsKey(prefix)) { - parts.put(prefix, new Properties()); - } - parts.get(prefix).setProperty(key.substring(key.indexOf('.') + 1), properties.getProperty(key)); - } - return parts; - } - - /** - * Returns true if system properties tell us we are running on Windows. - * @return true if system properties tell us we are running on Windows. - */ - public boolean isOsWindows() { - return getStringProperty("os.name").startsWith("Windows"); - } - -} +/* + * 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.logging.log4j.util; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +/** + * <em>Consider this class private.</em> + * <p> + * Helps access properties. This utility provides a method to override system properties by specifying properties in a + * properties file. + * </p> + */ +public final class PropertiesUtil { + + private static final PropertiesUtil LOG4J_PROPERTIES = new PropertiesUtil("log4j2.component.properties"); + + private final Properties props; + + /** + * Constructs a PropertiesUtil using a given Properties object as its source of defined properties. + * + * @param props the Properties to use by default + */ + public PropertiesUtil(final Properties props) { + this.props = props; + } + + /** + * Constructs a PropertiesUtil for a given properties file name on the classpath. The properties specified in this + * file are used by default. If a property is not defined in this file, then the equivalent system property is used. + * + * @param propertiesFileName the location of properties file to load + */ + public PropertiesUtil(final String propertiesFileName) { + final Properties properties = new Properties(); + for (final URL url : LoaderUtil.findResources(propertiesFileName)) { + try (final InputStream in = url.openStream()) { + properties.load(in); + } catch (final IOException ioe) { + LowLevelLogUtil.logException("Unable to read " + url.toString(), ioe); + } + } + this.props = properties; + } + + /** + * Loads and closes the given property input stream. If an error occurs, log to the status logger. + * + * @param in a property input stream. + * @param source a source object describing the source, like a resource string or a URL. + * @return a new Properties object + */ + static Properties loadClose(final InputStream in, final Object source) { + final Properties props = new Properties(); + if (null != in) { + try { + props.load(in); + } catch (final IOException e) { + LowLevelLogUtil.logException("Unable to read " + source, e); + } finally { + try { + in.close(); + } catch (final IOException e) { + LowLevelLogUtil.logException("Unable to close " + source, e); + } + } + } + return props; + } + + /** + * Returns the PropertiesUtil used by Log4j. + * + * @return the main Log4j PropertiesUtil instance. + */ + public static PropertiesUtil getProperties() { + return LOG4J_PROPERTIES; + } + + /** + * Gets the named property as a boolean value. If the property matches the string {@code "true"} (case-insensitive), + * then it is returned as the boolean value {@code true}. Any other non-{@code null} text in the property is + * considered {@code false}. + * + * @param name the name of the property to look up + * @return the boolean value of the property or {@code false} if undefined. + */ + public boolean getBooleanProperty(final String name) { + return getBooleanProperty(name, false); + } + + /** + * Gets the named property as a boolean value. + * + * @param name the name of the property to look up + * @param defaultValue the default value to use if the property is undefined + * @return the boolean value of the property or {@code defaultValue} if undefined. + */ + public boolean getBooleanProperty(final String name, final boolean defaultValue) { + final String prop = getStringProperty(name); + return (prop == null) ? defaultValue : "true".equalsIgnoreCase(prop); + } + + /** + * Gets the named property as a Charset value. + * + * @param name the name of the property to look up + * @return the Charset value of the property or {@link Charset#defaultCharset()} if undefined. + */ + public Charset getCharsetProperty(final String name) { + return getCharsetProperty(name, Charset.defaultCharset()); + } + + /** + * Gets the named property as a Charset value. + * + * @param name the name of the property to look up + * @param defaultValue the default value to use if the property is undefined + * @return the Charset value of the property or {@code defaultValue} if undefined. + */ + public Charset getCharsetProperty(String name, Charset defaultValue) { + final String prop = getStringProperty(name); + return prop == null ? defaultValue : Charset.forName(name); + } + + /** + * Gets the named property as a double. + * + * @param name the name of the property to look up + * @param defaultValue the default value to use if the property is undefined + * @return the parsed double value of the property or {@code defaultValue} if it was undefined or could not be parsed. + */ + public double getDoubleProperty(final String name, final double defaultValue) { + final String prop = getStringProperty(name); + if (prop != null) { + try { + return Double.parseDouble(prop); + } catch (final Exception ignored) { + return defaultValue; + } + } + return defaultValue; + } + + /** + * Gets the named property as an integer. + * + * @param name the name of the property to look up + * @param defaultValue the default value to use if the property is undefined + * @return the parsed integer value of the property or {@code defaultValue} if it was undefined or could not be + * parsed. + */ + public int getIntegerProperty(final String name, final int defaultValue) { + final String prop = getStringProperty(name); + if (prop != null) { + try { + return Integer.parseInt(prop); + } catch (final Exception ignored) { + return defaultValue; + } + } + return defaultValue; + } + + /** + * Gets the named property as a long. + * + * @param name the name of the property to look up + * @param defaultValue the default value to use if the property is undefined + * @return the parsed long value of the property or {@code defaultValue} if it was undefined or could not be parsed. + */ + public long getLongProperty(final String name, final long defaultValue) { + final String prop = getStringProperty(name); + if (prop != null) { + try { + return Long.parseLong(prop); + } catch (final Exception ignored) { + return defaultValue; + } + } + return defaultValue; + } + + /** + * Gets the named property as a String. + * + * @param name the name of the property to look up + * @return the String value of the property or {@code null} if undefined. + */ + public String getStringProperty(final String name) { + String prop = null; + try { + prop = System.getProperty(name); + } catch (final SecurityException ignored) { + // Ignore + } + return prop == null ? props.getProperty(name) : prop; + } + + /** + * Gets the named property as a String. + * + * @param name the name of the property to look up + * @param defaultValue the default value to use if the property is undefined + * @return the String value of the property or {@code defaultValue} if undefined. + */ + public String getStringProperty(final String name, final String defaultValue) { + final String prop = getStringProperty(name); + return (prop == null) ? defaultValue : prop; + } + + /** + * Return the system properties or an empty Properties object if an error occurs. + * + * @return The system properties. + */ + public static Properties getSystemProperties() { + try { + return new Properties(System.getProperties()); + } catch (final SecurityException ex) { + LowLevelLogUtil.logException("Unable to access system properties.", ex); + // Sandboxed - can't read System Properties + return new Properties(); + } + } + + /** + * Extracts properties that start with or are equals to the specific prefix and returns them in a new Properties + * object with the prefix removed. + * + * @param properties The Properties to evaluate. + * @param prefix The prefix to extract. + * @return The subset of properties. + */ + public static Properties extractSubset(final Properties properties, final String prefix) { + final Properties subset = new Properties(); + + if (prefix == null || prefix.length() == 0) { + return subset; + } + + final String prefixToMatch = prefix.charAt(prefix.length() - 1) != '.' ? prefix + '.' : prefix; + + final List<String> keys = new ArrayList<>(); + + for (final String key : properties.stringPropertyNames()) { + if (key.startsWith(prefixToMatch)) { + subset.setProperty(key.substring(prefixToMatch.length()), properties.getProperty(key)); + keys.add(key); + } + } + for (final String key : keys) { + properties.remove(key); + } + + return subset; + } + + /** + * Partitions a properties map based on common key prefixes up to the first period. + * + * @param properties properties to partition + * @return the partitioned properties where each key is the common prefix (minus the period) and the values are + * new property maps without the prefix and period in the key + * @since 2.6 + */ + public static Map<String, Properties> partitionOnCommonPrefixes(final Properties properties) { + final Map<String, Properties> parts = new ConcurrentHashMap<>(); + for (final String key : properties.stringPropertyNames()) { + final String prefix = key.substring(0, key.indexOf('.')); + if (!parts.containsKey(prefix)) { + parts.put(prefix, new Properties()); + } + parts.get(prefix).setProperty(key.substring(key.indexOf('.') + 1), properties.getProperty(key)); + } + return parts; + } + + /** + * Loads a properties file (XML with a ".xml" extension or normal ".properties" file) from the given URL. + * + * @param url the URL to load + * @return a new Properties object + * @throws IOException if an I/O exception occurs. + */ + public static Properties toProperties(final URL url) throws IOException { + final Properties loadProps = new Properties(); + try (final InputStream stream = url.openStream()) { + if (url.toString().toLowerCase(Locale.ROOT).endsWith(".xml")) { + loadProps.loadFromXML(stream); + } else { + loadProps.load(stream); + } + } + return loadProps; + } + + /** + * Returns true if system properties tell us we are running on Windows. + * @return true if system properties tell us we are running on Windows. + */ + public boolean isOsWindows() { + return getStringProperty("os.name").startsWith("Windows"); + } + +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a5740622/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java index 9486042..871b542 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java @@ -21,26 +21,20 @@ import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.io.PrintStream; -import java.io.StringReader; import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; import java.util.Enumeration; import java.util.LinkedHashMap; -import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import org.apache.logging.log4j.core.util.SortedProperties; +import org.apache.logging.log4j.util.PropertiesUtil; import org.apache.logging.log4j.util.Strings; /** @@ -102,8 +96,8 @@ public class PluginCache { PROPERTIES { @Override public void loadCacheFiles(final PluginCache pluginCache, final URL url) throws IOException { - // TODO Auto-generated method stub - + Properties props = PropertiesUtil.toProperties(url); + } @Override @@ -121,7 +115,7 @@ public class PluginCache { @Override public void loadCacheFiles(final PluginCache pluginCache, final URL url) throws IOException { - // TODO Auto-generated method stub + Properties props = PropertiesUtil.toProperties(url); } @@ -136,7 +130,8 @@ public class PluginCache { public void loadCacheFiles(final PluginCache pluginCache, final URL url) throws IOException { try (final XMLDecoder out = new XMLDecoder(url.openStream())) { @SuppressWarnings("unchecked") - final Map<String, Map<String, PluginEntry>> object = (Map<String, Map<String, PluginEntry>>) out.readObject(); + final Map<String, Map<String, PluginEntry>> object = (Map<String, Map<String, PluginEntry>>) out + .readObject(); pluginCache.getAllCategories().putAll(object); } }
