You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2016/11/06 02:56:54 UTC
logging-log4j2 git commit: Start code to read prop files.
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 <gg...@apache.org>
Authored: Sat Nov 5 19:56:52 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
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);
}
}