Repository: logging-log4j2 Updated Branches: refs/heads/LOG4J2-1651 [created] f8f14e4b9
[LOG4J2-1651] Makes the dat format more user friendly. Writes out XML (but does not read it back). Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/f8f14e4b Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/f8f14e4b Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f8f14e4b Branch: refs/heads/LOG4J2-1651 Commit: f8f14e4b9473f47eb7b30aea908032a2c6779bfa Parents: dee36ee Author: Gary Gregory <[email protected]> Authored: Fri Nov 4 16:39:05 2016 -0700 Committer: Gary Gregory <[email protected]> Committed: Fri Nov 4 16:39:05 2016 -0700 ---------------------------------------------------------------------- .../config/plugins/processor/PluginCache.java | 99 ++++++++++++++++---- .../plugins/processor/PluginProcessor.java | 24 ++++- .../processor/PluginCacheFormatTest.java | 30 ++++++ pom.xml | 3 + 4 files changed, 134 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f8f14e4b/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 2fd4160..f572437 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 @@ -17,6 +17,7 @@ package org.apache.logging.log4j.core.config.plugins.processor; +import java.beans.XMLEncoder; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; @@ -28,10 +29,72 @@ import java.util.Enumeration; import java.util.LinkedHashMap; import java.util.Map; +import org.apache.logging.log4j.util.Strings; + /** * */ public class PluginCache { + + public enum Format { + DAT { + @Override + public void writeCache(PluginCache pluginCache, OutputStream os) throws IOException { + try (final DataOutputStream out = new DataOutputStream(new BufferedOutputStream(os))) { + // See PluginManager.readFromCacheFiles for the corresponding decoder. Format may not be changed + // without breaking existing Log4j2Plugins.dat files. + out.writeInt(pluginCache.categories.size()); + for (final Map.Entry<String, Map<String, PluginEntry>> category : pluginCache.categories + .entrySet()) { + out.writeUTF(category.getKey()); + final Map<String, PluginEntry> m = category.getValue(); + out.writeInt(m.size()); + for (final Map.Entry<String, PluginEntry> entry : m.entrySet()) { + final PluginEntry plugin = entry.getValue(); + out.writeUTF(plugin.getKey()); + out.writeUTF(plugin.getClassName()); + out.writeUTF(plugin.getName()); + out.writeBoolean(plugin.isPrintable()); + out.writeBoolean(plugin.isDefer()); + } + } + } + } + }, + + XML { + @Override + public void writeCache(PluginCache pluginCache, final OutputStream os) { + try (final XMLEncoder out = new XMLEncoder(os)) { + out.writeObject(pluginCache.categories); + } + } + }; + + public abstract void writeCache(PluginCache pluginCache, final OutputStream os) throws IOException; + + /** + * Parses a comma-separated list of {@code Format}s. + * + * @param formatsStr + * input + * @param defaultFormats + * The default Formats if the input is null or empty. + * @return a non-null array + */ + public static Format[] parse(String formatsStr, Format... defaultFormats) { + if (Strings.isBlank(formatsStr)) { + return defaultFormats; + } + final String[] split = formatsStr.split("\\s*,\\s*"); + Format[] formats = new Format[split.length]; + for (int i = 0; i < formats.length; i++) { + formats[i] = Format.valueOf(split[i]); + } + return formats; + } + } + private final Map<String, Map<String, PluginEntry>> categories = new LinkedHashMap<>(); @@ -64,26 +127,28 @@ public class PluginCache { * * @param os destination to save cache to. * @throws IOException if an I/O exception occurs. + * @deprecated Use {@link #writeCache(OutputStream, String)} or {@link Format#writeCache(PluginCache, OutputStream)}. */ + @Deprecated // NOTE: if this file format is to be changed, the filename should change and this format should still be readable public void writeCache(final OutputStream os) throws IOException { - try (final DataOutputStream out = new DataOutputStream(new BufferedOutputStream(os))) { - // See PluginManager.readFromCacheFiles for the corresponding decoder. Format may not be changed - // without breaking existing Log4j2Plugins.dat files. - out.writeInt(categories.size()); - for (final Map.Entry<String, Map<String, PluginEntry>> category : categories.entrySet()) { - out.writeUTF(category.getKey()); - final Map<String, PluginEntry> m = category.getValue(); - out.writeInt(m.size()); - for (final Map.Entry<String, PluginEntry> entry : m.entrySet()) { - final PluginEntry plugin = entry.getValue(); - out.writeUTF(plugin.getKey()); - out.writeUTF(plugin.getClassName()); - out.writeUTF(plugin.getName()); - out.writeBoolean(plugin.isPrintable()); - out.writeBoolean(plugin.isDefer()); - } - } + Format.DAT.writeCache(this, os); + } + + /** + * Stores the plugin cache to a given OutputStream. + * + * @param os destination to save cache to. + * @throws IOException if an I/O exception occurs. + */ + // NOTE: if this file format is to be changed, the filename should change and this format should still be readable + public void writeCache(final OutputStream os, String formatsStr) throws IOException { + if (Strings.isBlank(formatsStr)) { + Format.DAT.writeCache(this, os); + return; + } + for (String formatStr : formatsStr.split("\\s*,\\s*")) { + Format.valueOf(formatStr).writeCache(this, os); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f8f14e4b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java index 13a83a6..840a389 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java @@ -22,6 +22,7 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -40,6 +41,7 @@ import javax.tools.StandardLocation; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAliases; +import org.apache.logging.log4j.core.config.plugins.processor.PluginCache.Format; import org.apache.logging.log4j.util.Strings; /** @@ -51,11 +53,17 @@ public class PluginProcessor extends AbstractProcessor { // TODO: this could be made more abstract to allow for compile-time and run-time plugin processing /** + * The location of the plugin cache data file base name. + */ + public static final String PLUGIN_CACHE_FILE_BASE = + "META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins"; + + /** * The location of the plugin cache data file. This file is written to by this processor, and read from by * {@link org.apache.logging.log4j.core.config.plugins.util.PluginManager}. */ public static final String PLUGIN_CACHE_FILE = - "META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat"; + PLUGIN_CACHE_FILE_BASE + ".dat"; private final PluginCache pluginCache = new PluginCache(); @@ -105,10 +113,16 @@ public class PluginProcessor extends AbstractProcessor { } private void writeCacheFile(final Element... elements) throws IOException { - final FileObject fileObject = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, Strings.EMPTY, - PLUGIN_CACHE_FILE, elements); - try (final OutputStream out = fileObject.openOutputStream()) { - pluginCache.writeCache(out); + final String pluginCacheFileFormats = processingEnv.getOptions().get("pluginCacheFileFormats"); + System.err.println("pluginCacheFileFormats = " + pluginCacheFileFormats); + final Format[] formats = PluginCache.Format.parse(pluginCacheFileFormats, PluginCache.Format.DAT); + for (final Format format : formats) { + final String fileName = PLUGIN_CACHE_FILE_BASE + "." + format.toString().toLowerCase(Locale.ROOT); + final FileObject fileObject = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, + Strings.EMPTY, fileName, elements); + try (final OutputStream out = fileObject.openOutputStream()) { + format.writeCache(pluginCache, out); + } } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f8f14e4b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCacheFormatTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCacheFormatTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCacheFormatTest.java new file mode 100644 index 0000000..2a8fe01 --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCacheFormatTest.java @@ -0,0 +1,30 @@ +/* + * 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.core.config.plugins.processor; + +import org.apache.logging.log4j.core.config.plugins.processor.PluginCache.Format; +import org.junit.Assert; +import org.junit.Test; + +public class PluginCacheFormatTest { + + @Test + public void testParseFormats() { + Assert.assertArrayEquals(new Format[] { Format.DAT, Format.XML }, Format.parse("DAT,XML", Format.DAT)); + } +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f8f14e4b/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index fd71440..dd73fef 100644 --- a/pom.xml +++ b/pom.xml @@ -889,6 +889,9 @@ <phase>process-classes</phase> <configuration> <proc>only</proc> + <compilerArguments> + <ApluginCacheFileFormats>DAT,XML</ApluginCacheFileFormats> + </compilerArguments> </configuration> </execution> </executions>
