You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2019/06/02 22:38:18 UTC
[logging-log4j2] branch LOG4J2-2621 created (now 4455177)
This is an automated email from the ASF dual-hosted git repository.
rgoers pushed a change to branch LOG4J2-2621
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git.
at 4455177 LOG4J2-2621 - Initial commit
This branch includes the following new commits:
new b69c2d9 LOG4J2-2621 - Initial commit
new 4455177 LOG4J2-2621 - Initial commit
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Re: [logging-log4j2] 01/02: LOG4J2-2621 - Initial commit
Posted by Ralph Goers <ra...@dslextreme.com>.
I have implemented compatibility with Log4j 2 2.x plugins. I’ve created a PR for easier review as this is a very large commit. If there are no comments I plan to commit this later in the week.
Ralph
> On Jun 9, 2019, at 11:39 AM, Ralph Goers <ra...@dslextreme.com> wrote:
>
> I have updated the branch so that the build now succeeds and the OSGi tests pass. One quirk I noticed with OSGi is that in one of the tests the configuration is loaded from a sample bundle so that is where the LoggerContext ends up. When shutting down the LoggerContext is searched for on the log4j core bundle and isn’t found so then it creates a new LoggerContext during shutdown. This clearly isn’t right so I added an option to have LogManager.shutdown() try to shutdown LoggerContexts on all bundles and not create a new LoggerContext.
>
> The only thing left is to add back support for existing plugins. Unfortunately, that is probably going to require adding deprecated classes back to core so that existing Plugins don’t get ClassNotFoundExceptions.
>
> Ralph
>
>> On Jun 3, 2019, at 7:58 AM, Ralph Goers <ra...@dslextreme.com> wrote:
>>
>> Yes, but it shows up in the correct place in the git repo and the diff in the email shows the correct directory.
>>
>> Ralph
>>
>>> On Jun 3, 2019, at 3:56 AM, Gary Gregory <ga...@gmail.com> wrote:
>>>
>>> This is weird, note the "}":
>>>
>>> .../org/apache/logging/log4j}/util/Assert.java | 0
>>>
>>> Gary
>>>
>>> On Sun, Jun 2, 2019 at 6:38 PM <rg...@apache.org> wrote:
>>>
>>>> This is an automated email from the ASF dual-hosted git repository.
>>>>
>>>> rgoers pushed a commit to branch LOG4J2-2621
>>>> in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
>>>>
>>>> commit b69c2d9e4b79ee7830a69463c6f89de1c50fe84d
>>>> Author: Ralph Goers <rg...@apache.org>
>>>> AuthorDate: Sun Jun 2 13:18:36 2019 -0700
>>>>
>>>> LOG4J2-2621 - Initial commit
>>>> ---
>>>> .../org/apache/logging/log4j}/util/Assert.java | 0
>>>> .../logging/log4j/util/InternalException.java | 56 ++++
>>>> .../org/apache/logging/log4j}/util/NameUtil.java | 0
>>>> .../apache/logging/log4j}/util/ReflectionUtil.java | 6 +-
>>>> .../log4j/junit/AbstractExternalFileCleaner.java | 0
>>>> .../org/apache/logging/log4j/junit/CleanFiles.java | 0
>>>> .../apache/logging/log4j/junit/CleanFolders.java | 0
>>>> .../log4j/junit/URLStreamHandlerFactoryRule.java | 0
>>>> .../org/apache/logging/log4j}/util/AssertTest.java | 2 +-
>>>> .../config/plugins/convert/Base64Converter.java | 79 -----
>>>> ...TypeConverters.java => CoreTypeConverters.java} | 7 +-
>>>> .../ValidatingPluginWithGenericBuilderTest.java | 10 +-
>>>> log4j-plugins-java9/pom.xml | 157 +++++++++
>>>> log4j-plugins-java9/src/assembly/java9.xml | 40 +++
>>>> .../src/main/java/module-info.java | 15 +-
>>>> .../org/apache/logging/log4j/plugins/Dummy.java | 9 +-
>>>> .../logging/log4j/plugins/convert/Dummy.java | 9 +-
>>>> .../log4j/plugins/processor/PluginService.java | 9 +-
>>>> .../apache/logging/log4j/plugins/util/Dummy.java | 9 +-
>>>> .../logging/log4j/plugins/validation/Dummy.java | 9 +-
>>>> .../logging/log4j/plugins/visitors/Dummy.java | 9 +-
>>>> log4j-plugins/pom.xml | 360
>>>> +++++++++++++++++++++
>>>> .../org/apache/logging/log4j/plugins}/Node.java | 6 +-
>>>> .../org/apache/logging/log4j}/plugins/Plugin.java | 6 +-
>>>> .../logging/log4j}/plugins/PluginAliases.java | 4 +-
>>>> .../logging/log4j}/plugins/PluginAttribute.java | 8 +-
>>>> .../log4j}/plugins/PluginBuilderAttribute.java | 8 +-
>>>> .../log4j}/plugins/PluginBuilderFactory.java | 2 +-
>>>> .../logging/log4j}/plugins/PluginElement.java | 6 +-
>>>> .../logging/log4j}/plugins/PluginFactory.java | 2 +-
>>>> .../apache/logging/log4j}/plugins/PluginNode.java | 6 +-
>>>> .../apache/logging/log4j}/plugins/PluginValue.java | 6 +-
>>>> .../log4j}/plugins/PluginVisitorStrategy.java | 8 +-
>>>> .../log4j}/plugins/convert/EnumConverter.java | 2 +-
>>>> .../log4j}/plugins/convert/HexConverter.java | 2 +-
>>>> .../log4j}/plugins/convert/TypeConverter.java | 2 +-
>>>> .../plugins/convert/TypeConverterRegistry.java | 23 +-
>>>> .../log4j}/plugins/convert/TypeConverters.java | 47 +--
>>>> .../log4j/plugins/convert}/package-info.java | 7 +-
>>>> .../logging/log4j/plugins/osgi/Activator.java | 103 ++++++
>>>> .../logging/log4j/plugins/osgi}/package-info.java | 6 +-
>>>> .../logging/log4j/plugins}/package-info.java | 6 +-
>>>> .../log4j}/plugins/processor/PluginCache.java | 30 +-
>>>> .../log4j}/plugins/processor/PluginEntry.java | 14 +-
>>>> .../log4j}/plugins/processor/PluginProcessor.java | 157 +++++++--
>>>> .../log4j/plugins/processor/PluginService.java | 56 ++++
>>>> .../log4j}/plugins/processor/package-info.java | 2 +-
>>>> .../logging/log4j/plugins}/util/Builder.java | 4 +-
>>>> .../logging/log4j}/plugins/util/PluginManager.java | 8 +-
>>>> .../log4j}/plugins/util/PluginRegistry.java | 81 +++--
>>>> .../logging/log4j}/plugins/util/PluginType.java | 6 +-
>>>> .../logging/log4j}/plugins/util/ResolverUtil.java | 29 +-
>>>> .../logging/log4j/plugins/util/TypeUtil.java | 217 +++++++++++++
>>>> .../logging/log4j/plugins/util}/package-info.java | 2 +-
>>>> .../log4j}/plugins/validation/Constraint.java | 9 +-
>>>> .../plugins/validation/ConstraintValidator.java | 2 +-
>>>> .../plugins/validation/ConstraintValidators.java | 8 +-
>>>> .../plugins/validation/constraints/Required.java | 12 +-
>>>> .../plugins/validation/constraints/ValidHost.java | 6 +-
>>>> .../plugins/validation/constraints/ValidPort.java | 12 +-
>>>> .../validation/constraints/package-info.java | 2 +-
>>>> .../log4j}/plugins/validation/package-info.java | 2 +-
>>>> .../validation/validators/RequiredValidator.java | 14 +-
>>>> .../validation/validators/ValidHostValidator.java | 6 +-
>>>> .../validation/validators/ValidPortValidator.java | 8 +-
>>>> .../validation/validators/package-info.java | 2 +-
>>>> .../plugins/visitors/AbstractPluginVisitor.java | 34 +-
>>>> .../plugins/visitors/PluginAttributeVisitor.java | 27 +-
>>>> .../visitors/PluginBuilderAttributeVisitor.java | 23 +-
>>>> .../plugins/visitors/PluginElementVisitor.java | 17 +-
>>>> .../log4j}/plugins/visitors/PluginNodeVisitor.java | 14 +-
>>>> .../plugins/visitors/PluginValueVisitor.java | 18 +-
>>>> .../log4j}/plugins/visitors/PluginVisitor.java | 36 +--
>>>> .../log4j}/plugins/visitors/PluginVisitors.java | 12 +-
>>>> .../log4j/plugins/visitors}/package-info.java | 9 +-
>>>> .../services/javax.annotation.processing.Processor | 2 +-
>>>> .../plugins/convert/TypeConverterRegistryTest.java | 4 +-
>>>> .../log4j}/plugins/processor/FakePlugin.java | 6 +-
>>>> .../plugins/processor/PluginProcessorTest.java | 26 +-
>>>> .../util/ResolverUtilCustomProtocolTest.java | 30 +-
>>>> .../log4j}/plugins/util/ResolverUtilTest.java | 76 +++--
>>>> .../AbstractPluginWithGenericBuilder.java | 6 +-
>>>> .../log4j}/plugins/validation/HostAndPort.java | 14 +-
>>>> .../PluginWithGenericSubclassFoo1Builder.java | 12 +-
>>>> .../plugins/validation/ValidatingPlugin.java | 16 +-
>>>> .../ValidatingPluginWithGenericBuilder.java | 17 +-
>>>> .../ValidatingPluginWithTypedBuilder.java | 16 +-
>>>> .../resources/customplugin/FixedString.java.source | 37 ++-
>>>> .../log4j+config+with+plus+characters.xml | 31 ++
>>>> .../log4j+config+with+plus+characters.xml | 31 ++
>>>> 90 files changed, 1655 insertions(+), 594 deletions(-)
>>>>
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
>>>> similarity index 100%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java
>>>> rename to log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
>>>> diff --git
>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
>>>> new file mode 100644
>>>> index 0000000..8c433db
>>>> --- /dev/null
>>>> +++
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
>>>> @@ -0,0 +1,56 @@
>>>> +/*
>>>> + * 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;
>>>> +
>>>> +/**
>>>> + * Exception thrown when an error occurs while logging. In most cases
>>>> exceptions will be handled
>>>> + * within Log4j but certain Appenders may be configured to allow
>>>> exceptions to propagate to the
>>>> + * application. This is a RuntimeException so that the exception may be
>>>> thrown in those cases without
>>>> + * requiring all Logger methods be contained with try/catch blocks.
>>>> + */
>>>> +public class LoggingException extends RuntimeException {
>>>> +
>>>> + private static final long serialVersionUID = 6366395965071580537L;
>>>> +
>>>> + /**
>>>> + * Construct an exception with a message.
>>>> + *
>>>> + * @param message The reason for the exception
>>>> + */
>>>> + public LoggingException(final String message) {
>>>> + super(message);
>>>> + }
>>>> +
>>>> + /**
>>>> + * Construct an exception with a message and underlying cause.
>>>> + *
>>>> + * @param message The reason for the exception
>>>> + * @param cause The underlying cause of the exception
>>>> + */
>>>> + public LoggingException(final String message, final Throwable cause) {
>>>> + super(message, cause);
>>>> + }
>>>> +
>>>> + /**
>>>> + * Construct an exception with an underlying cause.
>>>> + *
>>>> + * @param cause The underlying cause of the exception
>>>> + */
>>>> + public LoggingException(final Throwable cause) {
>>>> + super(cause);
>>>> + }
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
>>>> similarity index 100%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java
>>>> rename to
>>>> log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>> similarity index 98%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
>>>> rename to
>>>> log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>> index ffee439..f00e64a 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
>>>> +++
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>> @@ -193,8 +193,10 @@ public final class ReflectionUtil {
>>>> } catch (final IllegalAccessException e) {
>>>> throw new IllegalStateException(e);
>>>> } catch (final InvocationTargetException e) {
>>>> - Throwables.rethrow(e.getCause());
>>>> - throw new InternalError("Unreachable");
>>>> + if (e.getCause() instanceof RuntimeException) {
>>>> + throw (RuntimeException) e.getCause();
>>>> + }
>>>> + throw new
>>>> }
>>>> }
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>>>> similarity index 100%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>>>> rename to
>>>> log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>>>> similarity index 100%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>>>> rename to
>>>> log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>>>> similarity index 100%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>>>> rename to
>>>> log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>>>> similarity index 100%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>>>> rename to
>>>> log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
>>>> similarity index 99%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
>>>> rename to
>>>> log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
>>>> index 242c41e..7e46036 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
>>>> +++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
>>>> @@ -65,4 +65,4 @@ public class AssertTest {
>>>> assertEquals(isEmpty, Assert.isEmpty(value));
>>>> }
>>>>
>>>> -}
>>>> \ No newline at end of file
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
>>>> deleted file mode 100644
>>>> index f4e421f..0000000
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
>>>> +++ /dev/null
>>>> @@ -1,79 +0,0 @@
>>>> -/*
>>>> - * 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.convert;
>>>> -
>>>> -import java.lang.reflect.InvocationTargetException;
>>>> -import java.lang.reflect.Method;
>>>> -
>>>> -import org.apache.logging.log4j.Logger;
>>>> -import org.apache.logging.log4j.status.StatusLogger;
>>>> -import org.apache.logging.log4j.util.LoaderUtil;
>>>> -
>>>> -/**
>>>> - * @Since 2.9
>>>> - */
>>>> -public class Base64Converter {
>>>> -
>>>> - private static final Logger LOGGER = StatusLogger.getLogger();
>>>> - private static Method method = null;
>>>> - private static Object decoder = null;
>>>> -
>>>> - static {
>>>> - try {
>>>> - // Base64 is available in Java 8 and up.
>>>> - Class<?> clazz = LoaderUtil.loadClass("java.util.Base64");
>>>> - final Method getDecoder = clazz.getMethod("getDecoder",
>>>> (Class[]) null);
>>>> - decoder = getDecoder.invoke(null, (Object[]) null);
>>>> - clazz = decoder.getClass();
>>>> - method = clazz.getMethod("decode", String.class);
>>>> - } catch (final ClassNotFoundException ex) {
>>>> -
>>>> - } catch (final NoSuchMethodException ex) {
>>>> -
>>>> - } catch (final IllegalAccessException ex) {
>>>> -
>>>> - } catch (final InvocationTargetException ex) {
>>>> -
>>>> - }
>>>> - if (method == null) {
>>>> - try {
>>>> - // DatatypeConverter is not in the default module in Java
>>>> 9.
>>>> - final Class<?> clazz =
>>>> LoaderUtil.loadClass("javax.xml.bind.DatatypeConverter");
>>>> - method = clazz.getMethod("parseBase64Binary",
>>>> String.class);
>>>> - } catch (final ClassNotFoundException ex) {
>>>> - LOGGER.error("No Base64 Converter is available");
>>>> - } catch (final NoSuchMethodException ex) {
>>>> -
>>>> - }
>>>> - }
>>>> - }
>>>> -
>>>> - public static byte[] parseBase64Binary(final String encoded) {
>>>> - if (method == null) {
>>>> - LOGGER.error("No base64 converter");
>>>> - } else {
>>>> - try {
>>>> - return (byte[]) method.invoke(decoder, encoded);
>>>> - } catch (final IllegalAccessException ex) {
>>>> - LOGGER.error("Error decoding string - " +
>>>> ex.getMessage());
>>>> - } catch (final InvocationTargetException ex) {
>>>> - LOGGER.error("Error decoding string - " +
>>>> ex.getMessage());
>>>> - }
>>>> - }
>>>> - return new byte[0];
>>>> - }
>>>> -}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
>>>> similarity index 98%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>>> copy to
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
>>>> index dc833f0..00e6da7 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>>> +++
>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
>>>> @@ -30,13 +30,14 @@ import java.nio.file.Path;
>>>> import java.nio.file.Paths;
>>>> import java.security.Provider;
>>>> import java.security.Security;
>>>> +import java.util.Base64;
>>>> import java.util.UUID;
>>>> import java.util.regex.Pattern;
>>>>
>>>> import org.apache.logging.log4j.Level;
>>>> import org.apache.logging.log4j.Logger;
>>>> import org.apache.logging.log4j.core.appender.rolling.action.Duration;
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>> import org.apache.logging.log4j.core.util.CronExpression;
>>>> import org.apache.logging.log4j.status.StatusLogger;
>>>> import org.apache.logging.log4j.util.LoaderUtil;
>>>> @@ -56,6 +57,8 @@ public final class TypeConverters {
>>>> */
>>>> public static final String CATEGORY = "TypeConverter";
>>>>
>>>> + private static final Base64.Decoder decoder = Base64.getDecoder();
>>>> +
>>>> /**
>>>> * Parses a {@link String} into a {@link BigDecimal}.
>>>> */
>>>> @@ -112,7 +115,7 @@ public final class TypeConverters {
>>>> bytes = new byte[0];
>>>> } else if (value.startsWith(PREFIX_BASE64)) {
>>>> final String lexicalXSDBase64Binary =
>>>> value.substring(PREFIX_BASE64.length());
>>>> - bytes =
>>>> Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
>>>> + bytes = decoder.decode(lexicalXSDBase64Binary);
>>>> } else if (value.startsWith(PREFIX_0x)) {
>>>> final String lexicalXSDHexBinary =
>>>> value.substring(PREFIX_0x.length());
>>>> bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>>>> b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>>>> index 8ee5abb..27ac5fe 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>>>> +++
>>>> b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>>>> @@ -20,12 +20,12 @@ import static org.junit.Assert.assertEquals;
>>>> import static org.junit.Assert.assertNotNull;
>>>> import static org.junit.Assert.assertNull;
>>>>
>>>> -import org.apache.logging.log4j.core.config.Node;
>>>> +import org.apache.logging.log4j.plugins.Node;
>>>> import org.apache.logging.log4j.core.config.NullConfiguration;
>>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
>>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
>>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.ValidatingPluginWithGenericBuilder;
>>>> +import org.apache.logging.log4j.plugins.util.PluginBuilder;
>>>> +import org.apache.logging.log4j.plugins.util.PluginManager;
>>>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>>> +import
>>>> org.apache.logging.log4j.plugins.validation.ValidatingPluginWithGenericBuilder;
>>>> import org.junit.Before;
>>>> import org.junit.Test;
>>>>
>>>> diff --git a/log4j-plugins-java9/pom.xml b/log4j-plugins-java9/pom.xml
>>>> new file mode 100644
>>>> index 0000000..49f81c6
>>>> --- /dev/null
>>>> +++ b/log4j-plugins-java9/pom.xml
>>>> @@ -0,0 +1,157 @@
>>>> +<?xml version="1.0" encoding="UTF-8"?>
>>>> +<!--
>>>> + ~ 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.
>>>> + -->
>>>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>>>> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>>>> http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
>>>> ">
>>>> + <modelVersion>4.0.0</modelVersion>
>>>> + <parent>
>>>> + <groupId>org.apache.logging.log4j</groupId>
>>>> + <artifactId>log4j</artifactId>
>>>> + <version>3.0.0-SNAPSHOT</version>
>>>> + <relativePath>../</relativePath>
>>>> + </parent>
>>>> + <artifactId>log4j-plugins-java9</artifactId>
>>>> + <packaging>pom</packaging>
>>>> + <name>Apache Log4j Plugins Module support</name>
>>>> + <description>Apache Log4j Plugin Moduels Support</description>
>>>> + <properties>
>>>> + <log4jParentDir>${basedir}/..</log4jParentDir>
>>>> + <docLabel>Log4j Plugins Documentation</docLabel>
>>>> + <projectDir>/plugins</projectDir>
>>>> + </properties>
>>>> + <dependencies>
>>>> + <dependency>
>>>> + <groupId>org.apache.logging.log4j</groupId>
>>>> + <artifactId>log4j-api</artifactId>
>>>> + </dependency>
>>>> + <dependency>
>>>> + <groupId>junit</groupId>
>>>> + <artifactId>junit</artifactId>
>>>> + <scope>test</scope>
>>>> + </dependency>
>>>> + <dependency>
>>>> + <groupId>org.apache.maven</groupId>
>>>> + <artifactId>maven-core</artifactId>
>>>> + <scope>test</scope>
>>>> + </dependency>
>>>> + </dependencies>
>>>> + <build>
>>>> + <plugins>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-toolchains-plugin</artifactId>
>>>> + <version>1.1</version>
>>>> + <executions>
>>>> + <execution>
>>>> + <goals>
>>>> + <goal>toolchain</goal>
>>>> + </goals>
>>>> + </execution>
>>>> + </executions>
>>>> + <configuration>
>>>> + <toolchains>
>>>> + <jdk>
>>>> + <version>[9, )</version>
>>>> + </jdk>
>>>> + </toolchains>
>>>> + </configuration>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-compiler-plugin</artifactId>
>>>> + <executions>
>>>> + <execution>
>>>> + <id>default-compile</id>
>>>> + <phase>compile</phase>
>>>> + <goals>
>>>> + <goal>compile</goal>
>>>> + </goals>
>>>> + </execution>
>>>> + <execution>
>>>> + <id>default-test-compile</id>
>>>> + <phase>test-compile</phase>
>>>> + <goals>
>>>> + <goal>testCompile</goal>
>>>> + </goals>
>>>> + </execution>
>>>> + </executions>
>>>> + <configuration>
>>>> + <source>9</source>
>>>> + <target>9</target>
>>>> + <release>9</release>
>>>> + <proc>none</proc>
>>>> + <!-- disable errorprone -->
>>>> + <compilerId>javac</compilerId>
>>>> + </configuration>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-surefire-plugin</artifactId>
>>>> + <!-- Do not upgrade until
>>>> https://issues.apache.org/jira/browse/SUREFIRE-720 is fixed -->
>>>> + <version>2.13</version>
>>>> + <executions>
>>>> + <execution>
>>>> + <id>test</id>
>>>> + <phase>test</phase>
>>>> + <goals>
>>>> + <goal>test</goal>
>>>> + </goals>
>>>> + </execution>
>>>> + </executions>
>>>> + <configuration>
>>>> + <systemPropertyVariables>
>>>> + <java.awt.headless>true</java.awt.headless>
>>>> + </systemPropertyVariables>
>>>> + <includes>
>>>> + <include>**/Test*.java</include>
>>>> + <include>**/*Test.java</include>
>>>> + </includes>
>>>> + <excludes>
>>>> + <exclude>**/*FuncTest.java</exclude>
>>>> + </excludes>
>>>> + </configuration>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <artifactId>maven-assembly-plugin</artifactId>
>>>> + <executions>
>>>> + <execution>
>>>> + <id>zip</id>
>>>> + <phase>package</phase>
>>>> + <goals>
>>>> + <goal>single</goal>
>>>> + </goals>
>>>> + <configuration>
>>>> +
>>>> <finalName>log4j-plugins-java9-${project.version}</finalName>
>>>> + <appendAssemblyId>false</appendAssemblyId>
>>>> + <descriptors>
>>>> + <descriptor>src/assembly/java9.xml</descriptor>
>>>> + </descriptors>
>>>> + </configuration>
>>>> + </execution>
>>>> + </executions>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-deploy-plugin</artifactId>
>>>> + <version>${deploy.plugin.version}</version>
>>>> + <configuration>
>>>> + <skip>true</skip>
>>>> + </configuration>
>>>> + </plugin>
>>>> + </plugins>
>>>> + </build>
>>>> +</project>
>>>> +
>>>> diff --git a/log4j-plugins-java9/src/assembly/java9.xml
>>>> b/log4j-plugins-java9/src/assembly/java9.xml
>>>> new file mode 100644
>>>> index 0000000..34649d4
>>>> --- /dev/null
>>>> +++ b/log4j-plugins-java9/src/assembly/java9.xml
>>>> @@ -0,0 +1,40 @@
>>>> +<?xml version='1.0' encoding='UTF-8'?>
>>>> +<!--
>>>> + 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.
>>>> +-->
>>>> +
>>>> +<assembly>
>>>> + <id>src</id>
>>>> + <formats>
>>>> + <format>zip</format>
>>>> + </formats>
>>>> + <baseDirectory>/</baseDirectory>
>>>> + <fileSets>
>>>> + <fileSet>
>>>> + <directory>${project.build.outputDirectory}</directory>
>>>> + <outputDirectory>/classes/META-INF/versions/9</outputDirectory>
>>>> + <includes>
>>>> + <include>module-info.class</include>
>>>> + </includes>
>>>> + <excludes>
>>>> + <exclude>**/Dummy.class</exclude>
>>>> + <exclude>**/PluginService.class</exclude>
>>>> + </excludes>
>>>> + </fileSet>
>>>> + </fileSets>
>>>> +</assembly>
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins-java9/src/main/java/module-info.java
>>>> similarity index 65%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to log4j-plugins-java9/src/main/java/module-info.java
>>>> index f22ba49..9802622 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++ b/log4j-plugins-java9/src/main/java/module-info.java
>>>> @@ -14,10 +14,13 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> +module org.apache.logging.log4j.plugins {
>>>> + exports org.apache.logging.log4j.plugins;
>>>> + exports org.apache.logging.log4j.plugins.convert;
>>>> + exports org.apache.logging.log4j.plugins.processor;
>>>> + exports org.apache.logging.log4j.plugins.util;
>>>> + exports org.apache.logging.log4j.plugins.validation;
>>>> + exports org.apache.logging.log4j.plugins.visitors;
>>>>
>>>> -/**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> - */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> + uses org.apache.logging.log4j.plugins.processor.PluginService;
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
>>>> similarity index 80%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
>>>> index f22ba49..14a90ed 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
>>>> @@ -14,10 +14,11 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> +package org.apache.logging.log4j.plugins;
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * This is a dummy class and is only here to allow module-info.java to
>>>> compile. It will not
>>>> + * be copied into the log4j-api module.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +public class Dummy {
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
>>>> similarity index 79%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
>>>> index f22ba49..10923e8 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
>>>> @@ -14,10 +14,11 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> +package org.apache.logging.log4j.plugins.convert;
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * This is a dummy class and is only here to allow module-info.java to
>>>> compile. It will not
>>>> + * be copied into the log4j-api module.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +public class Dummy {
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>>> similarity index 79%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>>> index f22ba49..b93ef59 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>>> @@ -14,10 +14,11 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> +package org.apache.logging.log4j.plugins.processor;
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * This is a dummy class and is only here to allow module-info.java to
>>>> compile. It will not
>>>> + * be copied into the log4j-api module.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +public class PluginService {
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
>>>> similarity index 80%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
>>>> index f22ba49..5940b03 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
>>>> @@ -14,10 +14,11 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> +package org.apache.logging.log4j.plugins.util;
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * This is a dummy class and is only here to allow module-info.java to
>>>> compile. It will not
>>>> + * be copied into the log4j-api module.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +public class Dummy {
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
>>>> similarity index 79%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
>>>> index f22ba49..14882b5 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
>>>> @@ -14,10 +14,11 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * This is a dummy class and is only here to allow module-info.java to
>>>> compile. It will not
>>>> + * be copied into the log4j-api module.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +public class Dummy {
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
>>>> similarity index 79%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
>>>> index f22ba49..5596338 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
>>>> @@ -14,10 +14,11 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * This is a dummy class and is only here to allow module-info.java to
>>>> compile. It will not
>>>> + * be copied into the log4j-api module.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +public class Dummy {
>>>> +}
>>>> diff --git a/log4j-plugins/pom.xml b/log4j-plugins/pom.xml
>>>> new file mode 100644
>>>> index 0000000..3551d51
>>>> --- /dev/null
>>>> +++ b/log4j-plugins/pom.xml
>>>> @@ -0,0 +1,360 @@
>>>> +<?xml version="1.0" encoding="UTF-8"?>
>>>> +<!--
>>>> + ~ 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.
>>>> + -->
>>>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>>>> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>>>> http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
>>>> ">
>>>> + <modelVersion>4.0.0</modelVersion>
>>>> + <parent>
>>>> + <groupId>org.apache.logging.log4j</groupId>
>>>> + <artifactId>log4j</artifactId>
>>>> + <version>3.0.0-SNAPSHOT</version>
>>>> + <relativePath>../</relativePath>
>>>> + </parent>
>>>> + <artifactId>log4j-plugins</artifactId>
>>>> + <packaging>jar</packaging>
>>>> + <name>Apache Log4j Plugins</name>
>>>> + <description>Log4j Plugin Support</description>
>>>> + <properties>
>>>> + <log4jParentDir>${basedir}/..</log4jParentDir>
>>>> + <docLabel>Plugin Documentation</docLabel>
>>>> + <projectDir>/plugins</projectDir>
>>>> + </properties>
>>>> + <dependencies>
>>>> + <dependency>
>>>> + <groupId>org.apache.logging.log4j</groupId>
>>>> + <artifactId>log4j-api</artifactId>
>>>> + </dependency>
>>>> + <!-- Classes and resources to be shaded into the core jar -->
>>>> + <dependency>
>>>> + <groupId>org.apache.logging.log4j</groupId>
>>>> + <artifactId>log4j-plugins-java9</artifactId>
>>>> + <scope>provided</scope>
>>>> + <type>zip</type>
>>>> + </dependency>
>>>> + <!-- Used for OSGi bundle support -->
>>>> + <dependency>
>>>> + <groupId>org.osgi</groupId>
>>>> + <artifactId>org.osgi.core</artifactId>
>>>> + <scope>provided</scope>
>>>> + </dependency>
>>>> +
>>>> + <!-- TEST DEPENDENCIES -->
>>>> +
>>>> + <!-- Pull in useful test classes from API -->
>>>> + <dependency>
>>>> + <groupId>org.apache.logging.log4j</groupId>
>>>> + <artifactId>log4j-api</artifactId>
>>>> + <type>test-jar</type>
>>>> + <scope>test</scope>
>>>> + </dependency>
>>>> + <dependency>
>>>> + <groupId>junit</groupId>
>>>> + <artifactId>junit</artifactId>
>>>> + <scope>test</scope>
>>>> + </dependency>
>>>> + <dependency>
>>>> + <groupId>org.hamcrest</groupId>
>>>> + <artifactId>hamcrest-all</artifactId>
>>>> + <scope>test</scope>
>>>> + </dependency>
>>>> + </dependencies>
>>>> + <build>
>>>> + <plugins>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-dependency-plugin</artifactId>
>>>> + <version>3.0.2</version>
>>>> + <executions>
>>>> + <execution>
>>>> + <id>unpack-classes</id>
>>>> + <phase>prepare-package</phase>
>>>> + <goals>
>>>> + <goal>unpack</goal>
>>>> + </goals>
>>>> + <configuration>
>>>> + <artifactItems>
>>>> + <artifactItem>
>>>> + <groupId>org.apache.logging.log4j</groupId>
>>>> + <artifactId>log4j-plugins-java9</artifactId>
>>>> + <version>${project.version}</version>
>>>> + <type>zip</type>
>>>> + <overWrite>false</overWrite>
>>>> + </artifactItem>
>>>> + </artifactItems>
>>>> + <includes>**/*.class</includes>
>>>> + <excludes>**/*.java</excludes>
>>>> +
>>>> <outputDirectory>${project.build.directory}</outputDirectory>
>>>> + <overWriteReleases>false</overWriteReleases>
>>>> + <overWriteSnapshots>true</overWriteSnapshots>
>>>> + </configuration>
>>>> + </execution>
>>>> + </executions>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <artifactId>maven-compiler-plugin</artifactId>
>>>> + <executions>
>>>> + <execution>
>>>> + <!-- disable annotation processing for first pass -->
>>>> + <id>generate-plugins</id>
>>>> + <phase>process-classes</phase>
>>>> + <goals>
>>>> + <goal>compile</goal>
>>>> + </goals>
>>>> + <configuration>
>>>> + <excludes>
>>>> + <exclude>module-info.java</exclude>
>>>> + </excludes>
>>>> + </configuration>
>>>> + </execution>
>>>> + <execution>
>>>> + <!-- disable annotation processing for first pass -->
>>>> + <id>generate-test-plugins</id>
>>>> + <phase>generate-test-sources</phase>
>>>> + <goals>
>>>> + <goal>compile</goal>
>>>> + </goals>
>>>> + <configuration>
>>>> + <excludes>
>>>> + <exclude>module-info.java</exclude>
>>>> + </excludes>
>>>> + <proc>only</proc>
>>>> + </configuration>
>>>> + </execution>
>>>> + <execution>
>>>> + <!-- disable annotation processing for first pass -->
>>>> + <id>default-compile</id>
>>>> + <configuration>
>>>> + <excludes>
>>>> + <exclude>module-info.java</exclude>
>>>> + </excludes>
>>>> + <proc>none</proc>
>>>> + </configuration>
>>>> + </execution>
>>>> + </executions>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <artifactId>maven-surefire-plugin</artifactId>
>>>> + <configuration>
>>>> + <excludedGroups>
>>>> + org.apache.logging.log4j.categories.PerformanceTests
>>>> + </excludedGroups>
>>>> + <systemPropertyVariables>
>>>> +
>>>> <org.apache.activemq.SERIALIZABLE_PACKAGES>*</org.apache.activemq.SERIALIZABLE_PACKAGES>
>>>> + </systemPropertyVariables>
>>>> + </configuration>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-failsafe-plugin</artifactId>
>>>> + <configuration>
>>>> + <skipTests>true</skipTests>
>>>> + </configuration>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-jar-plugin</artifactId>
>>>> + <executions>
>>>> + <execution>
>>>> + <id>default-jar</id>
>>>> + <goals>
>>>> + <goal>jar</goal>
>>>> + </goals>
>>>> + <configuration combine.self="override">
>>>> + <archive>
>>>> + <manifestFile>${manifestfile}</manifestFile>
>>>> + <manifestEntries>
>>>> + <Specification-Title>${project.name
>>>> }</Specification-Title>
>>>> +
>>>> <Specification-Version>${project.version}</Specification-Version>
>>>> + <Specification-Vendor>${project.organization.name
>>>> }</Specification-Vendor>
>>>> + <Implementation-Title>${project.name
>>>> }</Implementation-Title>
>>>> +
>>>> <Implementation-Version>${project.version}</Implementation-Version>
>>>> + <Implementation-Vendor>${project.organization.name
>>>> }</Implementation-Vendor>
>>>> +
>>>> <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
>>>> +
>>>> <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
>>>> +
>>>> <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
>>>> +
>>>> <Automatic-Module-Name>org.apache.logging.log4j.plugins</Automatic-Module-Name>
>>>> + <Multi-Release>true</Multi-Release>
>>>> + </manifestEntries>
>>>> + </archive>
>>>> + </configuration>
>>>> + </execution>
>>>> + <execution>
>>>> + <id>default</id>
>>>> + <goals>
>>>> + <goal>test-jar</goal>
>>>> + </goals>
>>>> + <configuration>
>>>> + <archive>
>>>> + <manifestFile>${manifestfile}</manifestFile>
>>>> + <manifestEntries>
>>>> + <Specification-Title>${project.name
>>>> }</Specification-Title>
>>>> +
>>>> <Specification-Version>${project.version}</Specification-Version>
>>>> + <Specification-Vendor>${project.organization.name
>>>> }</Specification-Vendor>
>>>> + <Implementation-Title>${project.name
>>>> }</Implementation-Title>
>>>> +
>>>> <Implementation-Version>${project.version}</Implementation-Version>
>>>> + <Implementation-Vendor>${project.organization.name
>>>> }</Implementation-Vendor>
>>>> +
>>>> <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
>>>> +
>>>> <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
>>>> +
>>>> <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
>>>> + </manifestEntries>
>>>> + </archive>
>>>> + </configuration>
>>>> + </execution>
>>>> + </executions>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.felix</groupId>
>>>> + <artifactId>maven-bundle-plugin</artifactId>
>>>> + <configuration>
>>>> + <instructions>
>>>> +
>>>> <Bundle-SymbolicName>org.apache.logging.log4j.plugins</Bundle-SymbolicName>
>>>> + <!-- TODO: exclude internal classes from export -->
>>>> +
>>>> <Export-Package>org.apache.logging.log4j.plugins.*</Export-Package>
>>>> + <Import-Package>
>>>> + sun.reflect;resolution:=optional,
>>>> + org.apache.logging.log4j.util,
>>>> + *
>>>> + </Import-Package>
>>>> +
>>>> <Bundle-Activator>org.apache.logging.log4j.plugins.osgi.Activator</Bundle-Activator>
>>>> + </instructions>
>>>> + </configuration>
>>>> + </plugin>
>>>> + </plugins>
>>>> + </build>
>>>> + <reporting>
>>>> + <plugins>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-changes-plugin</artifactId>
>>>> + <version>${changes.plugin.version}</version>
>>>> + <reportSets>
>>>> + <reportSet>
>>>> + <reports>
>>>> + <report>changes-report</report>
>>>> + </reports>
>>>> + </reportSet>
>>>> + </reportSets>
>>>> + <configuration>
>>>> +
>>>> <issueLinkTemplate>%URL%/show_bug.cgi?id=%ISSUE%</issueLinkTemplate>
>>>> + <useJql>true</useJql>
>>>> + </configuration>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-checkstyle-plugin</artifactId>
>>>> + <version>${checkstyle.plugin.version}</version>
>>>> + <configuration>
>>>> +
>>>> <!--<propertiesLocation>${vfs.parent.dir}/checkstyle.properties</propertiesLocation>
>>>> -->
>>>> +
>>>> <configLocation>${log4jParentDir}/checkstyle.xml</configLocation>
>>>> +
>>>> <suppressionsLocation>${log4jParentDir}/checkstyle-suppressions.xml</suppressionsLocation>
>>>> + <enableRulesSummary>false</enableRulesSummary>
>>>> + <propertyExpansion>basedir=${basedir}</propertyExpansion>
>>>> +
>>>> <propertyExpansion>licensedir=${log4jParentDir}/checkstyle-header.txt</propertyExpansion>
>>>> + </configuration>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-javadoc-plugin</artifactId>
>>>> + <version>${javadoc.plugin.version}</version>
>>>> + <configuration>
>>>> + <failOnError>false</failOnError>
>>>> + <bottom><![CDATA[<p align="center">Copyright ©
>>>> {inceptionYear}-{currentYear} {organizationName}. All Rights Reserved.<br />
>>>> + Apache Logging, Apache Log4j, Log4j, Apache, the Apache
>>>> feather logo, the Apache Logging project logo,
>>>> + and the Apache Log4j logo are trademarks of The Apache
>>>> Software Foundation.</p>]]></bottom>
>>>> + <!-- module link generation is completely broken in the javadoc
>>>> plugin for a multi-module non-aggregating
>>>> + project -->
>>>> + <additionalparam>${javadoc.opts}</additionalparam>
>>>> + <detectOfflineLinks>false</detectOfflineLinks>
>>>> + <linksource>true</linksource>
>>>> + <links>
>>>> + <link>http://docs.oracle.com/javaee/6/api/</link>
>>>> + <link>http://www.osgi.org/javadoc/r4v43/core/</link>
>>>> + <link>
>>>> https://commons.apache.org/proper/commons-lang/javadocs/api-release/
>>>> </link>
>>>> + </links>
>>>> + <groups>
>>>> + <group>
>>>> + <title>Core API</title>
>>>> + <packages>org.apache.logging.log4j.core</packages>
>>>> + </group>
>>>> + <group>
>>>> + <title>Configuration</title>
>>>> +
>>>> <packages>org.apache.logging.log4j.core.config*:org.apache.logging.log4j.core.selector</packages>
>>>> + </group>
>>>> + <group>
>>>> + <title>Core Plugins</title>
>>>> +
>>>> <packages>org.apache.logging.log4j.core.appender*:org.apache.logging.log4j.core.filter:org.apache.logging.log4j.core.layout:org.apache.logging.log4j.core.lookup:org.apache.logging.log4j.core.pattern:org.apache.logging.log4j.core.script</packages>
>>>> + </group>
>>>> + <group>
>>>> + <title>Tools</title>
>>>> + <packages>org.apache.logging.log4j.core.net
>>>> *:org.apache.logging.log4j.core.tools</packages>
>>>> + </group>
>>>> + <group>
>>>> + <title>Internals</title>
>>>> +
>>>> <packages>org.apache.logging.log4j.core.async:org.apache.logging.log4j.core.impl:org.apache.logging.log4j.core.util*:org.apache.logging.log4j.core.osgi:org.apache.logging.log4j.core.jackson:org.apache.logging.log4j.core.jmx</packages>
>>>> + </group>
>>>> + </groups>
>>>> + </configuration>
>>>> + <reportSets>
>>>> + <reportSet>
>>>> + <id>non-aggregate</id>
>>>> + <reports>
>>>> + <report>javadoc</report>
>>>> + </reports>
>>>> + </reportSet>
>>>> + </reportSets>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>com.github.spotbugs</groupId>
>>>> + <artifactId>spotbugs-maven-plugin</artifactId>
>>>> + <configuration>
>>>> + <fork>true</fork>
>>>> + <jvmArgs>-Duser.language=en</jvmArgs>
>>>> + <threshold>Normal</threshold>
>>>> + <effort>Default</effort>
>>>> +
>>>> <excludeFilterFile>${log4jParentDir}/spotbugs-exclude-filter.xml</excludeFilterFile>
>>>> + </configuration>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-jxr-plugin</artifactId>
>>>> + <version>${jxr.plugin.version}</version>
>>>> + <reportSets>
>>>> + <reportSet>
>>>> + <id>non-aggregate</id>
>>>> + <reports>
>>>> + <report>jxr</report>
>>>> + </reports>
>>>> + </reportSet>
>>>> + <reportSet>
>>>> + <id>aggregate</id>
>>>> + <reports>
>>>> + <report>aggregate</report>
>>>> + </reports>
>>>> + </reportSet>
>>>> + </reportSets>
>>>> + </plugin>
>>>> + <plugin>
>>>> + <groupId>org.apache.maven.plugins</groupId>
>>>> + <artifactId>maven-pmd-plugin</artifactId>
>>>> + <version>${pmd.plugin.version}</version>
>>>> + <configuration>
>>>> + <targetJdk>${maven.compiler.target}</targetJdk>
>>>> + </configuration>
>>>> + </plugin>
>>>> + </plugins>
>>>> + </reporting>
>>>> +</project>
>>>> +
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
>>>> similarity index 97%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
>>>> index c92c904..22fd9bf 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
>>>> @@ -14,15 +14,15 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config;
>>>> +package org.apache.logging.log4j.plugins;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>>>
>>>> import java.util.ArrayList;
>>>> import java.util.HashMap;
>>>> import java.util.List;
>>>> import java.util.Map;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>>>> -
>>>> /**
>>>> * A Configuration node.
>>>> */
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
>>>> similarity index 97%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
>>>> index 8aaf117..348754f 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
>>>> @@ -14,7 +14,9 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>> +
>>>> +import org.apache.logging.log4j.util.Strings;
>>>>
>>>> import java.lang.annotation.Documented;
>>>> import java.lang.annotation.ElementType;
>>>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>>>> import java.lang.annotation.RetentionPolicy;
>>>> import java.lang.annotation.Target;
>>>>
>>>> -import org.apache.logging.log4j.util.Strings;
>>>> -
>>>> /**
>>>> * Annotation that identifies a Class as a Plugin.
>>>> */
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
>>>> similarity index 87%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
>>>> index 7be3dea..4dce103 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
>>>> @@ -14,7 +14,7 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>>
>>>> import java.lang.annotation.Documented;
>>>> import java.lang.annotation.ElementType;
>>>> @@ -23,7 +23,7 @@ import java.lang.annotation.RetentionPolicy;
>>>> import java.lang.annotation.Target;
>>>>
>>>> /**
>>>> - * Identifies a list of aliases for a {@link Plugin}, {@link
>>>> PluginAttribute}, or {@link PluginBuilderAttribute}.
>>>> + * Identifies a list of aliases for a Plugin, PluginAttribute, or
>>>> PluginBuilderAttribute.
>>>> */
>>>> @Documented
>>>> @Retention(RetentionPolicy.RUNTIME)
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
>>>> similarity index 96%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
>>>> index bd88220..b9d4684 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
>>>> @@ -14,7 +14,10 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.visitors.PluginAttributeVisitor;
>>>> +import org.apache.logging.log4j.util.Strings;
>>>>
>>>> import java.lang.annotation.Documented;
>>>> import java.lang.annotation.ElementType;
>>>> @@ -22,9 +25,6 @@ import java.lang.annotation.Retention;
>>>> import java.lang.annotation.RetentionPolicy;
>>>> import java.lang.annotation.Target;
>>>>
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginAttributeVisitor;
>>>> -import org.apache.logging.log4j.util.Strings;
>>>> -
>>>> /**
>>>> * Identifies a Plugin Attribute and its default value. Note that only
>>>> one of the defaultFoo attributes will be
>>>> * used based on the type this annotation is attached to. Thus, for
>>>> primitive types, the default<i>Type</i>
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
>>>> similarity index 92%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
>>>> index 675d78f..c7fce2f 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
>>>> @@ -15,7 +15,10 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>> +
>>>> +import
>>>> org.apache.logging.log4j.plugins.visitors.PluginBuilderAttributeVisitor;
>>>> +import org.apache.logging.log4j.util.Strings;
>>>>
>>>> import java.lang.annotation.Documented;
>>>> import java.lang.annotation.ElementType;
>>>> @@ -23,9 +26,6 @@ import java.lang.annotation.Retention;
>>>> import java.lang.annotation.RetentionPolicy;
>>>> import java.lang.annotation.Target;
>>>>
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginBuilderAttributeVisitor;
>>>> -import org.apache.logging.log4j.util.Strings;
>>>> -
>>>> /**
>>>> * Marks a field as a Plugin Attribute.
>>>> */
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
>>>> similarity index 95%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
>>>> index 4e69262..035b025 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
>>>> @@ -15,7 +15,7 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>>
>>>> import java.lang.annotation.Documented;
>>>> import java.lang.annotation.ElementType;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
>>>> similarity index 91%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
>>>> index 7ea358b..6cfb6fa 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
>>>> @@ -14,7 +14,9 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.visitors.PluginElementVisitor;
>>>>
>>>> import java.lang.annotation.Documented;
>>>> import java.lang.annotation.ElementType;
>>>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>>>> import java.lang.annotation.RetentionPolicy;
>>>> import java.lang.annotation.Target;
>>>>
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor;
>>>> -
>>>> /**
>>>> * Identifies a parameter as a Plugin and corresponds with an XML element
>>>> (or equivalent) in configuration files.
>>>> */
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
>>>> similarity index 96%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
>>>> index 1c04106..b071510 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
>>>> @@ -14,7 +14,7 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>>
>>>> import java.lang.annotation.Documented;
>>>> import java.lang.annotation.ElementType;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
>>>> similarity index 90%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
>>>> index d60f1b5..b172268 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
>>>> @@ -14,7 +14,9 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.visitors.PluginNodeVisitor;
>>>>
>>>> import java.lang.annotation.Documented;
>>>> import java.lang.annotation.ElementType;
>>>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>>>> import java.lang.annotation.RetentionPolicy;
>>>> import java.lang.annotation.Target;
>>>>
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginNodeVisitor;
>>>> -
>>>> /**
>>>> * Identifies a Plugin configuration Node.
>>>> */
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
>>>> similarity index 91%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
>>>> index 9c20cc2..31e5a23 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
>>>> @@ -14,7 +14,9 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.visitors.PluginValueVisitor;
>>>>
>>>> import java.lang.annotation.Documented;
>>>> import java.lang.annotation.ElementType;
>>>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>>>> import java.lang.annotation.RetentionPolicy;
>>>> import java.lang.annotation.Target;
>>>>
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginValueVisitor;
>>>> -
>>>> /**
>>>> * Identifies a parameter as a value. These correspond with property
>>>> values generally, but are meant as values to be
>>>> * used as a placeholder value somewhere.
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
>>>> similarity index 89%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
>>>> index 65fcb76..093cc50 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
>>>> @@ -15,7 +15,9 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins;
>>>> +package org.apache.logging.log4j.plugins;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.visitors.PluginVisitor;
>>>>
>>>> import java.lang.annotation.Annotation;
>>>> import java.lang.annotation.Documented;
>>>> @@ -24,8 +26,6 @@ import java.lang.annotation.Retention;
>>>> import java.lang.annotation.RetentionPolicy;
>>>> import java.lang.annotation.Target;
>>>>
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor;
>>>> -
>>>> /**
>>>> * Meta-annotation to denote the class name to use that implements
>>>> * {@link
>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor} for
>>>> the annotated annotation.
>>>> @@ -40,5 +40,5 @@ public @interface PluginVisitorStrategy {
>>>> * for the given annotation. The generic type in {@code
>>>> PluginVisitor} should match the annotation this annotation
>>>> * is applied to.
>>>> */
>>>> - Class<? extends PluginVisitor<? extends Annotation>> value();
>>>> + Class<? extends PluginVisitor<? extends Annotation, ?>> value();
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
>>>> similarity index 95%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>>> copy to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
>>>> index 15a162c..fd8012a 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
>>>> @@ -14,7 +14,7 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>>> +package org.apache.logging.log4j.plugins.convert;
>>>>
>>>> import org.apache.logging.log4j.util.EnglishEnums;
>>>>
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
>>>> similarity index 95%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
>>>> index e629657..f9037b3 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
>>>> @@ -14,7 +14,7 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>>> +package org.apache.logging.log4j.plugins.convert;
>>>>
>>>> /**
>>>> * Converts Strings to hex. This is used in place of
>>>> java.xml.bind.DataTypeConverter which is not available by
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
>>>> similarity index 95%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
>>>> index e67e213..aaa5b4d 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
>>>> @@ -15,7 +15,7 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>>> +package org.apache.logging.log4j.plugins.convert;
>>>>
>>>> /**
>>>> * Interface for doing automatic String conversion to a specific type.
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
>>>> similarity index 92%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
>>>> index 5088f15..fb5b27e 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
>>>> @@ -14,7 +14,14 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>>> +package org.apache.logging.log4j.plugins.convert;
>>>> +
>>>> +import org.apache.logging.log4j.Logger;
>>>> +import org.apache.logging.log4j.plugins.util.PluginManager;
>>>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>>> +import org.apache.logging.log4j.plugins.util.TypeUtil;
>>>> +import org.apache.logging.log4j.util.ReflectionUtil;
>>>> +import org.apache.logging.log4j.status.StatusLogger;
>>>>
>>>> import java.lang.reflect.ParameterizedType;
>>>> import java.lang.reflect.Type;
>>>> @@ -25,13 +32,6 @@ import java.util.UnknownFormatConversionException;
>>>> import java.util.concurrent.ConcurrentHashMap;
>>>> import java.util.concurrent.ConcurrentMap;
>>>>
>>>> -import org.apache.logging.log4j.Logger;
>>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
>>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>>>> -import org.apache.logging.log4j.core.util.ReflectionUtil;
>>>> -import org.apache.logging.log4j.core.util.TypeUtil;
>>>> -import org.apache.logging.log4j.status.StatusLogger;
>>>> -
>>>> /**
>>>> * Registry for {@link TypeConverter} plugins.
>>>> *
>>>> @@ -152,7 +152,12 @@ public class TypeConverterRegistry {
>>>> }
>>>>
>>>> private void registerTypeAlias(final Type knownType, final Type
>>>> aliasType) {
>>>> - registry.putIfAbsent(aliasType, registry.get(knownType));
>>>> + TypeConverter<?> converter = registry.get(knownType);
>>>> + if (converter != null) {
>>>> + registry.putIfAbsent(aliasType, converter);
>>>> + } else {
>>>> + LOGGER.error("Cannot locate converter for {}", knownType);
>>>> + }
>>>> }
>>>>
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
>>>> similarity index 92%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
>>>> index dc833f0..7a71b4a 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
>>>> @@ -15,32 +15,27 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>>> +package org.apache.logging.log4j.plugins.convert;
>>>> +
>>>> +import org.apache.logging.log4j.Level;
>>>> +import org.apache.logging.log4j.Logger;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>> +import org.apache.logging.log4j.status.StatusLogger;
>>>> +import org.apache.logging.log4j.util.LoaderUtil;
>>>>
>>>> import java.io.File;
>>>> import java.math.BigDecimal;
>>>> import java.math.BigInteger;
>>>> -import java.net.InetAddress;
>>>> -import java.net.MalformedURLException;
>>>> -import java.net.URI;
>>>> -import java.net.URISyntaxException;
>>>> -import java.net.URL;
>>>> +import java.net.*;
>>>> import java.nio.charset.Charset;
>>>> import java.nio.file.Path;
>>>> import java.nio.file.Paths;
>>>> import java.security.Provider;
>>>> import java.security.Security;
>>>> +import java.util.Base64;
>>>> import java.util.UUID;
>>>> import java.util.regex.Pattern;
>>>>
>>>> -import org.apache.logging.log4j.Level;
>>>> -import org.apache.logging.log4j.Logger;
>>>> -import org.apache.logging.log4j.core.appender.rolling.action.Duration;
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> -import org.apache.logging.log4j.core.util.CronExpression;
>>>> -import org.apache.logging.log4j.status.StatusLogger;
>>>> -import org.apache.logging.log4j.util.LoaderUtil;
>>>> -
>>>> /**
>>>> * Collection of basic TypeConverter implementations. May be used to
>>>> register additional TypeConverters or find
>>>> * registered TypeConverters.
>>>> @@ -56,6 +51,8 @@ public final class TypeConverters {
>>>> */
>>>> public static final String CATEGORY = "TypeConverter";
>>>>
>>>> + private static final Base64.Decoder decoder = Base64.getDecoder();
>>>> +
>>>> /**
>>>> * Parses a {@link String} into a {@link BigDecimal}.
>>>> */
>>>> @@ -112,7 +109,7 @@ public final class TypeConverters {
>>>> bytes = new byte[0];
>>>> } else if (value.startsWith(PREFIX_BASE64)) {
>>>> final String lexicalXSDBase64Binary =
>>>> value.substring(PREFIX_BASE64.length());
>>>> - bytes =
>>>> Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
>>>> + bytes = decoder.decode(lexicalXSDBase64Binary);
>>>> } else if (value.startsWith(PREFIX_0x)) {
>>>> final String lexicalXSDHexBinary =
>>>> value.substring(PREFIX_0x.length());
>>>> bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
>>>> @@ -203,14 +200,6 @@ public final class TypeConverters {
>>>> }
>>>> }
>>>>
>>>> - @Plugin(name = "CronExpression", category = CATEGORY)
>>>> - public static class CronExpressionConverter implements
>>>> TypeConverter<CronExpression> {
>>>> - @Override
>>>> - public CronExpression convert(final String s) throws Exception {
>>>> - return new CronExpression(s);
>>>> - }
>>>> - }
>>>> -
>>>> /**
>>>> * Converts a {@link String} into a {@link Double}.
>>>> */
>>>> @@ -223,18 +212,6 @@ public final class TypeConverters {
>>>> }
>>>>
>>>> /**
>>>> - * Converts a {@link String} into a {@link Duration}.
>>>> - * @since 2.5
>>>> - */
>>>> - @Plugin(name = "Duration", category = CATEGORY)
>>>> - public static class DurationConverter implements
>>>> TypeConverter<Duration> {
>>>> - @Override
>>>> - public Duration convert(final String s) {
>>>> - return Duration.parse(s);
>>>> - }
>>>> - }
>>>> -
>>>> - /**
>>>> * Converts a {@link String} into a {@link File}.
>>>> */
>>>> @Plugin(name = "File", category = CATEGORY)
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
>>>> similarity index 80%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
>>>> index f22ba49..958beb4 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
>>>> @@ -16,8 +16,7 @@
>>>> */
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * TypeConverter plugins for converter strings into various types. These
>>>> plugins are used for parsing plugin
>>>> + * attributes in plugin factory methods.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +package org.apache.logging.log4j.plugins.convert;
>>>> diff --git
>>>> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
>>>> new file mode 100644
>>>> index 0000000..518bee7
>>>> --- /dev/null
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
>>>> @@ -0,0 +1,103 @@
>>>> +/*
>>>> + * 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.plugins.osgi;
>>>> +
>>>> +import org.apache.logging.log4j.LogManager;
>>>> +import org.apache.logging.log4j.Logger;
>>>> +import org.apache.logging.log4j.plugins.processor.PluginService;
>>>> +import org.apache.logging.log4j.plugins.util.PluginRegistry;
>>>> +import org.apache.logging.log4j.spi.Provider;
>>>> +import org.apache.logging.log4j.status.StatusLogger;
>>>> +import org.apache.logging.log4j.util.PropertiesUtil;
>>>> +import org.osgi.framework.*;
>>>> +import org.osgi.framework.wiring.BundleWiring;
>>>> +
>>>> +import java.util.Hashtable;
>>>> +import java.util.concurrent.atomic.AtomicReference;
>>>> +
>>>> +/**
>>>> + * OSGi BundleActivator.
>>>> + */
>>>> +public final class Activator implements BundleActivator,
>>>> SynchronousBundleListener {
>>>> +
>>>> + private static final Logger LOGGER = StatusLogger.getLogger();
>>>> +
>>>> + private final AtomicReference<BundleContext> contextRef = new
>>>> AtomicReference<>();
>>>> +
>>>> + ServiceRegistration provideRegistration = null;
>>>> +
>>>> + @Override
>>>> + public void start(final BundleContext context) throws Exception {
>>>> + final PluginService pluginService = new Log4jProvider();
>>>> + final Hashtable<String, String> props = new Hashtable<>();
>>>> + props.put("APIVersion", "3.0");
>>>> + provideRegistration =
>>>> context.registerService(pluginService.class.getName(), provider, props);
>>>> + if (this.contextRef.compareAndSet(null, context)) {
>>>> + context.addBundleListener(this);
>>>> + // done after the BundleListener as to not miss any new
>>>> bundle installs in the interim
>>>> + scanInstalledBundlesForPlugins(context);
>>>> + }
>>>> + }
>>>> +
>>>> + private static void scanInstalledBundlesForPlugins(final
>>>> BundleContext context) {
>>>> + final Bundle[] bundles = context.getBundles();
>>>> + for (final Bundle bundle : bundles) {
>>>> + // TODO: bundle state can change during this
>>>> + scanBundleForPlugins(bundle);
>>>> + }
>>>> + }
>>>> +
>>>> + private static void scanBundleForPlugins(final Bundle bundle) {
>>>> + final long bundleId = bundle.getBundleId();
>>>> + // LOG4J2-920: don't scan system bundle for plugins
>>>> + if (bundle.getState() == Bundle.ACTIVE && bundleId != 0) {
>>>> + LOGGER.trace("Scanning bundle [{}, id=%d] for plugins.",
>>>> bundle.getSymbolicName(), bundleId);
>>>> + PluginRegistry.getInstance().loadFromBundle(bundleId,
>>>> + bundle.adapt(BundleWiring.class).getClassLoader());
>>>> + }
>>>> + }
>>>> +
>>>> + private static void stopBundlePlugins(final Bundle bundle) {
>>>> + LOGGER.trace("Stopping bundle [{}] plugins.",
>>>> bundle.getSymbolicName());
>>>> + // TODO: plugin lifecycle code
>>>> +
>>>> PluginRegistry.getInstance().clearBundlePlugins(bundle.getBundleId());
>>>> + }
>>>> +
>>>> + @Override
>>>> + public void stop(final BundleContext context) throws Exception {
>>>> + provideRegistration.unregister();
>>>> + this.contextRef.compareAndSet(context, null);
>>>> + }
>>>> +
>>>> + @Override
>>>> + public void bundleChanged(final BundleEvent event) {
>>>> + switch (event.getType()) {
>>>> + // FIXME: STARTING instead of STARTED?
>>>> + case BundleEvent.STARTED:
>>>> + scanBundleForPlugins(event.getBundle());
>>>> + break;
>>>> +
>>>> + case BundleEvent.STOPPING:
>>>> + stopBundlePlugins(event.getBundle());
>>>> + break;
>>>> +
>>>> + default:
>>>> + break;
>>>> + }
>>>> + }
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
>>>> similarity index 87%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
>>>> index f22ba49..37dadd4 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
>>>> @@ -16,8 +16,6 @@
>>>> */
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * Collection of OSGi-specific classes for bundles.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +package org.apache.logging.log4j.plugins.osgi;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
>>>> similarity index 87%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
>>>> index f22ba49..b161185 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
>>>> @@ -16,8 +16,6 @@
>>>> */
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * Annotations for Log4j 2 plugins.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +package org.apache.logging.log4j.plugins;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
>>>> similarity index 71%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
>>>> index 2fd4160..784dece 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
>>>> @@ -15,7 +15,7 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>>> +package org.apache.logging.log4j.plugins.processor;
>>>>
>>>> import java.io.BufferedInputStream;
>>>> import java.io.BufferedOutputStream;
>>>> @@ -60,34 +60,6 @@ public class PluginCache {
>>>> }
>>>>
>>>> /**
>>>> - * 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) 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());
>>>> - }
>>>> - }
>>>> - }
>>>> - }
>>>> -
>>>> - /**
>>>> * Loads and merges all the Log4j plugin cache files specified.
>>>> Usually, this is obtained via a ClassLoader.
>>>> *
>>>> * @param resources URLs to all the desired plugin cache files to
>>>> load.
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
>>>> similarity index 85%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
>>>> index dd43601..bd452d3 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
>>>> @@ -15,7 +15,7 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>>> +package org.apache.logging.log4j.plugins.processor;
>>>>
>>>> import java.io.Serializable;
>>>>
>>>> @@ -32,6 +32,18 @@ public class PluginEntry implements Serializable {
>>>> private boolean defer;
>>>> private transient String category;
>>>>
>>>> + public PluginEntry() {
>>>> + }
>>>> +
>>>> + public PluginEntry(String key, String className, String name, boolean
>>>> printable, boolean defer, String category) {
>>>> + this.key = key;
>>>> + this.className = className;
>>>> + this.name = name;
>>>> + this.printable = printable;
>>>> + this.defer = defer;
>>>> + this.category = category;
>>>> + }
>>>> +
>>>> public String getKey() {
>>>> return key;
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
>>>> similarity index 54%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
>>>> index 2f3b53f..975d2ab 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
>>>> @@ -15,38 +15,47 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>>> +package org.apache.logging.log4j.plugins.processor;
>>>> +
>>>> +import org.apache.logging.log4j.LoggingException;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>> +import org.apache.logging.log4j.plugins.PluginAliases;
>>>> +import org.apache.logging.log4j.util.Strings;
>>>>
>>>> -import java.io.IOException;
>>>> -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;
>>>> import javax.annotation.processing.AbstractProcessor;
>>>> +import javax.annotation.processing.Messager;
>>>> import javax.annotation.processing.RoundEnvironment;
>>>> import javax.annotation.processing.SupportedAnnotationTypes;
>>>> import javax.lang.model.SourceVersion;
>>>> import javax.lang.model.element.Element;
>>>> import javax.lang.model.element.ElementVisitor;
>>>> +import javax.lang.model.element.Name;
>>>> import javax.lang.model.element.TypeElement;
>>>> import javax.lang.model.util.Elements;
>>>> import javax.lang.model.util.SimpleElementVisitor7;
>>>> import javax.tools.Diagnostic.Kind;
>>>> import javax.tools.FileObject;
>>>> +import javax.tools.JavaFileObject;
>>>> import javax.tools.StandardLocation;
>>>> +import java.io.BufferedWriter;
>>>> +import java.io.IOException;
>>>> +import java.io.OutputStreamWriter;
>>>> +import java.io.PrintWriter;
>>>> +import java.util.ArrayList;
>>>> +import java.util.Collection;
>>>> +import java.util.Collections;
>>>> +import java.util.List;
>>>> +import java.util.Locale;
>>>> +import java.util.Map;
>>>> +import java.util.Objects;
>>>> +import java.util.Set;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
>>>> -import org.apache.logging.log4j.util.Strings;
>>>> +import static java.nio.charset.StandardCharsets.UTF_8;
>>>>
>>>> /**
>>>> * Annotation processor for pre-scanning Log4j 2 plugins.
>>>> */
>>>>
>>>> -@SupportedAnnotationTypes("org.apache.logging.log4j.core.config.plugins.*")
>>>> +@SupportedAnnotationTypes({"org.apache.logging.log4j.plugins.*",
>>>> "org.apache.logging.log4j.core.config.plugins.*"})
>>>> public class PluginProcessor extends AbstractProcessor {
>>>>
>>>> // TODO: this could be made more abstract to allow for compile-time
>>>> and run-time plugin processing
>>>> @@ -57,8 +66,8 @@ public class PluginProcessor extends AbstractProcessor {
>>>> */
>>>> public static final String PLUGIN_CACHE_FILE =
>>>>
>>>> "META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat";
>>>> -
>>>> - private final PluginCache pluginCache = new PluginCache();
>>>> + private static final String SERVICE_FILE_NAME =
>>>> +
>>>> "META-INF/services/org.apache.logging.log4j.plugins.processor.PluginService";
>>>>
>>>> @Override
>>>> public SourceVersion getSupportedSourceVersion() {
>>>> @@ -67,16 +76,21 @@ public class PluginProcessor extends AbstractProcessor
>>>> {
>>>>
>>>> @Override
>>>> public boolean process(final Set<? extends TypeElement> annotations,
>>>> final RoundEnvironment roundEnv) {
>>>> - System.out.println("Processing annotations");
>>>> + Map<String, String> options = processingEnv.getOptions();
>>>> + String packageName = options.get("pluginPackage");
>>>> + Messager messager = processingEnv.getMessager();
>>>> + messager.printMessage(Kind.NOTE, "Processing Log4j annotations");
>>>> try {
>>>> final Set<? extends Element> elements =
>>>> roundEnv.getElementsAnnotatedWith(Plugin.class);
>>>> if (elements.isEmpty()) {
>>>> - System.out.println("No elements to process");
>>>> + messager.printMessage(Kind.NOTE, "No elements to
>>>> process");
>>>> return false;
>>>> }
>>>> - collectPlugins(elements);
>>>> - writeCacheFile(elements.toArray(new
>>>> Element[elements.size()]));
>>>> - System.out.println("Annotations processed");
>>>> + List<PluginEntry> list = new ArrayList<>();
>>>> + packageName = collectPlugins(packageName, elements, list);
>>>> + writeClassFile(packageName, list);
>>>> + writeServiceFile(packageName);
>>>> + messager.printMessage(Kind.NOTE, "Annotations processed");
>>>> return true;
>>>> } catch (final IOException e) {
>>>> e.printStackTrace();
>>>> @@ -93,7 +107,8 @@ public class PluginProcessor extends AbstractProcessor {
>>>> processingEnv.getMessager().printMessage(Kind.ERROR, message);
>>>> }
>>>>
>>>> - private void collectPlugins(final Iterable<? extends Element>
>>>> elements) {
>>>> + private String collectPlugins(String packageName, final Iterable<?
>>>> extends Element> elements, List<PluginEntry> list) {
>>>> + boolean calculatePackage = packageName == null;
>>>> final Elements elementUtils = processingEnv.getElementUtils();
>>>> final ElementVisitor<PluginEntry, Plugin> pluginVisitor = new
>>>> PluginElementVisitor(elementUtils);
>>>> final ElementVisitor<Collection<PluginEntry>, Plugin>
>>>> pluginAliasesVisitor = new PluginAliasesElementVisitor(
>>>> @@ -104,23 +119,93 @@ public class PluginProcessor extends
>>>> AbstractProcessor {
>>>> continue;
>>>> }
>>>> final PluginEntry entry = element.accept(pluginVisitor,
>>>> plugin);
>>>> - final Map<String, PluginEntry> category =
>>>> pluginCache.getCategory(entry.getCategory());
>>>> - category.put(entry.getKey(), entry);
>>>> + list.add(entry);
>>>> + if (calculatePackage) {
>>>> + packageName = calculatePackage(elementUtils, element,
>>>> packageName);
>>>> + }
>>>> final Collection<PluginEntry> entries =
>>>> element.accept(pluginAliasesVisitor, plugin);
>>>> for (final PluginEntry pluginEntry : entries) {
>>>> - category.put(pluginEntry.getKey(), pluginEntry);
>>>> + list.add(pluginEntry);
>>>> }
>>>> }
>>>> + return packageName;
>>>> }
>>>>
>>>> - private void writeCacheFile(final Element... elements) throws
>>>> IOException {
>>>> + private String calculatePackage(Elements elements, Element element,
>>>> String packageName) {
>>>> + Name name = elements.getPackageOf(element).getQualifiedName();
>>>> + if (name == null) {
>>>> + return null;
>>>> + }
>>>> + String pkgName = name.toString();
>>>> + if (packageName == null) {
>>>> + return pkgName;
>>>> + }
>>>> + if (pkgName.length() == packageName.length()) {
>>>> + return packageName;
>>>> + }
>>>> + if (pkgName.length() < packageName.length() &&
>>>> packageName.startsWith(pkgName)) {
>>>> + return pkgName;
>>>> + }
>>>> +
>>>> + return commonPrefix(pkgName, packageName);
>>>> + }
>>>> +
>>>> + private void writeServiceFile(String pkgName) 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);
>>>> + SERVICE_FILE_NAME);
>>>> + try (final PrintWriter writer = new PrintWriter(new
>>>> BufferedWriter(new OutputStreamWriter(fileObject.openOutputStream(),
>>>> UTF_8)))) {
>>>> + writer.println(createFqcn(pkgName));
>>>> + }
>>>> + }
>>>> +
>>>> + private void writeClassFile(String pkg, List<PluginEntry> list) {
>>>> + String fqcn = createFqcn(pkg);
>>>> + try (final PrintWriter writer = createSourceFile(fqcn)) {
>>>> + writer.println("package " + pkg + ".plugins;");
>>>> + writer.println("");
>>>> + writer.println("import
>>>> org.apache.logging.log4j.plugins.processor.PluginEntry;");
>>>> + writer.println("import
>>>> org.apache.logging.log4j.plugins.processor.PluginService;");
>>>> + writer.println("");
>>>> + writer.println("public class Log4jPlugins extends
>>>> PluginService {");
>>>> + writer.println("");
>>>> + writer.println(" private static PluginEntry[] entries =
>>>> new PluginEntry[] {");
>>>> + StringBuilder sb = new StringBuilder();
>>>> + int max = list.size() - 1;
>>>> + for (int i = 0; i < list.size(); ++i) {
>>>> + PluginEntry entry = list.get(i);
>>>> + sb.append(" ").append("new PluginEntry(\"");
>>>> + sb.append(entry.getKey()).append("\", \"");
>>>> + sb.append(entry.getClassName()).append("\", \"");
>>>> + sb.append(entry.getName()).append("\", ");
>>>> + sb.append(entry.isPrintable()).append(", ");
>>>> + sb.append(entry.isDefer()).append(", \"");
>>>> + sb.append(entry.getCategory()).append("\")");
>>>> + if (i < max) {
>>>> + sb.append(",");
>>>> + }
>>>> + writer.println(sb.toString());
>>>> + sb.setLength(0);
>>>> + }
>>>> + writer.println(" };");
>>>> + writer.println(" @Override");
>>>> + writer.println(" public PluginEntry[] getEntries() {
>>>> return entries;}");
>>>> + writer.println("}");
>>>> }
>>>> }
>>>>
>>>> + private PrintWriter createSourceFile(String fqcn) {
>>>> + try {
>>>> + JavaFileObject sourceFile =
>>>> processingEnv.getFiler().createSourceFile(fqcn);
>>>> + return new PrintWriter(sourceFile.openWriter());
>>>> + } catch (IOException e) {
>>>> + throw new LoggingException("Unable to create Plugin Service
>>>> Class " + fqcn, e);
>>>> + }
>>>> + }
>>>> +
>>>> + private String createFqcn(String packageName) {
>>>> + return packageName + ".plugins.Log4jPlugins";
>>>> + }
>>>> +
>>>> /**
>>>> * ElementVisitor to scan the Plugin annotation.
>>>> */
>>>> @@ -146,6 +231,20 @@ public class PluginProcessor extends
>>>> AbstractProcessor {
>>>> }
>>>> }
>>>>
>>>> + private String commonPrefix(String str1, String str2) {
>>>> + int minLength = str1.length() < str2.length() ? str1.length() :
>>>> str2.length();
>>>> + for (int i = 0; i < minLength; i++) {
>>>> + if (str1.charAt(i) != str2.charAt(i)) {
>>>> + if (i > 1 && str1.charAt(i-1) == '.') {
>>>> + return str1.substring(0, i-1);
>>>> + } else {
>>>> + return str1.substring(0, i);
>>>> + }
>>>> + }
>>>> + }
>>>> + return str1.substring(0, minLength);
>>>> + }
>>>> +
>>>> /**
>>>> * ElementVisitor to scan the PluginAliases annotation.
>>>> */
>>>> diff --git
>>>> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>>> new file mode 100644
>>>> index 0000000..5042456
>>>> --- /dev/null
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>>> @@ -0,0 +1,56 @@
>>>> +/*
>>>> + * 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.plugins.processor;
>>>> +
>>>> +import java.util.Collections;
>>>> +import java.util.LinkedHashMap;
>>>> +import java.util.Map;
>>>> +
>>>> +/**
>>>> + * Class Description goes here.
>>>> + */
>>>> +public abstract class PluginService {
>>>> +
>>>> + private final Map<String, Map<String, PluginEntry>> categories = new
>>>> LinkedHashMap<>();
>>>> +
>>>> + public PluginService() {
>>>> + PluginEntry[] entries = getEntries();
>>>> + for (PluginEntry entry : entries) {
>>>> + String category = entry.getCategory().toLowerCase();
>>>> + if (!categories.containsKey(category)) {
>>>> + categories.put(category, new LinkedHashMap<>());
>>>> + }
>>>> + Map<String, PluginEntry> map = categories.get(category);
>>>> + map.put(entry.getKey(), entry);
>>>> + }
>>>> + }
>>>> +
>>>> + public abstract PluginEntry[] getEntries();
>>>> +
>>>> + public Map<String, Map<String, PluginEntry>> getCategories() {
>>>> + return Collections.unmodifiableMap(categories);
>>>> + }
>>>> +
>>>> + public Map<String, PluginEntry> getCategory(String category) {
>>>> + return
>>>> Collections.unmodifiableMap(categories.get(category.toLowerCase()));
>>>> + }
>>>> +
>>>> + public long size() {
>>>> + return categories.size();
>>>> + }
>>>> +
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
>>>> similarity index 94%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>>> copy to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
>>>> index 4f6ddda..2c296f9 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
>>>> @@ -19,4 +19,4 @@
>>>> * Java annotation processor for pre-scanning Log4j 2 plugins. This is
>>>> provided as an alternative to using the
>>>> * executable {@link
>>>> org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in
>>>> your build process.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>>> +package org.apache.logging.log4j.plugins.processor;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
>>>> similarity index 93%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
>>>> index 0935ce8..ec8a07f 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
>>>> @@ -15,7 +15,7 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.util;
>>>> +package org.apache.logging.log4j.plugins.util;
>>>>
>>>> /**
>>>> * A type of builder that can be used to configure and create a instances
>>>> using a Java DSL instead of
>>>> @@ -25,7 +25,7 @@ package org.apache.logging.log4j.core.util;
>>>> * <p>
>>>> * When creating <em>plugin</em> builders, it is customary to create
>>>> the builder class as a public static inner class
>>>> * called {@code Builder}. For instance, the builder class for
>>>> - * {@link org.apache.logging.log4j.core.layout.PatternLayout
>>>> PatternLayout} would be
>>>> + * org.apache.logging.log4j.core.layout.PatternLayout PatternLayout
>>>> would be
>>>> * {@code PatternLayout.Builder}.
>>>> * </p>
>>>> *
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
>>>> similarity index 96%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
>>>> index 6f38d0e..b6f02f5 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
>>>> @@ -15,17 +15,13 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>>> +package org.apache.logging.log4j.plugins.util;
>>>>
>>>> import org.apache.logging.log4j.Logger;
>>>> import org.apache.logging.log4j.status.StatusLogger;
>>>> import org.apache.logging.log4j.util.Strings;
>>>>
>>>> -import java.util.Collection;
>>>> -import java.util.HashMap;
>>>> -import java.util.LinkedHashMap;
>>>> -import java.util.List;
>>>> -import java.util.Map;
>>>> +import java.util.*;
>>>> import java.util.concurrent.CopyOnWriteArrayList;
>>>>
>>>> /**
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
>>>> similarity index 81%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
>>>> index 99fa610..9e8c6e2 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
>>>> @@ -15,32 +15,28 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>>> +package org.apache.logging.log4j.plugins.util;
>>>> +
>>>> +import org.apache.logging.log4j.Logger;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>> +import org.apache.logging.log4j.plugins.PluginAliases;
>>>> +import org.apache.logging.log4j.plugins.processor.PluginCache;
>>>> +import org.apache.logging.log4j.plugins.processor.PluginEntry;
>>>> +import org.apache.logging.log4j.plugins.processor.PluginProcessor;
>>>> +import org.apache.logging.log4j.plugins.processor.PluginService;
>>>> +import org.apache.logging.log4j.status.StatusLogger;
>>>> +import org.apache.logging.log4j.util.LoaderUtil;
>>>> +import org.apache.logging.log4j.util.Strings;
>>>>
>>>> import java.io.IOException;
>>>> import java.net.URI;
>>>> import java.net.URL;
>>>> import java.text.DecimalFormat;
>>>> -import java.util.ArrayList;
>>>> -import java.util.Collections;
>>>> -import java.util.Enumeration;
>>>> -import java.util.HashMap;
>>>> -import java.util.List;
>>>> -import java.util.Map;
>>>> +import java.util.*;
>>>> import java.util.concurrent.ConcurrentHashMap;
>>>> import java.util.concurrent.ConcurrentMap;
>>>> import java.util.concurrent.atomic.AtomicReference;
>>>>
>>>> -import org.apache.logging.log4j.Logger;
>>>> -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;
>>>> -import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor;
>>>> -import org.apache.logging.log4j.core.util.Loader;
>>>> -import org.apache.logging.log4j.status.StatusLogger;
>>>> -import org.apache.logging.log4j.util.Strings;
>>>> -
>>>> /**
>>>> * Registry singleton for PluginType maps partitioned by source type and
>>>> then by category names.
>>>> */
>>>> @@ -116,7 +112,8 @@ public class PluginRegistry {
>>>> // already loaded
>>>> return existing;
>>>> }
>>>> - final Map<String, List<PluginType<?>>> newPluginsByCategory =
>>>> decodeCacheFiles(Loader.getClassLoader());
>>>> + final Map<String, List<PluginType<?>>> newPluginsByCategory =
>>>> decodeCacheFiles(LoaderUtil.getClassLoader());
>>>> + loadPlugins(newPluginsByCategory);
>>>>
>>>> // Note multiple threads could be calling this method
>>>> concurrently. Both will do the work,
>>>> // but only one will be allowed to store the result in the
>>>> AtomicReference.
>>>> @@ -144,6 +141,7 @@ public class PluginRegistry {
>>>> return existing;
>>>> }
>>>> final Map<String, List<PluginType<?>>> newPluginsByCategory =
>>>> decodeCacheFiles(loader);
>>>> + loadPlugins(loader, newPluginsByCategory);
>>>>
>>>> // Note multiple threads could be calling this method
>>>> concurrently. Both will do the work,
>>>> // but only one will be allowed to store the result in the outer
>>>> map.
>>>> @@ -155,6 +153,51 @@ public class PluginRegistry {
>>>> return newPluginsByCategory;
>>>> }
>>>>
>>>> + /**
>>>> + * @since 3.0
>>>> + */
>>>> + public void loadPlugins(Map<String, List<PluginType<?>>> map) {
>>>> + for (ClassLoader classLoader : LoaderUtil.getClassLoaders()) {
>>>> + try {
>>>> + loadPlugins(classLoader, map);
>>>> + } catch (Throwable ex) {
>>>> + LOGGER.debug("Unable to retrieve provider from
>>>> ClassLoader {}", classLoader, ex);
>>>> + }
>>>> + }
>>>> + }
>>>> +
>>>> + /**
>>>> + * @since 3.0
>>>> + */
>>>> + public void loadPlugins(ClassLoader classLoader, Map<String,
>>>> List<PluginType<?>>> map) {
>>>> + final long startTime = System.nanoTime();
>>>> + final ServiceLoader<PluginService> serviceLoader =
>>>> ServiceLoader.load(PluginService.class, classLoader);
>>>> + int pluginCount = 0;
>>>> + for (final PluginService pluginService : serviceLoader) {
>>>> + PluginEntry[] entries = pluginService.getEntries();
>>>> + for (PluginEntry entry : entries) {
>>>> + try {
>>>> + final Class<?> clazz =
>>>> classLoader.loadClass(entry.getClassName());
>>>> + final PluginType<?> type = new PluginType(entry,
>>>> clazz, entry.getName());
>>>> + String category = entry.getCategory().toLowerCase();
>>>> + if (!map.containsKey(category)) {
>>>> + map.put(category, new ArrayList<>());
>>>> + }
>>>> + List<PluginType<?>> list = map.get(category);
>>>> + list.add(type);
>>>> + ++pluginCount;
>>>> + } catch (final ClassNotFoundException e) {
>>>> + LOGGER.info("Plugin [{}] could not be loaded due to
>>>> missing classes.", entry.getClassName(), e);
>>>> + }
>>>> + }
>>>> + }
>>>> + final long endTime = System.nanoTime();
>>>> + final DecimalFormat numFormat = new DecimalFormat("#0.000000");
>>>> + final double seconds = (endTime - startTime) * 1e-9;
>>>> + LOGGER.debug("Took {} seconds to load {} plugins from {}",
>>>> + numFormat.format(seconds), pluginCount, classLoader);
>>>> + }
>>>> +
>>>> private Map<String, List<PluginType<?>>> decodeCacheFiles(final
>>>> ClassLoader loader) {
>>>> final long startTime = System.nanoTime();
>>>> final PluginCache cache = new PluginCache();
>>>> @@ -214,7 +257,7 @@ public class PluginRegistry {
>>>>
>>>> final long startTime = System.nanoTime();
>>>> final ResolverUtil resolver = new ResolverUtil();
>>>> - final ClassLoader classLoader = Loader.getClassLoader();
>>>> + final ClassLoader classLoader = LoaderUtil.getClassLoader();
>>>> if (classLoader != null) {
>>>> resolver.setClassLoader(classLoader);
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
>>>> similarity index 92%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
>>>> index cc6bc66..c213f64 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
>>>> @@ -14,16 +14,16 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>>> +package org.apache.logging.log4j.plugins.util;
>>>>
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
>>>> +import org.apache.logging.log4j.plugins.processor.PluginEntry;
>>>>
>>>> /**
>>>> * Plugin Descriptor. This is a memento object for Plugin annotations
>>>> paired to their annotated classes.
>>>> *
>>>> * @param <T> The plug-in class, which can be any kind of class.
>>>> - * @see org.apache.logging.log4j.core.config.plugins.Plugin
>>>> + * @see org.apache.logging.log4j.plugins.Plugin
>>>> */
>>>> public class PluginType<T> {
>>>>
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
>>>> similarity index 97%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
>>>> index 73b5fc0..a57356c 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
>>>> @@ -14,33 +14,24 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>>> +package org.apache.logging.log4j.plugins.util;
>>>>
>>>> -import java.io.File;
>>>> -import java.io.FileInputStream;
>>>> -import java.io.IOException;
>>>> -import java.io.InputStream;
>>>> -import java.io.UnsupportedEncodingException;
>>>> +import org.apache.logging.log4j.Logger;
>>>> +import org.apache.logging.log4j.util.LoaderUtil;
>>>> +import org.apache.logging.log4j.status.StatusLogger;
>>>> +import org.osgi.framework.FrameworkUtil;
>>>> +import org.osgi.framework.wiring.BundleWiring;
>>>> +
>>>> +import java.io.*;
>>>> import java.net.URI;
>>>> import java.net.URISyntaxException;
>>>> import java.net.URL;
>>>> import java.net.URLDecoder;
>>>> import java.nio.charset.StandardCharsets;
>>>> -import java.util.Arrays;
>>>> -import java.util.Collection;
>>>> -import java.util.Enumeration;
>>>> -import java.util.HashSet;
>>>> -import java.util.List;
>>>> -import java.util.Set;
>>>> +import java.util.*;
>>>> import java.util.jar.JarEntry;
>>>> import java.util.jar.JarInputStream;
>>>>
>>>> -import org.apache.logging.log4j.Logger;
>>>> -import org.apache.logging.log4j.core.util.Loader;
>>>> -import org.apache.logging.log4j.status.StatusLogger;
>>>> -import org.osgi.framework.FrameworkUtil;
>>>> -import org.osgi.framework.wiring.BundleWiring;
>>>> -
>>>> /**
>>>> * <p>
>>>> * ResolverUtil is used to locate classes that are available in the/a
>>>> class path and meet arbitrary conditions. The two
>>>> @@ -126,7 +117,7 @@ public class ResolverUtil {
>>>> * @return the ClassLoader that will be used to scan for classes
>>>> */
>>>> public ClassLoader getClassLoader() {
>>>> - return classloader != null ? classloader : (classloader =
>>>> Loader.getClassLoader(ResolverUtil.class, null));
>>>> + return classloader != null ? classloader : (classloader =
>>>> LoaderUtil.getClassLoader(ResolverUtil.class, null));
>>>> }
>>>>
>>>> /**
>>>> diff --git
>>>> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
>>>> new file mode 100644
>>>> index 0000000..e2bb462
>>>> --- /dev/null
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
>>>> @@ -0,0 +1,217 @@
>>>> +/*
>>>> + * 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.plugins.util;
>>>> +
>>>> +import java.lang.reflect.*;
>>>> +import java.util.ArrayList;
>>>> +import java.util.List;
>>>> +import java.util.Objects;
>>>> +
>>>> +/**
>>>> + * Utility class for working with Java {@link Type}s and derivatives.
>>>> This class is adapted heavily from the
>>>> + * <a href="http://projects.spring.io/spring-framework/">Spring
>>>> Framework</a>, specifically the
>>>> + * <a href="
>>>> http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/TypeUtils.html
>>>> ">TypeUtils</a>
>>>> + * class.
>>>> + *
>>>> + * @see Type
>>>> + * @see GenericArrayType
>>>> + * @see ParameterizedType
>>>> + * @see WildcardType
>>>> + * @see Class
>>>> + * @since 2.1
>>>> + */
>>>> +public final class TypeUtil {
>>>> +
>>>> + private TypeUtil() {
>>>> + }
>>>> +
>>>> + /**
>>>> + * Gets all declared fields for the given class (including
>>>> superclasses).
>>>> + *
>>>> + * @param cls the class to examine
>>>> + * @return all declared fields for the given class (including
>>>> superclasses).
>>>> + * @see Class#getDeclaredFields()
>>>> + */
>>>> + public static List<Field> getAllDeclaredFields(Class<?> cls) {
>>>> + final List<Field> fields = new ArrayList<>();
>>>> + while (cls != null) {
>>>> + for (final Field field : cls.getDeclaredFields()) {
>>>> + fields.add(field);
>>>> + }
>>>> + cls = cls.getSuperclass();
>>>> + }
>>>> + return fields;
>>>> + }
>>>> + /**
>>>> + * Indicates if two {@link Type}s are assignment compatible.
>>>> + *
>>>> + * @param lhs the left hand side to check assignability to
>>>> + * @param rhs the right hand side to check assignability from
>>>> + * @return {@code true} if it is legal to assign a variable of type
>>>> {@code rhs} to a variable of type {@code lhs}
>>>> + * @see Class#isAssignableFrom(Class)
>>>> + */
>>>> + public static boolean isAssignable(final Type lhs, final Type rhs) {
>>>> + Objects.requireNonNull(lhs, "No left hand side type provided");
>>>> + Objects.requireNonNull(rhs, "No right hand side type provided");
>>>> + if (lhs.equals(rhs)) {
>>>> + return true;
>>>> + }
>>>> + if (Object.class.equals(lhs)) {
>>>> + // everything is assignable to Object
>>>> + return true;
>>>> + }
>>>> + // raw type on left
>>>> + if (lhs instanceof Class<?>) {
>>>> + final Class<?> lhsClass = (Class<?>) lhs;
>>>> + if (rhs instanceof Class<?>) {
>>>> + // no generics involved
>>>> + final Class<?> rhsClass = (Class<?>) rhs;
>>>> + return lhsClass.isAssignableFrom(rhsClass);
>>>> + }
>>>> + if (rhs instanceof ParameterizedType) {
>>>> + // check to see if the parameterized type has the same
>>>> raw type as the lhs; this is legal
>>>> + final Type rhsRawType = ((ParameterizedType)
>>>> rhs).getRawType();
>>>> + if (rhsRawType instanceof Class<?>) {
>>>> + return lhsClass.isAssignableFrom((Class<?>)
>>>> rhsRawType);
>>>> + }
>>>> + }
>>>> + if (lhsClass.isArray() && rhs instanceof GenericArrayType) {
>>>> + // check for compatible array component types
>>>> + return isAssignable(lhsClass.getComponentType(),
>>>> ((GenericArrayType) rhs).getGenericComponentType());
>>>> + }
>>>> + }
>>>> + // parameterized type on left
>>>> + if (lhs instanceof ParameterizedType) {
>>>> + final ParameterizedType lhsType = (ParameterizedType) lhs;
>>>> + if (rhs instanceof Class<?>) {
>>>> + final Type lhsRawType = lhsType.getRawType();
>>>> + if (lhsRawType instanceof Class<?>) {
>>>> + return ((Class<?>)
>>>> lhsRawType).isAssignableFrom((Class<?>) rhs);
>>>> + }
>>>> + } else if (rhs instanceof ParameterizedType) {
>>>> + final ParameterizedType rhsType = (ParameterizedType) rhs;
>>>> + return isParameterizedAssignable(lhsType, rhsType);
>>>> + }
>>>> + }
>>>> + // generic array type on left
>>>> + if (lhs instanceof GenericArrayType) {
>>>> + final Type lhsComponentType = ((GenericArrayType)
>>>> lhs).getGenericComponentType();
>>>> + if (rhs instanceof Class<?>) {
>>>> + // raw type on right
>>>> + final Class<?> rhsClass = (Class<?>) rhs;
>>>> + if (rhsClass.isArray()) {
>>>> + return isAssignable(lhsComponentType,
>>>> rhsClass.getComponentType());
>>>> + }
>>>> + } else if (rhs instanceof GenericArrayType) {
>>>> + return isAssignable(lhsComponentType, ((GenericArrayType)
>>>> rhs).getGenericComponentType());
>>>> + }
>>>> + }
>>>> + // wildcard type on left
>>>> + if (lhs instanceof WildcardType) {
>>>> + return isWildcardAssignable((WildcardType) lhs, rhs);
>>>> + }
>>>> + // strange...
>>>> + return false;
>>>> + }
>>>> +
>>>> + private static boolean isParameterizedAssignable(final
>>>> ParameterizedType lhs, final ParameterizedType rhs) {
>>>> + if (lhs.equals(rhs)) {
>>>> + // that was easy
>>>> + return true;
>>>> + }
>>>> + final Type[] lhsTypeArguments = lhs.getActualTypeArguments();
>>>> + final Type[] rhsTypeArguments = rhs.getActualTypeArguments();
>>>> + final int size = lhsTypeArguments.length;
>>>> + if (rhsTypeArguments.length != size) {
>>>> + // clearly incompatible types
>>>> + return false;
>>>> + }
>>>> + for (int i = 0; i < size; i++) {
>>>> + // verify all type arguments are assignable
>>>> + final Type lhsArgument = lhsTypeArguments[i];
>>>> + final Type rhsArgument = rhsTypeArguments[i];
>>>> + if (!lhsArgument.equals(rhsArgument) &&
>>>> + !(lhsArgument instanceof WildcardType &&
>>>> + isWildcardAssignable((WildcardType) lhsArgument,
>>>> rhsArgument))) {
>>>> + return false;
>>>> + }
>>>> + }
>>>> + return true;
>>>> + }
>>>> +
>>>> + private static boolean isWildcardAssignable(final WildcardType lhs,
>>>> final Type rhs) {
>>>> + final Type[] lhsUpperBounds = getEffectiveUpperBounds(lhs);
>>>> + final Type[] lhsLowerBounds = getEffectiveLowerBounds(lhs);
>>>> + if (rhs instanceof WildcardType) {
>>>> + // oh boy, this scenario requires checking a lot of
>>>> assignability!
>>>> + final WildcardType rhsType = (WildcardType) rhs;
>>>> + final Type[] rhsUpperBounds =
>>>> getEffectiveUpperBounds(rhsType);
>>>> + final Type[] rhsLowerBounds =
>>>> getEffectiveLowerBounds(rhsType);
>>>> + for (final Type lhsUpperBound : lhsUpperBounds) {
>>>> + for (final Type rhsUpperBound : rhsUpperBounds) {
>>>> + if (!isBoundAssignable(lhsUpperBound, rhsUpperBound))
>>>> {
>>>> + return false;
>>>> + }
>>>> + }
>>>> + for (final Type rhsLowerBound : rhsLowerBounds) {
>>>> + if (!isBoundAssignable(lhsUpperBound, rhsLowerBound))
>>>> {
>>>> + return false;
>>>> + }
>>>> + }
>>>> + }
>>>> + for (final Type lhsLowerBound : lhsLowerBounds) {
>>>> + for (final Type rhsUpperBound : rhsUpperBounds) {
>>>> + if (!isBoundAssignable(rhsUpperBound, lhsLowerBound))
>>>> {
>>>> + return false;
>>>> + }
>>>> + }
>>>> + for (final Type rhsLowerBound : rhsLowerBounds) {
>>>> + if (!isBoundAssignable(rhsLowerBound, lhsLowerBound))
>>>> {
>>>> + return false;
>>>> + }
>>>> + }
>>>> + }
>>>> + } else {
>>>> + // phew, far less bounds to check
>>>> + for (final Type lhsUpperBound : lhsUpperBounds) {
>>>> + if (!isBoundAssignable(lhsUpperBound, rhs)) {
>>>> + return false;
>>>> + }
>>>> + }
>>>> + for (final Type lhsLowerBound : lhsLowerBounds) {
>>>> + if (!isBoundAssignable(lhsLowerBound, rhs)) {
>>>> + return false;
>>>> + }
>>>> + }
>>>> + }
>>>> + return true;
>>>> + }
>>>> +
>>>> + private static Type[] getEffectiveUpperBounds(final WildcardType
>>>> type) {
>>>> + final Type[] upperBounds = type.getUpperBounds();
>>>> + return upperBounds.length == 0 ? new Type[]{Object.class} :
>>>> upperBounds;
>>>> + }
>>>> +
>>>> + private static Type[] getEffectiveLowerBounds(final WildcardType
>>>> type) {
>>>> + final Type[] lowerBounds = type.getLowerBounds();
>>>> + return lowerBounds.length == 0 ? new Type[]{null} : lowerBounds;
>>>> + }
>>>> +
>>>> + private static boolean isBoundAssignable(final Type lhs, final Type
>>>> rhs) {
>>>> + return (rhs == null) || ((lhs != null) && isAssignable(lhs, rhs));
>>>> + }
>>>> +}
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
>>>> similarity index 94%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
>>>> index 4f6ddda..fae7580 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
>>>> @@ -19,4 +19,4 @@
>>>> * Java annotation processor for pre-scanning Log4j 2 plugins. This is
>>>> provided as an alternative to using the
>>>> * executable {@link
>>>> org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in
>>>> your build process.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>>> +package org.apache.logging.log4j.plugins.util;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
>>>> similarity index 81%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
>>>> index 0ac2223..4586315 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
>>>> @@ -14,14 +14,9 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>>
>>>> -import java.lang.annotation.Annotation;
>>>> -import java.lang.annotation.Documented;
>>>> -import java.lang.annotation.ElementType;
>>>> -import java.lang.annotation.Retention;
>>>> -import java.lang.annotation.RetentionPolicy;
>>>> -import java.lang.annotation.Target;
>>>> +import java.lang.annotation.*;
>>>>
>>>> /**
>>>> * Meta annotation to mark an annotation as a validation constraint. This
>>>> annotation must specify a
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
>>>> similarity index 96%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
>>>> index 1d8c0c5..2f638a7 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
>>>> @@ -14,7 +14,7 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>>
>>>> import java.lang.annotation.Annotation;
>>>>
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
>>>> similarity index 93%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
>>>> index 374c8ec..6236bb6 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
>>>> @@ -14,7 +14,9 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>> +
>>>> +import org.apache.logging.log4j.util.ReflectionUtil;
>>>>
>>>> import java.lang.annotation.Annotation;
>>>> import java.lang.reflect.ParameterizedType;
>>>> @@ -22,8 +24,6 @@ import java.lang.reflect.Type;
>>>> import java.util.ArrayList;
>>>> import java.util.Collection;
>>>>
>>>> -import org.apache.logging.log4j.core.util.ReflectionUtil;
>>>> -
>>>> /**
>>>> * Utility class to locate an appropriate {@link ConstraintValidator}
>>>> implementation for an annotation.
>>>> *
>>>> @@ -36,7 +36,7 @@ public final class ConstraintValidators {
>>>>
>>>> /**
>>>> * Finds all relevant {@link ConstraintValidator} objects from an
>>>> array of annotations. All validators will be
>>>> - * {@link
>>>> ConstraintValidator#initialize(java.lang.annotation.Annotation)
>>>> initialized} before being returned.
>>>> + * {@link ConstraintValidator#initialize(Annotation) initialized}
>>>> before being returned.
>>>> *
>>>> * @param annotations the annotations to find constraint validators
>>>> for
>>>> * @return a collection of ConstraintValidators for the given
>>>> annotations
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
>>>> similarity index 73%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
>>>> index e6f3c56..9b8a75d 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
>>>> @@ -15,16 +15,12 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>>>
>>>> -import java.lang.annotation.Documented;
>>>> -import java.lang.annotation.ElementType;
>>>> -import java.lang.annotation.Retention;
>>>> -import java.lang.annotation.RetentionPolicy;
>>>> -import java.lang.annotation.Target;
>>>> +import org.apache.logging.log4j.plugins.validation.Constraint;
>>>> +import
>>>> org.apache.logging.log4j.plugins.validation.validators.RequiredValidator;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.validators.RequiredValidator;
>>>> +import java.lang.annotation.*;
>>>>
>>>> /**
>>>> * Marks a plugin builder field or plugin factory parameter as required.
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
>>>> similarity index 84%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
>>>> index c652d40..14dd9a8 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
>>>> @@ -14,10 +14,10 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.validators.ValidHostValidator;
>>>> +import org.apache.logging.log4j.plugins.validation.Constraint;
>>>> +import
>>>> org.apache.logging.log4j.plugins.validation.validators.ValidHostValidator;
>>>>
>>>> import java.lang.annotation.*;
>>>> import java.net.InetAddress;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
>>>> similarity index 74%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
>>>> index a7c68b1..c4aba16 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
>>>> @@ -14,16 +14,12 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>>>
>>>> -import java.lang.annotation.Documented;
>>>> -import java.lang.annotation.ElementType;
>>>> -import java.lang.annotation.Retention;
>>>> -import java.lang.annotation.RetentionPolicy;
>>>> -import java.lang.annotation.Target;
>>>> +import org.apache.logging.log4j.plugins.validation.Constraint;
>>>> +import
>>>> org.apache.logging.log4j.plugins.validation.validators.ValidPortValidator;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.validators.ValidPortValidator;
>>>> +import java.lang.annotation.*;
>>>>
>>>> /**
>>>> * Indicates that a plugin attribute must be a valid port number. A valid
>>>> port number is an integer between 0 and
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
>>>> similarity index 91%
>>>> copy from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> copy to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
>>>> index f22ba49..298cd5a 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
>>>> @@ -20,4 +20,4 @@
>>>> *
>>>> * @since 2.1
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
>>>> similarity index 93%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
>>>> index 171b25a..15955cb 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
>>>> @@ -20,4 +20,4 @@
>>>> *
>>>> * @since 2.1
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
>>>> similarity index 86%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
>>>> index 98c0a71..9df6d3b 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
>>>> @@ -14,17 +14,17 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>>>> -
>>>> -import java.util.Collection;
>>>> -import java.util.Map;
>>>> +package org.apache.logging.log4j.plugins.validation.validators;
>>>>
>>>> import org.apache.logging.log4j.Logger;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>>> -import org.apache.logging.log4j.core.util.Assert;
>>>> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>>> +import org.apache.logging.log4j.util.Assert;
>>>> import org.apache.logging.log4j.status.StatusLogger;
>>>>
>>>> +import java.util.Collection;
>>>> +import java.util.Map;
>>>> +
>>>> /**
>>>> * Validator that checks an object for emptiness. Emptiness is defined
>>>> here as:
>>>> * <ul>
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
>>>> similarity index 89%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
>>>> index 6c01753..41abbfd 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
>>>> @@ -14,11 +14,11 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>>>> +package org.apache.logging.log4j.plugins.validation.validators;
>>>>
>>>> import org.apache.logging.log4j.Logger;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
>>>> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
>>>> import org.apache.logging.log4j.status.StatusLogger;
>>>>
>>>> import java.net.InetAddress;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
>>>> similarity index 85%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
>>>> index a59742c..27e97f0 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
>>>> @@ -14,12 +14,12 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>>>> +package org.apache.logging.log4j.plugins.validation.validators;
>>>>
>>>> import org.apache.logging.log4j.Logger;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
>>>> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
>>>> +import org.apache.logging.log4j.plugins.convert.TypeConverters;
>>>> import org.apache.logging.log4j.status.StatusLogger;
>>>>
>>>> /**
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
>>>> similarity index 92%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
>>>> index a8ac560..cfe2041 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
>>>> @@ -20,4 +20,4 @@
>>>> *
>>>> * @since 2.1
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>>>> +package org.apache.logging.log4j.plugins.validation.validators;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
>>>> similarity index 84%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
>>>> index 560cbe3..b98dc09 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
>>>> @@ -15,18 +15,18 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>> +
>>>> +import org.apache.logging.log4j.Logger;
>>>> +import org.apache.logging.log4j.plugins.convert.TypeConverters;
>>>> +import org.apache.logging.log4j.status.StatusLogger;
>>>> +import org.apache.logging.log4j.util.Strings;
>>>>
>>>> import java.lang.annotation.Annotation;
>>>> import java.lang.reflect.Member;
>>>> import java.util.Map;
>>>> import java.util.Objects;
>>>> -
>>>> -import org.apache.logging.log4j.Logger;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
>>>> -import org.apache.logging.log4j.core.lookup.StrSubstitutor;
>>>> -import org.apache.logging.log4j.status.StatusLogger;
>>>> -import org.apache.logging.log4j.util.Strings;
>>>> +import java.util.function.Function;
>>>>
>>>> /**
>>>> * Base class for PluginVisitor implementations. Provides convenience
>>>> methods as well as all method implementations
>>>> @@ -34,7 +34,7 @@ import org.apache.logging.log4j.util.Strings;
>>>> *
>>>> * @param <A> the Plugin annotation type.
>>>> */
>>>> -public abstract class AbstractPluginVisitor<A extends Annotation>
>>>> implements PluginVisitor<A> {
>>>> +public abstract class AbstractPluginVisitor<A extends Annotation, T>
>>>> implements PluginVisitor<A, T> {
>>>>
>>>> /** Status logger. */
>>>> protected static final Logger LOGGER = StatusLogger.getLogger();
>>>> @@ -58,10 +58,6 @@ public abstract class AbstractPluginVisitor<A extends
>>>> Annotation> implements Plu
>>>> /**
>>>> *
>>>> */
>>>> - protected StrSubstitutor substitutor;
>>>> - /**
>>>> - *
>>>> - */
>>>> protected Member member;
>>>>
>>>> /**
>>>> @@ -75,7 +71,7 @@ public abstract class AbstractPluginVisitor<A extends
>>>> Annotation> implements Plu
>>>>
>>>> @SuppressWarnings("unchecked")
>>>> @Override
>>>> - public PluginVisitor<A> setAnnotation(final Annotation anAnnotation) {
>>>> + public PluginVisitor<A, T> setAnnotation(final Annotation
>>>> anAnnotation) {
>>>> final Annotation a = Objects.requireNonNull(anAnnotation, "No
>>>> annotation was provided");
>>>> if (this.clazz.isInstance(a)) {
>>>> this.annotation = (A) a;
>>>> @@ -84,25 +80,19 @@ public abstract class AbstractPluginVisitor<A extends
>>>> Annotation> implements Plu
>>>> }
>>>>
>>>> @Override
>>>> - public PluginVisitor<A> setAliases(final String... someAliases) {
>>>> + public PluginVisitor<A, T> setAliases(final String... someAliases) {
>>>> this.aliases = someAliases;
>>>> return this;
>>>> }
>>>>
>>>> @Override
>>>> - public PluginVisitor<A> setConversionType(final Class<?>
>>>> aConversionType) {
>>>> + public PluginVisitor<A, T> setConversionType(final Class<?>
>>>> aConversionType) {
>>>> this.conversionType = Objects.requireNonNull(aConversionType, "No
>>>> conversion type class was provided");
>>>> return this;
>>>> }
>>>>
>>>> @Override
>>>> - public PluginVisitor<A> setStrSubstitutor(final StrSubstitutor
>>>> aSubstitutor) {
>>>> - this.substitutor = Objects.requireNonNull(aSubstitutor, "No
>>>> StrSubstitutor was provided");
>>>> - return this;
>>>> - }
>>>> -
>>>> - @Override
>>>> - public PluginVisitor<A> setMember(final Member aMember) {
>>>> + public PluginVisitor<A, T> setMember(final Member aMember) {
>>>> this.member = aMember;
>>>> return this;
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
>>>> similarity index 80%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
>>>> index f4da42b..fbd28b9 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
>>>> @@ -15,40 +15,39 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>>
>>>> -import java.util.Map;
>>>> -
>>>> -import org.apache.logging.log4j.core.LogEvent;
>>>> -import org.apache.logging.log4j.core.config.Configuration;
>>>> -import org.apache.logging.log4j.core.config.Node;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>>> -import org.apache.logging.log4j.core.util.NameUtil;
>>>> +import org.apache.logging.log4j.plugins.Node;
>>>> +import org.apache.logging.log4j.plugins.PluginAttribute;
>>>> +import org.apache.logging.log4j.util.NameUtil;
>>>> import org.apache.logging.log4j.util.StringBuilders;
>>>>
>>>> +import java.util.Map;
>>>> +import java.util.function.Function;
>>>> +
>>>> /**
>>>> * PluginVisitor implementation for {@link PluginAttribute}.
>>>> */
>>>> -public class PluginAttributeVisitor extends
>>>> AbstractPluginVisitor<PluginAttribute> {
>>>> +public class PluginAttributeVisitor extends
>>>> AbstractPluginVisitor<PluginAttribute, Object> {
>>>> public PluginAttributeVisitor() {
>>>> super(PluginAttribute.class);
>>>> }
>>>>
>>>> @Override
>>>> - public Object visit(final Configuration configuration, final Node
>>>> node, final LogEvent event,
>>>> + public Object visit(final Object unused, final Node node, final
>>>> Function<String, String> substitutor,
>>>> final StringBuilder log) {
>>>> final String name = this.annotation.value();
>>>> final Map<String, String> attributes = node.getAttributes();
>>>> final String rawValue = removeAttributeValue(attributes, name,
>>>> this.aliases);
>>>> - final String replacedValue = this.substitutor.replace(event,
>>>> rawValue);
>>>> - final Object defaultValue = findDefaultValue(event);
>>>> + final String replacedValue = substitutor.apply(rawValue);
>>>> + final Object defaultValue = findDefaultValue(substitutor);
>>>> final Object value = convert(replacedValue, defaultValue);
>>>> final Object debugValue = this.annotation.sensitive() ?
>>>> NameUtil.md5(value + this.getClass().getName()) : value;
>>>> StringBuilders.appendKeyDqValue(log, name, debugValue);
>>>> return value;
>>>> }
>>>>
>>>> - private Object findDefaultValue(final LogEvent event) {
>>>> + private Object findDefaultValue(Function<String, String> substitutor)
>>>> {
>>>> if (this.conversionType == int.class || this.conversionType ==
>>>> Integer.class) {
>>>> return this.annotation.defaultInt();
>>>> }
>>>> @@ -76,6 +75,6 @@ public class PluginAttributeVisitor extends
>>>> AbstractPluginVisitor<PluginAttribut
>>>> if (this.conversionType == Class.class) {
>>>> return this.annotation.defaultClass();
>>>> }
>>>> - return this.substitutor.replace(event,
>>>> this.annotation.defaultString());
>>>> + return substitutor.apply(this.annotation.defaultString());
>>>> }
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
>>>> similarity index 74%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
>>>> index e951456..398ff1c 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
>>>> @@ -15,38 +15,37 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>>
>>>> -import java.util.Map;
>>>> -
>>>> -import org.apache.logging.log4j.core.LogEvent;
>>>> -import org.apache.logging.log4j.core.config.Configuration;
>>>> -import org.apache.logging.log4j.core.config.Node;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>>> -import org.apache.logging.log4j.core.util.NameUtil;
>>>> +import org.apache.logging.log4j.plugins.Node;
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>>> +import org.apache.logging.log4j.util.NameUtil;
>>>> import org.apache.logging.log4j.util.StringBuilders;
>>>>
>>>> +import java.util.Map;
>>>> +import java.util.function.Function;
>>>> +
>>>> /**
>>>> * PluginVisitor for PluginBuilderAttribute. If {@code null} is returned
>>>> for the
>>>> - * {@link #visit(org.apache.logging.log4j.core.config.Configuration,
>>>> org.apache.logging.log4j.core.config.Node,
>>>> org.apache.logging.log4j.core.LogEvent, StringBuilder)}
>>>> + * {@link #visit(org.apache.logging.log4j.core.config.Configuration,
>>>> org.apache.logging.log4j.plugins.Node,
>>>> org.apache.logging.log4j.core.LogEvent, StringBuilder)}
>>>> * method, then the default value of the field should remain untouched.
>>>> *
>>>> * @see org.apache.logging.log4j.core.config.plugins.util.PluginBuilder
>>>> */
>>>> -public class PluginBuilderAttributeVisitor extends
>>>> AbstractPluginVisitor<PluginBuilderAttribute> {
>>>> +public class PluginBuilderAttributeVisitor extends
>>>> AbstractPluginVisitor<PluginBuilderAttribute, Object> {
>>>>
>>>> public PluginBuilderAttributeVisitor() {
>>>> super(PluginBuilderAttribute.class);
>>>> }
>>>>
>>>> @Override
>>>> - public Object visit(final Configuration configuration, final Node
>>>> node, final LogEvent event,
>>>> + public Object visit(final Object unused, final Node node, final
>>>> Function<String, String> substitutor,
>>>> final StringBuilder log) {
>>>> final String overridden = this.annotation.value();
>>>> final String name = overridden.isEmpty() ? this.member.getName()
>>>> : overridden;
>>>> final Map<String, String> attributes = node.getAttributes();
>>>> final String rawValue = removeAttributeValue(attributes, name,
>>>> this.aliases);
>>>> - final String replacedValue = this.substitutor.replace(event,
>>>> rawValue);
>>>> + final String replacedValue = substitutor.apply(rawValue);
>>>> final Object value = convert(replacedValue, null);
>>>> final Object debugValue = this.annotation.sensitive() ?
>>>> NameUtil.md5(value + this.getClass().getName()) : value;
>>>> StringBuilders.appendKeyDqValue(log, name, debugValue);
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
>>>> similarity index 90%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
>>>> index 2e6e6ef..f8197f1 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
>>>> @@ -15,30 +15,29 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.Node;
>>>> +import org.apache.logging.log4j.plugins.PluginElement;
>>>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>>>
>>>> import java.lang.reflect.Array;
>>>> import java.util.ArrayList;
>>>> import java.util.Arrays;
>>>> import java.util.Collection;
>>>> import java.util.List;
>>>> -
>>>> -import org.apache.logging.log4j.core.LogEvent;
>>>> -import org.apache.logging.log4j.core.config.Configuration;
>>>> -import org.apache.logging.log4j.core.config.Node;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginElement;
>>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>>>> +import java.util.function.Function;
>>>>
>>>> /**
>>>> * PluginVisitor implementation for {@link PluginElement}. Supports
>>>> arrays as well as singular values.
>>>> */
>>>> -public class PluginElementVisitor extends
>>>> AbstractPluginVisitor<PluginElement> {
>>>> +public class PluginElementVisitor extends
>>>> AbstractPluginVisitor<PluginElement, Object> {
>>>> public PluginElementVisitor() {
>>>> super(PluginElement.class);
>>>> }
>>>>
>>>> @Override
>>>> - public Object visit(final Configuration configuration, final Node
>>>> node, final LogEvent event,
>>>> + public Object visit(final Object unused, final Node node, final
>>>> Function<String, String> substitutor,
>>>> final StringBuilder log) {
>>>> final String name = this.annotation.value();
>>>> if (this.conversionType.isArray()) {
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
>>>> similarity index 77%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
>>>> index 7f15392..9438b39 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
>>>> @@ -15,23 +15,23 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>>
>>>> -import org.apache.logging.log4j.core.LogEvent;
>>>> -import org.apache.logging.log4j.core.config.Configuration;
>>>> -import org.apache.logging.log4j.core.config.Node;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginNode;
>>>> +import org.apache.logging.log4j.plugins.Node;
>>>> +import org.apache.logging.log4j.plugins.PluginNode;
>>>> +
>>>> +import java.util.function.Function;
>>>>
>>>> /**
>>>> * PluginVisitor implementation for {@link PluginNode}.
>>>> */
>>>> -public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode> {
>>>> +public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode,
>>>> Object> {
>>>> public PluginNodeVisitor() {
>>>> super(PluginNode.class);
>>>> }
>>>>
>>>> @Override
>>>> - public Object visit(final Configuration configuration, final Node
>>>> node, final LogEvent event,
>>>> + public Object visit(final Object unused, final Node node, final
>>>> Function<String, String> substitutor,
>>>> final StringBuilder log) {
>>>> if (this.conversionType.isInstance(node)) {
>>>> log.append("Node=").append(node.getName());
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
>>>> similarity index 79%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
>>>> index 8544570..2f68f04 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
>>>> @@ -15,26 +15,26 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>>
>>>> -import org.apache.logging.log4j.core.LogEvent;
>>>> -import org.apache.logging.log4j.core.config.Configuration;
>>>> -import org.apache.logging.log4j.core.config.Node;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginValue;
>>>> +import org.apache.logging.log4j.plugins.Node;
>>>> +import org.apache.logging.log4j.plugins.PluginValue;
>>>> import org.apache.logging.log4j.util.StringBuilders;
>>>> import org.apache.logging.log4j.util.Strings;
>>>>
>>>> +import java.util.function.Function;
>>>> +
>>>> /**
>>>> * PluginVisitor implementation for {@link PluginValue}.
>>>> */
>>>> -public class PluginValueVisitor extends
>>>> AbstractPluginVisitor<PluginValue> {
>>>> +public class PluginValueVisitor extends
>>>> AbstractPluginVisitor<PluginValue, Object> {
>>>> public PluginValueVisitor() {
>>>> super(PluginValue.class);
>>>> }
>>>>
>>>> @Override
>>>> - public Object visit(final Configuration configuration, final Node
>>>> node, final LogEvent event,
>>>> - final StringBuilder log) {
>>>> + public Object visit(final Object unused, final Node node, final
>>>> Function<String, String> substitutor,
>>>> + final StringBuilder log) {
>>>> final String name = this.annotation.value();
>>>> final String elementValue = node.getValue();
>>>> final String attributeValue = node.getAttributes().get("value");
>>>> @@ -49,7 +49,7 @@ public class PluginValueVisitor extends
>>>> AbstractPluginVisitor<PluginValue> {
>>>> } else {
>>>> rawValue = removeAttributeValue(node.getAttributes(),
>>>> "value");
>>>> }
>>>> - final String value = this.substitutor.replace(event, rawValue);
>>>> + final String value = substitutor.apply(rawValue);
>>>> StringBuilders.appendKeyDqValue(log, name, value);
>>>> return value;
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
>>>> similarity index 68%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
>>>> index 34e2b78..fb7aca4 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
>>>> @@ -15,15 +15,13 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.Node;
>>>>
>>>> import java.lang.annotation.Annotation;
>>>> import java.lang.reflect.Member;
>>>> -
>>>> -import org.apache.logging.log4j.core.LogEvent;
>>>> -import org.apache.logging.log4j.core.config.Configuration;
>>>> -import org.apache.logging.log4j.core.config.Node;
>>>> -import org.apache.logging.log4j.core.lookup.StrSubstitutor;
>>>> +import java.util.function.Function;
>>>>
>>>> /**
>>>> * Visitor strategy for parsing data from a {@link Node}, doing any
>>>> relevant type conversion, and returning a
>>>> @@ -31,7 +29,7 @@ import
>>>> org.apache.logging.log4j.core.lookup.StrSubstitutor;
>>>> *
>>>> * @param <A> the Annotation type.
>>>> */
>>>> -public interface PluginVisitor<A extends Annotation> {
>>>> +public interface PluginVisitor<A extends Annotation, T> {
>>>>
>>>> /**
>>>> * Sets the Annotation to be used for this. If the given Annotation
>>>> is not compatible with this class's type, then
>>>> @@ -41,7 +39,7 @@ public interface PluginVisitor<A extends Annotation> {
>>>> * @return {@code this}.
>>>> * @throws NullPointerException if the argument is {@code null}.
>>>> */
>>>> - PluginVisitor<A> setAnnotation(Annotation annotation);
>>>> + PluginVisitor<A, T> setAnnotation(Annotation annotation);
>>>>
>>>> /**
>>>> * Sets the list of aliases to use for this visit. No aliases are
>>>> required, however.
>>>> @@ -49,7 +47,7 @@ public interface PluginVisitor<A extends Annotation> {
>>>> * @param aliases the list of aliases to use.
>>>> * @return {@code this}.
>>>> */
>>>> - PluginVisitor<A> setAliases(String... aliases);
>>>> + PluginVisitor<A, T> setAliases(String... aliases);
>>>>
>>>> /**
>>>> * Sets the class to convert the plugin value to on this visit. This
>>>> should correspond with a class obtained from
>>>> @@ -59,17 +57,7 @@ public interface PluginVisitor<A extends Annotation> {
>>>> * @return {@code this}.
>>>> * @throws NullPointerException if the argument is {@code null}.
>>>> */
>>>> - PluginVisitor<A> setConversionType(Class<?> conversionType);
>>>> -
>>>> - /**
>>>> - * Sets the StrSubstitutor to use for converting raw strings before
>>>> type conversion. Generally obtained from a
>>>> - * {@link org.apache.logging.log4j.core.config.Configuration}.
>>>> - *
>>>> - * @param substitutor the StrSubstitutor to use on plugin values.
>>>> - * @return {@code this}.
>>>> - * @throws NullPointerException if the argument is {@code null}.
>>>> - */
>>>> - PluginVisitor<A> setStrSubstitutor(StrSubstitutor substitutor);
>>>> + PluginVisitor<A, T> setConversionType(Class<?> conversionType);
>>>>
>>>> /**
>>>> * Sets the Member that this visitor is being used for injection
>>>> upon. For instance, this could be the Field
>>>> @@ -79,16 +67,16 @@ public interface PluginVisitor<A extends Annotation> {
>>>> * @param member the member this visitor is parsing a value for.
>>>> * @return {@code this}.
>>>> */
>>>> - PluginVisitor<A> setMember(Member member);
>>>> + PluginVisitor<A, T> setMember(Member member);
>>>>
>>>> /**
>>>> * Visits a Node to obtain a value for constructing a Plugin object.
>>>> *
>>>> * @param configuration the current Configuration.
>>>> * @param node the current Node corresponding to the Plugin
>>>> object being created.
>>>> - * @param event the current LogEvent that caused this Plugin
>>>> object to be made (optional).
>>>> - * @param log the StringBuilder being used to build a debug
>>>> message.
>>>> + * @param substitutor the function to perform String substitutions.
>>>> + * @param log th e StringBuilder being used to build a
>>>> debug message.
>>>> * @return the converted value to be used for Plugin creation.
>>>> */
>>>> - Object visit(Configuration configuration, Node node, LogEvent event,
>>>> StringBuilder log);
>>>> + Object visit(T configuration, Node node, Function<String, String>
>>>> substitutor, StringBuilder log);
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
>>>> similarity index 86%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
>>>> index 10ee0df..695d387 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
>>>> @@ -15,14 +15,14 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>>> -
>>>> -import java.lang.annotation.Annotation;
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>>
>>>> import org.apache.logging.log4j.Logger;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginVisitorStrategy;
>>>> +import org.apache.logging.log4j.plugins.PluginVisitorStrategy;
>>>> import org.apache.logging.log4j.status.StatusLogger;
>>>>
>>>> +import java.lang.annotation.Annotation;
>>>> +
>>>> /**
>>>> * Utility class to locate an appropriate {@link PluginVisitor}
>>>> implementation for an annotation.
>>>> */
>>>> @@ -41,13 +41,13 @@ public final class PluginVisitors {
>>>> * @param annotation the Plugin annotation class to find a
>>>> PluginVisitor for.
>>>> * @return a PluginVisitor instance if one could be created, or
>>>> {@code null} otherwise.
>>>> */
>>>> - public static PluginVisitor<? extends Annotation> findVisitor(final
>>>> Class<? extends Annotation> annotation) {
>>>> + public static <T> PluginVisitor<? extends Annotation, T>
>>>> findVisitor(final Class<? extends Annotation> annotation) {
>>>> final PluginVisitorStrategy strategy =
>>>> annotation.getAnnotation(PluginVisitorStrategy.class);
>>>> if (strategy == null) {
>>>> return null;
>>>> }
>>>> try {
>>>> - return strategy.value().newInstance();
>>>> + return (PluginVisitor<? extends Annotation, T>)
>>>> strategy.value().newInstance();
>>>> } catch (final Exception e) {
>>>> LOGGER.error("Error loading PluginVisitor [{}] for annotation
>>>> [{}].", strategy.value(), annotation, e);
>>>> return null;
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
>>>> similarity index 67%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> rename to
>>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
>>>> index f22ba49..0855b16 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>>> +++
>>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
>>>> @@ -16,8 +16,9 @@
>>>> */
>>>>
>>>> /**
>>>> - * Validation annotations.
>>>> - *
>>>> - * @since 2.1
>>>> + * Visitor classes for extracting values from a Configuration or Node
>>>> corresponding to a plugin annotation.
>>>> + * Visitor implementations must implement {@link
>>>> org.apache.logging.log4j.plugins.visitors.PluginVisitor},
>>>> + * and the corresponding annotation must be annotated with
>>>> + * {@link org.apache.logging.log4j.plugins.PluginVisitorStrategy}.
>>>> */
>>>> -package
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>>> +package org.apache.logging.log4j.plugins.visitors;
>>>> diff --git
>>>> a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>>> b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>>> similarity index 91%
>>>> rename from
>>>> log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>>> rename to
>>>> log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>>> index bb9dcb9..5d6951a 100644
>>>> ---
>>>> a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>>> +++
>>>> b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>>> @@ -14,4 +14,4 @@
>>>> # See the license for the specific language governing permissions and
>>>> # limitations under the license.
>>>> #
>>>> -org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor
>>>> +org.apache.logging.log4j.plugins.processor.PluginProcessor
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
>>>> similarity index 97%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
>>>> index f9e757d..6e4b059 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
>>>> @@ -14,7 +14,7 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>>> +package org.apache.logging.log4j.plugins.convert;
>>>>
>>>> import org.junit.Test;
>>>>
>>>> @@ -63,7 +63,7 @@ public class TypeConverterRegistryTest {
>>>> // TODO: is there a specific converter this should return?
>>>> }
>>>>
>>>> - public static enum Foo {
>>>> + public enum Foo {
>>>> I, PITY, THE
>>>> }
>>>>
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
>>>> similarity index 84%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
>>>> index f4ceb41..48ea7dc 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
>>>> @@ -15,10 +15,10 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>>> +package org.apache.logging.log4j.plugins.processor;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>> +import org.apache.logging.log4j.plugins.PluginAliases;
>>>>
>>>> /**
>>>> * Test plugin class for unit tests.
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
>>>> similarity index 75%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
>>>> index 9c37af4..034705c 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
>>>> @@ -15,17 +15,19 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>>> +package org.apache.logging.log4j.plugins.processor;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>> +import org.apache.logging.log4j.plugins.PluginAliases;
>>>> import org.junit.BeforeClass;
>>>> import org.junit.Test;
>>>> import org.junit.runner.RunWith;
>>>> import org.junit.runners.JUnit4;
>>>>
>>>> import java.net.URL;
>>>> +import java.util.ArrayList;
>>>> import java.util.Enumeration;
>>>> +import java.util.List;
>>>> import java.util.Map;
>>>>
>>>> import static org.junit.Assert.*;
>>>> @@ -33,29 +35,29 @@ import static org.junit.Assert.*;
>>>> @RunWith(JUnit4.class)
>>>> public class PluginProcessorTest {
>>>>
>>>> - private static final PluginCache pluginCache = new PluginCache();
>>>> + private static PluginService pluginService;
>>>>
>>>> private final Plugin p = FakePlugin.class.getAnnotation(Plugin.class);
>>>>
>>>> @BeforeClass
>>>> public static void setUpClass() throws Exception {
>>>> - final Enumeration<URL> resources =
>>>> -
>>>> PluginProcessor.class.getClassLoader().getResources(PluginProcessor.PLUGIN_CACHE_FILE);
>>>> - pluginCache.loadCacheFiles(resources);
>>>> + Class<?> clazz =
>>>> PluginProcessor.class.getClassLoader().loadClass("org.apache.logging.log4j.plugins.plugins.Log4jPlugins");
>>>> + assertNotNull("Could not locate plugins class", clazz);
>>>> + pluginService = (PluginService)
>>>> clazz.getDeclaredConstructor().newInstance();;
>>>> }
>>>>
>>>> @Test
>>>> public void testTestCategoryFound() throws Exception {
>>>> assertNotNull("No plugin annotation on FakePlugin.", p);
>>>> - final Map<String, PluginEntry> testCategory =
>>>> pluginCache.getCategory(p.category());
>>>> - assertNotEquals("No plugins were found.", 0, pluginCache.size());
>>>> + final Map<String, PluginEntry> testCategory =
>>>> pluginService.getCategory(p.category());
>>>> + assertNotEquals("No plugins were found.", 0,
>>>> pluginService.size());
>>>> assertNotNull("The category '" + p.category() + "' was not
>>>> found.", testCategory);
>>>> assertFalse(testCategory.isEmpty());
>>>> }
>>>>
>>>> @Test
>>>> public void testFakePluginFoundWithCorrectInformation() throws
>>>> Exception {
>>>> - final PluginEntry fake =
>>>> pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
>>>> + final PluginEntry fake =
>>>> pluginService.getCategory(p.category()).get(p.name().toLowerCase());
>>>> verifyFakePluginEntry(p.name(), fake);
>>>> }
>>>>
>>>> @@ -63,7 +65,7 @@ public class PluginProcessorTest {
>>>> public void testFakePluginAliasesContainSameInformation() throws
>>>> Exception {
>>>> final PluginAliases aliases =
>>>> FakePlugin.class.getAnnotation(PluginAliases.class);
>>>> for (final String alias : aliases.value()) {
>>>> - final PluginEntry fake =
>>>> pluginCache.getCategory(p.category()).get(alias.toLowerCase());
>>>> + final PluginEntry fake =
>>>> pluginService.getCategory(p.category()).get(alias.toLowerCase());
>>>> verifyFakePluginEntry(alias, fake);
>>>> }
>>>> }
>>>> @@ -81,7 +83,7 @@ public class PluginProcessorTest {
>>>> @Test
>>>> public void testNestedPlugin() throws Exception {
>>>> final Plugin p =
>>>> FakePlugin.Nested.class.getAnnotation(Plugin.class);
>>>> - final PluginEntry nested =
>>>> pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
>>>> + final PluginEntry nested =
>>>> pluginService.getCategory(p.category()).get(p.name().toLowerCase());
>>>> assertNotNull(nested);
>>>> assertEquals(p.name().toLowerCase(), nested.getKey());
>>>> assertEquals(FakePlugin.Nested.class.getName(),
>>>> nested.getClassName());
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
>>>> similarity index 93%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
>>>> index 33e0ee1..d0b35d1 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
>>>> @@ -15,27 +15,21 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>>> +package org.apache.logging.log4j.plugins.util;
>>>>
>>>> -import static org.junit.Assert.assertEquals;
>>>> +import org.apache.logging.log4j.junit.CleanFolders;
>>>> +import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
>>>> +import org.junit.Rule;
>>>> +import org.junit.Test;
>>>> +import org.junit.rules.RuleChain;
>>>>
>>>> import java.io.IOException;
>>>> -import java.net.Proxy;
>>>> -import java.net.URL;
>>>> -import java.net.URLClassLoader;
>>>> -import java.net.URLConnection;
>>>> -import java.net.URLStreamHandler;
>>>> -import java.net.URLStreamHandlerFactory;
>>>> +import java.net.*;
>>>> import java.util.Arrays;
>>>> import java.util.Collections;
>>>> import java.util.Enumeration;
>>>>
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
>>>> -import org.apache.logging.log4j.junit.CleanFolders;
>>>> -import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
>>>> -import org.junit.Rule;
>>>> -import org.junit.Test;
>>>> -import org.junit.rules.RuleChain;
>>>> +import static org.junit.Assert.assertEquals;
>>>>
>>>> /**
>>>> * Tests the ResolverUtil class for custom protocol like bundleresource,
>>>> vfs, vfszip.
>>>> @@ -187,9 +181,9 @@ public class ResolverUtilCustomProtocolTest {
>>>> final ResolverUtil resolverUtil = new ResolverUtil();
>>>> resolverUtil
>>>> .setClassLoader(new SingleURLClassLoader(new
>>>> URL("vfs:/" + ResolverUtilTest.WORK_DIR + "/resolverutil3/customplugin3/"),
>>>> cl));
>>>> - resolverUtil.findInPackage(new PluginTest(), "customplugin3");
>>>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>>>> "customplugin3");
>>>> assertEquals("Class not found in packages", 1,
>>>> resolverUtil.getClasses().size());
>>>> - assertEquals("Unexpected class resolved",
>>>> cl.loadClass("customplugin3.FixedString3Layout"),
>>>> + assertEquals("Unexpected class resolved",
>>>> cl.loadClass("customplugin3.FixedString3"),
>>>> resolverUtil.getClasses().iterator().next());
>>>> }
>>>> }
>>>> @@ -200,9 +194,9 @@ public class ResolverUtilCustomProtocolTest {
>>>> final ResolverUtil resolverUtil = new ResolverUtil();
>>>> resolverUtil.setClassLoader(new SingleURLClassLoader(
>>>> new URL("vfs:/" + ResolverUtilTest.WORK_DIR +
>>>> "/resolverutil4/customplugin4.jar/customplugin4/"), cl));
>>>> - resolverUtil.findInPackage(new PluginTest(), "customplugin4");
>>>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>>>> "customplugin4");
>>>> assertEquals("Class not found in packages", 1,
>>>> resolverUtil.getClasses().size());
>>>> - assertEquals("Unexpected class resolved",
>>>> cl.loadClass("customplugin4.FixedString4Layout"),
>>>> + assertEquals("Unexpected class resolved",
>>>> cl.loadClass("customplugin4.FixedString4"),
>>>> resolverUtil.getClasses().iterator().next());
>>>> }
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
>>>> similarity index 82%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
>>>> index 1c6371b..361fe7b 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
>>>> @@ -15,33 +15,25 @@
>>>> * limitations under the license.
>>>> */
>>>>
>>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>>> +package org.apache.logging.log4j.plugins.util;
>>>>
>>>> -import static org.junit.Assert.assertEquals;
>>>> -import static org.junit.Assert.assertTrue;
>>>> -
>>>> -import java.io.File;
>>>> -import java.io.IOException;
>>>> -import java.io.UnsupportedEncodingException;
>>>> -import java.net.MalformedURLException;
>>>> -import java.net.URI;
>>>> -import java.net.URISyntaxException;
>>>> -import java.net.URL;
>>>> -import java.net.URLClassLoader;
>>>> -import java.nio.file.FileSystem;
>>>> -import java.nio.file.FileSystems;
>>>> -import java.nio.file.Files;
>>>> -import java.nio.file.Path;
>>>> -import java.nio.file.StandardCopyOption;
>>>> -import java.util.HashMap;
>>>> -import java.util.Map;
>>>> -
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
>>>> import org.apache.logging.log4j.junit.CleanFolders;
>>>> import org.junit.Rule;
>>>> import org.junit.Test;
>>>> import org.junit.rules.RuleChain;
>>>>
>>>> +import javax.tools.*;
>>>> +import java.io.File;
>>>> +import java.io.IOException;
>>>> +import java.io.UnsupportedEncodingException;
>>>> +import java.net.*;
>>>> +import java.nio.file.*;
>>>> +import java.util.*;
>>>> +
>>>> +import static org.junit.Assert.assertEquals;
>>>> +import static org.junit.Assert.assertTrue;
>>>> +import static org.junit.Assert.assertNotNull;
>>>> +
>>>> /**
>>>> * Tests the ResolverUtil class.
>>>> */
>>>> @@ -67,6 +59,7 @@ public class ResolverUtilTest {
>>>> private void testExtractPathFromJarUrlNotDecodedIfFileExists(final
>>>> String existingFile)
>>>> throws MalformedURLException, UnsupportedEncodingException,
>>>> URISyntaxException {
>>>> URL url = ResolverUtilTest.class.getResource(existingFile);
>>>> + assertNotNull("No url returned for " + existingFile, url);
>>>> if (!url.getProtocol().equals("jar")) {
>>>> // create fake jar: URL that resolves to existing file
>>>> url = new URL("jar:" + url.toExternalForm() + "!/some/entry");
>>>> @@ -152,9 +145,9 @@ public class ResolverUtilTest {
>>>> try (final URLClassLoader cl = compileAndCreateClassLoader("1")) {
>>>> final ResolverUtil resolverUtil = new ResolverUtil();
>>>> resolverUtil.setClassLoader(cl);
>>>> - resolverUtil.findInPackage(new PluginTest(), "customplugin1");
>>>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>>>> "customplugin1");
>>>> assertEquals("Class not found in packages", 1,
>>>> resolverUtil.getClasses().size());
>>>> - assertEquals("Unexpected class resolved",
>>>> cl.loadClass("customplugin1.FixedString1Layout"),
>>>> + assertEquals("Unexpected class resolved",
>>>> cl.loadClass("customplugin1.FixedString1"),
>>>> resolverUtil.getClasses().iterator().next());
>>>> }
>>>> }
>>>> @@ -164,9 +157,9 @@ public class ResolverUtilTest {
>>>> try (final URLClassLoader cl =
>>>> compileJarAndCreateClassLoader("2")) {
>>>> final ResolverUtil resolverUtil = new ResolverUtil();
>>>> resolverUtil.setClassLoader(cl);
>>>> - resolverUtil.findInPackage(new PluginTest(), "customplugin2");
>>>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>>>> "customplugin2");
>>>> assertEquals("Class not found in packages", 1,
>>>> resolverUtil.getClasses().size());
>>>> - assertEquals("Unexpected class resolved",
>>>> cl.loadClass("customplugin2.FixedString2Layout"),
>>>> + assertEquals("Unexpected class resolved",
>>>> cl.loadClass("customplugin2.FixedString2"),
>>>> resolverUtil.getClasses().iterator().next());
>>>> }
>>>> }
>>>> @@ -176,7 +169,7 @@ public class ResolverUtilTest {
>>>> final File jarFile = new File(workDir, "customplugin" + suffix +
>>>> ".jar");
>>>> final URI jarURI = jarFile.toURI();
>>>> createJar(jarURI, workDir, new File(workDir,
>>>> - "customplugin" + suffix + "/FixedString" + suffix +
>>>> "Layout.class"));
>>>> + "customplugin" + suffix + "/FixedString" + suffix +
>>>> ".class"));
>>>> return URLClassLoader.newInstance(new URL[] {jarURI.toURL()});
>>>> }
>>>>
>>>> @@ -186,9 +179,9 @@ public class ResolverUtilTest {
>>>> }
>>>>
>>>> static File compile(final String suffix) throws IOException {
>>>> - final File orig = new
>>>> File("target/test-classes/customplugin/FixedStringLayout.java.source");
>>>> + final File orig = new
>>>> File("target/test-classes/customplugin/FixedString.java.source");
>>>> final File workDir = new File(WORK_DIR, "resolverutil" + suffix);
>>>> - final File f = new File(workDir, "customplugin" + suffix +
>>>> "/FixedString" + suffix + "Layout.java");
>>>> + final File f = new File(workDir, "customplugin" + suffix +
>>>> "/FixedString" + suffix + ".java");
>>>> final File parent = f.getParentFile();
>>>> if (!parent.exists()) {
>>>> assertTrue("Create customplugin" + suffix + " folder KO",
>>>> f.getParentFile().mkdirs());
>>>> @@ -199,7 +192,7 @@ public class ResolverUtilTest {
>>>> .replaceAll("customplugin", "customplugin" + suffix);
>>>> Files.write(f.toPath(), content.getBytes());
>>>>
>>>> - PluginManagerPackagesTest.compile(f);
>>>> + compile(f);
>>>> return workDir;
>>>> }
>>>>
>>>> @@ -218,4 +211,29 @@ public class ResolverUtilTest {
>>>> }
>>>> }
>>>>
>>>> + static void compile(final File f) throws IOException {
>>>> + // set up compiler
>>>> + final JavaCompiler compiler =
>>>> ToolProvider.getSystemJavaCompiler();
>>>> + final DiagnosticCollector<JavaFileObject> diagnostics = new
>>>> DiagnosticCollector<>();
>>>> + final List<String> errors = new ArrayList<>();
>>>> + try (final StandardJavaFileManager fileManager =
>>>> compiler.getStandardFileManager(diagnostics, null, null)) {
>>>> + final Iterable<? extends JavaFileObject> compilationUnits =
>>>> fileManager.getJavaFileObjectsFromFiles(Arrays
>>>> + .asList(f));
>>>> +
>>>> + // compile generated source
>>>> + // (switch off annotation processing: no need to create
>>>> Log4j2Plugins.dat)
>>>> + final List<String> options = Arrays.asList("-proc:none");
>>>> + compiler.getTask(null, fileManager, diagnostics, options,
>>>> null, compilationUnits).call();
>>>> +
>>>> + // check we don't have any compilation errors
>>>> + for (final Diagnostic<? extends JavaFileObject> diagnostic :
>>>> diagnostics.getDiagnostics()) {
>>>> + if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
>>>> + errors.add(String.format("Compile error at line %d,
>>>> column %d: %s%n", diagnostic.getLineNumber(),
>>>> + diagnostic.getColumnNumber(),
>>>> diagnostic.getMessage(Locale.getDefault())));
>>>> + }
>>>> + }
>>>> + }
>>>> + assertTrue(errors.toString(), errors.isEmpty());
>>>> + }
>>>> +
>>>> }
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
>>>> similarity index 87%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
>>>> index 5689e29..0e243f2 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
>>>> @@ -14,10 +14,10 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>>
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>>>
>>>> /**
>>>> *
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
>>>> similarity index 78%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
>>>> index 34123c0..626798e 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
>>>> @@ -14,15 +14,15 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>>
>>>> -import java.net.InetSocketAddress;
>>>> +import org.apache.logging.log4j.plugins.PluginAttribute;
>>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
>>>> +import java.net.InetSocketAddress;
>>>>
>>>> @Plugin(name = "HostAndPort", category = "Test")
>>>> public class HostAndPort {
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>>> similarity index 81%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>>> index 3f2b15a..c3fe6c5 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>>> @@ -14,18 +14,18 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>>
>>>> @Plugin(name = "PluginWithGenericSubclassFoo1Builder", category = "Test")
>>>> public class PluginWithGenericSubclassFoo1Builder extends
>>>> AbstractPluginWithGenericBuilder {
>>>>
>>>> public static class Builder<B extends Builder<B>> extends
>>>> AbstractPluginWithGenericBuilder.Builder<B>
>>>> - implements
>>>> org.apache.logging.log4j.core.util.Builder<PluginWithGenericSubclassFoo1Builder>
>>>> {
>>>> + implements
>>>> org.apache.logging.log4j.plugins.util.Builder<PluginWithGenericSubclassFoo1Builder>
>>>> {
>>>>
>>>> @PluginBuilderFactory
>>>> public static <B extends Builder<B>> B newBuilder() {
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
>>>> similarity index 80%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
>>>> index 95a4209..9caf453 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
>>>> @@ -14,15 +14,15 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>>
>>>> -import java.util.Objects;
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>>> +import java.util.Objects;
>>>>
>>>> /**
>>>> *
>>>> @@ -51,7 +51,7 @@ public class ValidatingPlugin {
>>>> return new Builder();
>>>> }
>>>>
>>>> - public static class Builder implements
>>>> org.apache.logging.log4j.core.util.Builder<ValidatingPlugin> {
>>>> + public static class Builder implements
>>>> org.apache.logging.log4j.plugins.util.Builder<ValidatingPlugin> {
>>>>
>>>> @PluginBuilderAttribute
>>>> @Required(message = "The name given by the builder is null")
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>>> similarity index 80%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>>> index 81b9d6f..b0bec53 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>>> @@ -14,15 +14,16 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>>
>>>> -import java.util.Objects;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>>> +import java.util.Objects;
>>>>
>>>> /**
>>>> *
>>>> @@ -51,7 +52,7 @@ public class ValidatingPluginWithGenericBuilder {
>>>> return new Builder<B>().asBuilder();
>>>> }
>>>>
>>>> - public static class Builder<B extends Builder<B>> implements
>>>> org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithGenericBuilder>
>>>> {
>>>> + public static class Builder<B extends Builder<B>> implements
>>>> org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithGenericBuilder>
>>>> {
>>>>
>>>> @PluginBuilderAttribute
>>>> @Required(message = "The name given by the builder is null")
>>>> diff --git
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>>> similarity index 80%
>>>> rename from
>>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>>> rename to
>>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>>> index 74a6477..256181c 100644
>>>> ---
>>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>>> +++
>>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>>> @@ -14,15 +14,15 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>>> +package org.apache.logging.log4j.plugins.validation;
>>>>
>>>> -import java.util.Objects;
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>>
>>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>>> -import
>>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>>> +import java.util.Objects;
>>>>
>>>> /**
>>>> *
>>>> @@ -51,7 +51,7 @@ public class ValidatingPluginWithTypedBuilder {
>>>> return new Builder<>();
>>>> }
>>>>
>>>> - public static class Builder<T> implements
>>>> org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithTypedBuilder>
>>>> {
>>>> + public static class Builder<T> implements
>>>> org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithTypedBuilder>
>>>> {
>>>>
>>>> @PluginBuilderAttribute
>>>> @Required(message = "The name given by the builder is null")
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>>> b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
>>>> similarity index 52%
>>>> rename from
>>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>>> rename to
>>>> log4j-plugins/src/test/resources/customplugin/FixedString.java.source
>>>> index 15a162c..85a62ec 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>>> +++ b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
>>>> @@ -14,25 +14,32 @@
>>>> * See the license for the specific language governing permissions and
>>>> * limitations under the license.
>>>> */
>>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>>>
>>>> -import org.apache.logging.log4j.util.EnglishEnums;
>>>> +package customplugin;
>>>>
>>>> -/**
>>>> - * Converts a {@link String} into a {@link Enum}. Returns {@code null}
>>>> for invalid enum names.
>>>> - *
>>>> - * @param <E> the enum class to parse.
>>>> - * @since 2.1 moved from TypeConverters
>>>> - */
>>>> -public class EnumConverter<E extends Enum<E>> implements TypeConverter<E>
>>>> {
>>>> - private final Class<E> clazz;
>>>> +import java.util.Collections;
>>>> +import java.util.Map;
>>>> +
>>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>> +import org.apache.logging.log4j.plugins.PluginAttribute;
>>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>>> +
>>>> +@Plugin(name = "FixedString", category = "Core", elementType = "plugin",
>>>> printObject = true)
>>>> +public class FixedString {
>>>> +
>>>> + private String fixedString;
>>>> +
>>>> + @PluginFactory
>>>> + public static FixedString create(
>>>> + @PluginAttribute("fixedString") final String fixedString) {
>>>> + return new FixedString(fixedString);
>>>> + }
>>>>
>>>> - public EnumConverter(final Class<E> clazz) {
>>>> - this.clazz = clazz;
>>>> + public FixedString(String fixedString) {
>>>> + this.fixedString = fixedString;
>>>> }
>>>>
>>>> - @Override
>>>> - public E convert(final String s) {
>>>> - return EnglishEnums.valueOf(clazz, s);
>>>> + public Map<String, String> getContentFormat() {
>>>> + return Collections.emptyMap();
>>>> }
>>>> }
>>>> diff --git
>>>> a/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
>>>> b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
>>>> new file mode 100644
>>>> index 0000000..b85475a
>>>> --- /dev/null
>>>> +++
>>>> b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
>>>> @@ -0,0 +1,31 @@
>>>> +<?xml version="1.0" encoding="UTF-8"?>
>>>> +<!--
>>>> + 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.
>>>> +
>>>> +-->
>>>> +<Configuration status="OFF" name="XMLConfigTest">
>>>> +
>>>> + <Appenders>
>>>> + <List name="List">
>>>> + </List>
>>>> + </Appenders>
>>>> + <Loggers>
>>>> + <Root level="trace">
>>>> + <AppenderRef ref="List"/>
>>>> + </Root>
>>>> + </Loggers>
>>>> +
>>>> +</Configuration>
>>>> \ No newline at end of file
>>>> diff --git a/log4j-plugins/src/test/resources/s p a c e
>>>> s/log4j+config+with+plus+characters.xml
>>>> b/log4j-plugins/src/test/resources/s p a c e
>>>> s/log4j+config+with+plus+characters.xml
>>>> new file mode 100644
>>>> index 0000000..b85475a
>>>> --- /dev/null
>>>> +++ b/log4j-plugins/src/test/resources/s p a c e
>>>> s/log4j+config+with+plus+characters.xml
>>>> @@ -0,0 +1,31 @@
>>>> +<?xml version="1.0" encoding="UTF-8"?>
>>>> +<!--
>>>> + 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.
>>>> +
>>>> +-->
>>>> +<Configuration status="OFF" name="XMLConfigTest">
>>>> +
>>>> + <Appenders>
>>>> + <List name="List">
>>>> + </List>
>>>> + </Appenders>
>>>> + <Loggers>
>>>> + <Root level="trace">
>>>> + <AppenderRef ref="List"/>
>>>> + </Root>
>>>> + </Loggers>
>>>> +
>>>> +</Configuration>
>>>> \ No newline at end of file
>>>>
>>>>
>>
>>
>>
>
>
>
Re: [logging-log4j2] 01/02: LOG4J2-2621 - Initial commit
Posted by Ralph Goers <ra...@dslextreme.com>.
I have updated the branch so that the build now succeeds and the OSGi tests pass. One quirk I noticed with OSGi is that in one of the tests the configuration is loaded from a sample bundle so that is where the LoggerContext ends up. When shutting down the LoggerContext is searched for on the log4j core bundle and isn’t found so then it creates a new LoggerContext during shutdown. This clearly isn’t right so I added an option to have LogManager.shutdown() try to shutdown LoggerContexts on all bundles and not create a new LoggerContext.
The only thing left is to add back support for existing plugins. Unfortunately, that is probably going to require adding deprecated classes back to core so that existing Plugins don’t get ClassNotFoundExceptions.
Ralph
> On Jun 3, 2019, at 7:58 AM, Ralph Goers <ra...@dslextreme.com> wrote:
>
> Yes, but it shows up in the correct place in the git repo and the diff in the email shows the correct directory.
>
> Ralph
>
>> On Jun 3, 2019, at 3:56 AM, Gary Gregory <ga...@gmail.com> wrote:
>>
>> This is weird, note the "}":
>>
>> .../org/apache/logging/log4j}/util/Assert.java | 0
>>
>> Gary
>>
>> On Sun, Jun 2, 2019 at 6:38 PM <rg...@apache.org> wrote:
>>
>>> This is an automated email from the ASF dual-hosted git repository.
>>>
>>> rgoers pushed a commit to branch LOG4J2-2621
>>> in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
>>>
>>> commit b69c2d9e4b79ee7830a69463c6f89de1c50fe84d
>>> Author: Ralph Goers <rg...@apache.org>
>>> AuthorDate: Sun Jun 2 13:18:36 2019 -0700
>>>
>>> LOG4J2-2621 - Initial commit
>>> ---
>>> .../org/apache/logging/log4j}/util/Assert.java | 0
>>> .../logging/log4j/util/InternalException.java | 56 ++++
>>> .../org/apache/logging/log4j}/util/NameUtil.java | 0
>>> .../apache/logging/log4j}/util/ReflectionUtil.java | 6 +-
>>> .../log4j/junit/AbstractExternalFileCleaner.java | 0
>>> .../org/apache/logging/log4j/junit/CleanFiles.java | 0
>>> .../apache/logging/log4j/junit/CleanFolders.java | 0
>>> .../log4j/junit/URLStreamHandlerFactoryRule.java | 0
>>> .../org/apache/logging/log4j}/util/AssertTest.java | 2 +-
>>> .../config/plugins/convert/Base64Converter.java | 79 -----
>>> ...TypeConverters.java => CoreTypeConverters.java} | 7 +-
>>> .../ValidatingPluginWithGenericBuilderTest.java | 10 +-
>>> log4j-plugins-java9/pom.xml | 157 +++++++++
>>> log4j-plugins-java9/src/assembly/java9.xml | 40 +++
>>> .../src/main/java/module-info.java | 15 +-
>>> .../org/apache/logging/log4j/plugins/Dummy.java | 9 +-
>>> .../logging/log4j/plugins/convert/Dummy.java | 9 +-
>>> .../log4j/plugins/processor/PluginService.java | 9 +-
>>> .../apache/logging/log4j/plugins/util/Dummy.java | 9 +-
>>> .../logging/log4j/plugins/validation/Dummy.java | 9 +-
>>> .../logging/log4j/plugins/visitors/Dummy.java | 9 +-
>>> log4j-plugins/pom.xml | 360
>>> +++++++++++++++++++++
>>> .../org/apache/logging/log4j/plugins}/Node.java | 6 +-
>>> .../org/apache/logging/log4j}/plugins/Plugin.java | 6 +-
>>> .../logging/log4j}/plugins/PluginAliases.java | 4 +-
>>> .../logging/log4j}/plugins/PluginAttribute.java | 8 +-
>>> .../log4j}/plugins/PluginBuilderAttribute.java | 8 +-
>>> .../log4j}/plugins/PluginBuilderFactory.java | 2 +-
>>> .../logging/log4j}/plugins/PluginElement.java | 6 +-
>>> .../logging/log4j}/plugins/PluginFactory.java | 2 +-
>>> .../apache/logging/log4j}/plugins/PluginNode.java | 6 +-
>>> .../apache/logging/log4j}/plugins/PluginValue.java | 6 +-
>>> .../log4j}/plugins/PluginVisitorStrategy.java | 8 +-
>>> .../log4j}/plugins/convert/EnumConverter.java | 2 +-
>>> .../log4j}/plugins/convert/HexConverter.java | 2 +-
>>> .../log4j}/plugins/convert/TypeConverter.java | 2 +-
>>> .../plugins/convert/TypeConverterRegistry.java | 23 +-
>>> .../log4j}/plugins/convert/TypeConverters.java | 47 +--
>>> .../log4j/plugins/convert}/package-info.java | 7 +-
>>> .../logging/log4j/plugins/osgi/Activator.java | 103 ++++++
>>> .../logging/log4j/plugins/osgi}/package-info.java | 6 +-
>>> .../logging/log4j/plugins}/package-info.java | 6 +-
>>> .../log4j}/plugins/processor/PluginCache.java | 30 +-
>>> .../log4j}/plugins/processor/PluginEntry.java | 14 +-
>>> .../log4j}/plugins/processor/PluginProcessor.java | 157 +++++++--
>>> .../log4j/plugins/processor/PluginService.java | 56 ++++
>>> .../log4j}/plugins/processor/package-info.java | 2 +-
>>> .../logging/log4j/plugins}/util/Builder.java | 4 +-
>>> .../logging/log4j}/plugins/util/PluginManager.java | 8 +-
>>> .../log4j}/plugins/util/PluginRegistry.java | 81 +++--
>>> .../logging/log4j}/plugins/util/PluginType.java | 6 +-
>>> .../logging/log4j}/plugins/util/ResolverUtil.java | 29 +-
>>> .../logging/log4j/plugins/util/TypeUtil.java | 217 +++++++++++++
>>> .../logging/log4j/plugins/util}/package-info.java | 2 +-
>>> .../log4j}/plugins/validation/Constraint.java | 9 +-
>>> .../plugins/validation/ConstraintValidator.java | 2 +-
>>> .../plugins/validation/ConstraintValidators.java | 8 +-
>>> .../plugins/validation/constraints/Required.java | 12 +-
>>> .../plugins/validation/constraints/ValidHost.java | 6 +-
>>> .../plugins/validation/constraints/ValidPort.java | 12 +-
>>> .../validation/constraints/package-info.java | 2 +-
>>> .../log4j}/plugins/validation/package-info.java | 2 +-
>>> .../validation/validators/RequiredValidator.java | 14 +-
>>> .../validation/validators/ValidHostValidator.java | 6 +-
>>> .../validation/validators/ValidPortValidator.java | 8 +-
>>> .../validation/validators/package-info.java | 2 +-
>>> .../plugins/visitors/AbstractPluginVisitor.java | 34 +-
>>> .../plugins/visitors/PluginAttributeVisitor.java | 27 +-
>>> .../visitors/PluginBuilderAttributeVisitor.java | 23 +-
>>> .../plugins/visitors/PluginElementVisitor.java | 17 +-
>>> .../log4j}/plugins/visitors/PluginNodeVisitor.java | 14 +-
>>> .../plugins/visitors/PluginValueVisitor.java | 18 +-
>>> .../log4j}/plugins/visitors/PluginVisitor.java | 36 +--
>>> .../log4j}/plugins/visitors/PluginVisitors.java | 12 +-
>>> .../log4j/plugins/visitors}/package-info.java | 9 +-
>>> .../services/javax.annotation.processing.Processor | 2 +-
>>> .../plugins/convert/TypeConverterRegistryTest.java | 4 +-
>>> .../log4j}/plugins/processor/FakePlugin.java | 6 +-
>>> .../plugins/processor/PluginProcessorTest.java | 26 +-
>>> .../util/ResolverUtilCustomProtocolTest.java | 30 +-
>>> .../log4j}/plugins/util/ResolverUtilTest.java | 76 +++--
>>> .../AbstractPluginWithGenericBuilder.java | 6 +-
>>> .../log4j}/plugins/validation/HostAndPort.java | 14 +-
>>> .../PluginWithGenericSubclassFoo1Builder.java | 12 +-
>>> .../plugins/validation/ValidatingPlugin.java | 16 +-
>>> .../ValidatingPluginWithGenericBuilder.java | 17 +-
>>> .../ValidatingPluginWithTypedBuilder.java | 16 +-
>>> .../resources/customplugin/FixedString.java.source | 37 ++-
>>> .../log4j+config+with+plus+characters.xml | 31 ++
>>> .../log4j+config+with+plus+characters.xml | 31 ++
>>> 90 files changed, 1655 insertions(+), 594 deletions(-)
>>>
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
>>> similarity index 100%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java
>>> rename to log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
>>> diff --git
>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
>>> new file mode 100644
>>> index 0000000..8c433db
>>> --- /dev/null
>>> +++
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
>>> @@ -0,0 +1,56 @@
>>> +/*
>>> + * 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;
>>> +
>>> +/**
>>> + * Exception thrown when an error occurs while logging. In most cases
>>> exceptions will be handled
>>> + * within Log4j but certain Appenders may be configured to allow
>>> exceptions to propagate to the
>>> + * application. This is a RuntimeException so that the exception may be
>>> thrown in those cases without
>>> + * requiring all Logger methods be contained with try/catch blocks.
>>> + */
>>> +public class LoggingException extends RuntimeException {
>>> +
>>> + private static final long serialVersionUID = 6366395965071580537L;
>>> +
>>> + /**
>>> + * Construct an exception with a message.
>>> + *
>>> + * @param message The reason for the exception
>>> + */
>>> + public LoggingException(final String message) {
>>> + super(message);
>>> + }
>>> +
>>> + /**
>>> + * Construct an exception with a message and underlying cause.
>>> + *
>>> + * @param message The reason for the exception
>>> + * @param cause The underlying cause of the exception
>>> + */
>>> + public LoggingException(final String message, final Throwable cause) {
>>> + super(message, cause);
>>> + }
>>> +
>>> + /**
>>> + * Construct an exception with an underlying cause.
>>> + *
>>> + * @param cause The underlying cause of the exception
>>> + */
>>> + public LoggingException(final Throwable cause) {
>>> + super(cause);
>>> + }
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
>>> similarity index 100%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java
>>> rename to
>>> log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> similarity index 98%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
>>> rename to
>>> log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> index ffee439..f00e64a 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
>>> +++
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> @@ -193,8 +193,10 @@ public final class ReflectionUtil {
>>> } catch (final IllegalAccessException e) {
>>> throw new IllegalStateException(e);
>>> } catch (final InvocationTargetException e) {
>>> - Throwables.rethrow(e.getCause());
>>> - throw new InternalError("Unreachable");
>>> + if (e.getCause() instanceof RuntimeException) {
>>> + throw (RuntimeException) e.getCause();
>>> + }
>>> + throw new
>>> }
>>> }
>>> }
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>>> similarity index 100%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>>> rename to
>>> log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>>> similarity index 100%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>>> rename to
>>> log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>>> similarity index 100%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>>> rename to
>>> log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>>> similarity index 100%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>>> rename to
>>> log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
>>> b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
>>> similarity index 99%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
>>> rename to
>>> log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
>>> index 242c41e..7e46036 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
>>> +++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
>>> @@ -65,4 +65,4 @@ public class AssertTest {
>>> assertEquals(isEmpty, Assert.isEmpty(value));
>>> }
>>>
>>> -}
>>> \ No newline at end of file
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
>>> deleted file mode 100644
>>> index f4e421f..0000000
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
>>> +++ /dev/null
>>> @@ -1,79 +0,0 @@
>>> -/*
>>> - * 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.convert;
>>> -
>>> -import java.lang.reflect.InvocationTargetException;
>>> -import java.lang.reflect.Method;
>>> -
>>> -import org.apache.logging.log4j.Logger;
>>> -import org.apache.logging.log4j.status.StatusLogger;
>>> -import org.apache.logging.log4j.util.LoaderUtil;
>>> -
>>> -/**
>>> - * @Since 2.9
>>> - */
>>> -public class Base64Converter {
>>> -
>>> - private static final Logger LOGGER = StatusLogger.getLogger();
>>> - private static Method method = null;
>>> - private static Object decoder = null;
>>> -
>>> - static {
>>> - try {
>>> - // Base64 is available in Java 8 and up.
>>> - Class<?> clazz = LoaderUtil.loadClass("java.util.Base64");
>>> - final Method getDecoder = clazz.getMethod("getDecoder",
>>> (Class[]) null);
>>> - decoder = getDecoder.invoke(null, (Object[]) null);
>>> - clazz = decoder.getClass();
>>> - method = clazz.getMethod("decode", String.class);
>>> - } catch (final ClassNotFoundException ex) {
>>> -
>>> - } catch (final NoSuchMethodException ex) {
>>> -
>>> - } catch (final IllegalAccessException ex) {
>>> -
>>> - } catch (final InvocationTargetException ex) {
>>> -
>>> - }
>>> - if (method == null) {
>>> - try {
>>> - // DatatypeConverter is not in the default module in Java
>>> 9.
>>> - final Class<?> clazz =
>>> LoaderUtil.loadClass("javax.xml.bind.DatatypeConverter");
>>> - method = clazz.getMethod("parseBase64Binary",
>>> String.class);
>>> - } catch (final ClassNotFoundException ex) {
>>> - LOGGER.error("No Base64 Converter is available");
>>> - } catch (final NoSuchMethodException ex) {
>>> -
>>> - }
>>> - }
>>> - }
>>> -
>>> - public static byte[] parseBase64Binary(final String encoded) {
>>> - if (method == null) {
>>> - LOGGER.error("No base64 converter");
>>> - } else {
>>> - try {
>>> - return (byte[]) method.invoke(decoder, encoded);
>>> - } catch (final IllegalAccessException ex) {
>>> - LOGGER.error("Error decoding string - " +
>>> ex.getMessage());
>>> - } catch (final InvocationTargetException ex) {
>>> - LOGGER.error("Error decoding string - " +
>>> ex.getMessage());
>>> - }
>>> - }
>>> - return new byte[0];
>>> - }
>>> -}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
>>> similarity index 98%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>> copy to
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
>>> index dc833f0..00e6da7 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>> +++
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
>>> @@ -30,13 +30,14 @@ import java.nio.file.Path;
>>> import java.nio.file.Paths;
>>> import java.security.Provider;
>>> import java.security.Security;
>>> +import java.util.Base64;
>>> import java.util.UUID;
>>> import java.util.regex.Pattern;
>>>
>>> import org.apache.logging.log4j.Level;
>>> import org.apache.logging.log4j.Logger;
>>> import org.apache.logging.log4j.core.appender.rolling.action.Duration;
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>> import org.apache.logging.log4j.core.util.CronExpression;
>>> import org.apache.logging.log4j.status.StatusLogger;
>>> import org.apache.logging.log4j.util.LoaderUtil;
>>> @@ -56,6 +57,8 @@ public final class TypeConverters {
>>> */
>>> public static final String CATEGORY = "TypeConverter";
>>>
>>> + private static final Base64.Decoder decoder = Base64.getDecoder();
>>> +
>>> /**
>>> * Parses a {@link String} into a {@link BigDecimal}.
>>> */
>>> @@ -112,7 +115,7 @@ public final class TypeConverters {
>>> bytes = new byte[0];
>>> } else if (value.startsWith(PREFIX_BASE64)) {
>>> final String lexicalXSDBase64Binary =
>>> value.substring(PREFIX_BASE64.length());
>>> - bytes =
>>> Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
>>> + bytes = decoder.decode(lexicalXSDBase64Binary);
>>> } else if (value.startsWith(PREFIX_0x)) {
>>> final String lexicalXSDHexBinary =
>>> value.substring(PREFIX_0x.length());
>>> bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>>> b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>>> index 8ee5abb..27ac5fe 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>>> +++
>>> b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>>> @@ -20,12 +20,12 @@ import static org.junit.Assert.assertEquals;
>>> import static org.junit.Assert.assertNotNull;
>>> import static org.junit.Assert.assertNull;
>>>
>>> -import org.apache.logging.log4j.core.config.Node;
>>> +import org.apache.logging.log4j.plugins.Node;
>>> import org.apache.logging.log4j.core.config.NullConfiguration;
>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.ValidatingPluginWithGenericBuilder;
>>> +import org.apache.logging.log4j.plugins.util.PluginBuilder;
>>> +import org.apache.logging.log4j.plugins.util.PluginManager;
>>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>> +import
>>> org.apache.logging.log4j.plugins.validation.ValidatingPluginWithGenericBuilder;
>>> import org.junit.Before;
>>> import org.junit.Test;
>>>
>>> diff --git a/log4j-plugins-java9/pom.xml b/log4j-plugins-java9/pom.xml
>>> new file mode 100644
>>> index 0000000..49f81c6
>>> --- /dev/null
>>> +++ b/log4j-plugins-java9/pom.xml
>>> @@ -0,0 +1,157 @@
>>> +<?xml version="1.0" encoding="UTF-8"?>
>>> +<!--
>>> + ~ 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.
>>> + -->
>>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>>> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>>> http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
>>> ">
>>> + <modelVersion>4.0.0</modelVersion>
>>> + <parent>
>>> + <groupId>org.apache.logging.log4j</groupId>
>>> + <artifactId>log4j</artifactId>
>>> + <version>3.0.0-SNAPSHOT</version>
>>> + <relativePath>../</relativePath>
>>> + </parent>
>>> + <artifactId>log4j-plugins-java9</artifactId>
>>> + <packaging>pom</packaging>
>>> + <name>Apache Log4j Plugins Module support</name>
>>> + <description>Apache Log4j Plugin Moduels Support</description>
>>> + <properties>
>>> + <log4jParentDir>${basedir}/..</log4jParentDir>
>>> + <docLabel>Log4j Plugins Documentation</docLabel>
>>> + <projectDir>/plugins</projectDir>
>>> + </properties>
>>> + <dependencies>
>>> + <dependency>
>>> + <groupId>org.apache.logging.log4j</groupId>
>>> + <artifactId>log4j-api</artifactId>
>>> + </dependency>
>>> + <dependency>
>>> + <groupId>junit</groupId>
>>> + <artifactId>junit</artifactId>
>>> + <scope>test</scope>
>>> + </dependency>
>>> + <dependency>
>>> + <groupId>org.apache.maven</groupId>
>>> + <artifactId>maven-core</artifactId>
>>> + <scope>test</scope>
>>> + </dependency>
>>> + </dependencies>
>>> + <build>
>>> + <plugins>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-toolchains-plugin</artifactId>
>>> + <version>1.1</version>
>>> + <executions>
>>> + <execution>
>>> + <goals>
>>> + <goal>toolchain</goal>
>>> + </goals>
>>> + </execution>
>>> + </executions>
>>> + <configuration>
>>> + <toolchains>
>>> + <jdk>
>>> + <version>[9, )</version>
>>> + </jdk>
>>> + </toolchains>
>>> + </configuration>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-compiler-plugin</artifactId>
>>> + <executions>
>>> + <execution>
>>> + <id>default-compile</id>
>>> + <phase>compile</phase>
>>> + <goals>
>>> + <goal>compile</goal>
>>> + </goals>
>>> + </execution>
>>> + <execution>
>>> + <id>default-test-compile</id>
>>> + <phase>test-compile</phase>
>>> + <goals>
>>> + <goal>testCompile</goal>
>>> + </goals>
>>> + </execution>
>>> + </executions>
>>> + <configuration>
>>> + <source>9</source>
>>> + <target>9</target>
>>> + <release>9</release>
>>> + <proc>none</proc>
>>> + <!-- disable errorprone -->
>>> + <compilerId>javac</compilerId>
>>> + </configuration>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-surefire-plugin</artifactId>
>>> + <!-- Do not upgrade until
>>> https://issues.apache.org/jira/browse/SUREFIRE-720 is fixed -->
>>> + <version>2.13</version>
>>> + <executions>
>>> + <execution>
>>> + <id>test</id>
>>> + <phase>test</phase>
>>> + <goals>
>>> + <goal>test</goal>
>>> + </goals>
>>> + </execution>
>>> + </executions>
>>> + <configuration>
>>> + <systemPropertyVariables>
>>> + <java.awt.headless>true</java.awt.headless>
>>> + </systemPropertyVariables>
>>> + <includes>
>>> + <include>**/Test*.java</include>
>>> + <include>**/*Test.java</include>
>>> + </includes>
>>> + <excludes>
>>> + <exclude>**/*FuncTest.java</exclude>
>>> + </excludes>
>>> + </configuration>
>>> + </plugin>
>>> + <plugin>
>>> + <artifactId>maven-assembly-plugin</artifactId>
>>> + <executions>
>>> + <execution>
>>> + <id>zip</id>
>>> + <phase>package</phase>
>>> + <goals>
>>> + <goal>single</goal>
>>> + </goals>
>>> + <configuration>
>>> +
>>> <finalName>log4j-plugins-java9-${project.version}</finalName>
>>> + <appendAssemblyId>false</appendAssemblyId>
>>> + <descriptors>
>>> + <descriptor>src/assembly/java9.xml</descriptor>
>>> + </descriptors>
>>> + </configuration>
>>> + </execution>
>>> + </executions>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-deploy-plugin</artifactId>
>>> + <version>${deploy.plugin.version}</version>
>>> + <configuration>
>>> + <skip>true</skip>
>>> + </configuration>
>>> + </plugin>
>>> + </plugins>
>>> + </build>
>>> +</project>
>>> +
>>> diff --git a/log4j-plugins-java9/src/assembly/java9.xml
>>> b/log4j-plugins-java9/src/assembly/java9.xml
>>> new file mode 100644
>>> index 0000000..34649d4
>>> --- /dev/null
>>> +++ b/log4j-plugins-java9/src/assembly/java9.xml
>>> @@ -0,0 +1,40 @@
>>> +<?xml version='1.0' encoding='UTF-8'?>
>>> +<!--
>>> + 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.
>>> +-->
>>> +
>>> +<assembly>
>>> + <id>src</id>
>>> + <formats>
>>> + <format>zip</format>
>>> + </formats>
>>> + <baseDirectory>/</baseDirectory>
>>> + <fileSets>
>>> + <fileSet>
>>> + <directory>${project.build.outputDirectory}</directory>
>>> + <outputDirectory>/classes/META-INF/versions/9</outputDirectory>
>>> + <includes>
>>> + <include>module-info.class</include>
>>> + </includes>
>>> + <excludes>
>>> + <exclude>**/Dummy.class</exclude>
>>> + <exclude>**/PluginService.class</exclude>
>>> + </excludes>
>>> + </fileSet>
>>> + </fileSets>
>>> +</assembly>
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins-java9/src/main/java/module-info.java
>>> similarity index 65%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to log4j-plugins-java9/src/main/java/module-info.java
>>> index f22ba49..9802622 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++ b/log4j-plugins-java9/src/main/java/module-info.java
>>> @@ -14,10 +14,13 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> +module org.apache.logging.log4j.plugins {
>>> + exports org.apache.logging.log4j.plugins;
>>> + exports org.apache.logging.log4j.plugins.convert;
>>> + exports org.apache.logging.log4j.plugins.processor;
>>> + exports org.apache.logging.log4j.plugins.util;
>>> + exports org.apache.logging.log4j.plugins.validation;
>>> + exports org.apache.logging.log4j.plugins.visitors;
>>>
>>> -/**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> - */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> + uses org.apache.logging.log4j.plugins.processor.PluginService;
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
>>> similarity index 80%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
>>> index f22ba49..14a90ed 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
>>> @@ -14,10 +14,11 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> +package org.apache.logging.log4j.plugins;
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * This is a dummy class and is only here to allow module-info.java to
>>> compile. It will not
>>> + * be copied into the log4j-api module.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +public class Dummy {
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
>>> similarity index 79%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
>>> index f22ba49..10923e8 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
>>> @@ -14,10 +14,11 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> +package org.apache.logging.log4j.plugins.convert;
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * This is a dummy class and is only here to allow module-info.java to
>>> compile. It will not
>>> + * be copied into the log4j-api module.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +public class Dummy {
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>> similarity index 79%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>> index f22ba49..b93ef59 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>> @@ -14,10 +14,11 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> +package org.apache.logging.log4j.plugins.processor;
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * This is a dummy class and is only here to allow module-info.java to
>>> compile. It will not
>>> + * be copied into the log4j-api module.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +public class PluginService {
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
>>> similarity index 80%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
>>> index f22ba49..5940b03 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
>>> @@ -14,10 +14,11 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> +package org.apache.logging.log4j.plugins.util;
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * This is a dummy class and is only here to allow module-info.java to
>>> compile. It will not
>>> + * be copied into the log4j-api module.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +public class Dummy {
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
>>> similarity index 79%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
>>> index f22ba49..14882b5 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
>>> @@ -14,10 +14,11 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> +package org.apache.logging.log4j.plugins.validation;
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * This is a dummy class and is only here to allow module-info.java to
>>> compile. It will not
>>> + * be copied into the log4j-api module.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +public class Dummy {
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
>>> similarity index 79%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
>>> index f22ba49..5596338 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
>>> @@ -14,10 +14,11 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> +package org.apache.logging.log4j.plugins.visitors;
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * This is a dummy class and is only here to allow module-info.java to
>>> compile. It will not
>>> + * be copied into the log4j-api module.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +public class Dummy {
>>> +}
>>> diff --git a/log4j-plugins/pom.xml b/log4j-plugins/pom.xml
>>> new file mode 100644
>>> index 0000000..3551d51
>>> --- /dev/null
>>> +++ b/log4j-plugins/pom.xml
>>> @@ -0,0 +1,360 @@
>>> +<?xml version="1.0" encoding="UTF-8"?>
>>> +<!--
>>> + ~ 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.
>>> + -->
>>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>>> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>>> http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
>>> ">
>>> + <modelVersion>4.0.0</modelVersion>
>>> + <parent>
>>> + <groupId>org.apache.logging.log4j</groupId>
>>> + <artifactId>log4j</artifactId>
>>> + <version>3.0.0-SNAPSHOT</version>
>>> + <relativePath>../</relativePath>
>>> + </parent>
>>> + <artifactId>log4j-plugins</artifactId>
>>> + <packaging>jar</packaging>
>>> + <name>Apache Log4j Plugins</name>
>>> + <description>Log4j Plugin Support</description>
>>> + <properties>
>>> + <log4jParentDir>${basedir}/..</log4jParentDir>
>>> + <docLabel>Plugin Documentation</docLabel>
>>> + <projectDir>/plugins</projectDir>
>>> + </properties>
>>> + <dependencies>
>>> + <dependency>
>>> + <groupId>org.apache.logging.log4j</groupId>
>>> + <artifactId>log4j-api</artifactId>
>>> + </dependency>
>>> + <!-- Classes and resources to be shaded into the core jar -->
>>> + <dependency>
>>> + <groupId>org.apache.logging.log4j</groupId>
>>> + <artifactId>log4j-plugins-java9</artifactId>
>>> + <scope>provided</scope>
>>> + <type>zip</type>
>>> + </dependency>
>>> + <!-- Used for OSGi bundle support -->
>>> + <dependency>
>>> + <groupId>org.osgi</groupId>
>>> + <artifactId>org.osgi.core</artifactId>
>>> + <scope>provided</scope>
>>> + </dependency>
>>> +
>>> + <!-- TEST DEPENDENCIES -->
>>> +
>>> + <!-- Pull in useful test classes from API -->
>>> + <dependency>
>>> + <groupId>org.apache.logging.log4j</groupId>
>>> + <artifactId>log4j-api</artifactId>
>>> + <type>test-jar</type>
>>> + <scope>test</scope>
>>> + </dependency>
>>> + <dependency>
>>> + <groupId>junit</groupId>
>>> + <artifactId>junit</artifactId>
>>> + <scope>test</scope>
>>> + </dependency>
>>> + <dependency>
>>> + <groupId>org.hamcrest</groupId>
>>> + <artifactId>hamcrest-all</artifactId>
>>> + <scope>test</scope>
>>> + </dependency>
>>> + </dependencies>
>>> + <build>
>>> + <plugins>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-dependency-plugin</artifactId>
>>> + <version>3.0.2</version>
>>> + <executions>
>>> + <execution>
>>> + <id>unpack-classes</id>
>>> + <phase>prepare-package</phase>
>>> + <goals>
>>> + <goal>unpack</goal>
>>> + </goals>
>>> + <configuration>
>>> + <artifactItems>
>>> + <artifactItem>
>>> + <groupId>org.apache.logging.log4j</groupId>
>>> + <artifactId>log4j-plugins-java9</artifactId>
>>> + <version>${project.version}</version>
>>> + <type>zip</type>
>>> + <overWrite>false</overWrite>
>>> + </artifactItem>
>>> + </artifactItems>
>>> + <includes>**/*.class</includes>
>>> + <excludes>**/*.java</excludes>
>>> +
>>> <outputDirectory>${project.build.directory}</outputDirectory>
>>> + <overWriteReleases>false</overWriteReleases>
>>> + <overWriteSnapshots>true</overWriteSnapshots>
>>> + </configuration>
>>> + </execution>
>>> + </executions>
>>> + </plugin>
>>> + <plugin>
>>> + <artifactId>maven-compiler-plugin</artifactId>
>>> + <executions>
>>> + <execution>
>>> + <!-- disable annotation processing for first pass -->
>>> + <id>generate-plugins</id>
>>> + <phase>process-classes</phase>
>>> + <goals>
>>> + <goal>compile</goal>
>>> + </goals>
>>> + <configuration>
>>> + <excludes>
>>> + <exclude>module-info.java</exclude>
>>> + </excludes>
>>> + </configuration>
>>> + </execution>
>>> + <execution>
>>> + <!-- disable annotation processing for first pass -->
>>> + <id>generate-test-plugins</id>
>>> + <phase>generate-test-sources</phase>
>>> + <goals>
>>> + <goal>compile</goal>
>>> + </goals>
>>> + <configuration>
>>> + <excludes>
>>> + <exclude>module-info.java</exclude>
>>> + </excludes>
>>> + <proc>only</proc>
>>> + </configuration>
>>> + </execution>
>>> + <execution>
>>> + <!-- disable annotation processing for first pass -->
>>> + <id>default-compile</id>
>>> + <configuration>
>>> + <excludes>
>>> + <exclude>module-info.java</exclude>
>>> + </excludes>
>>> + <proc>none</proc>
>>> + </configuration>
>>> + </execution>
>>> + </executions>
>>> + </plugin>
>>> + <plugin>
>>> + <artifactId>maven-surefire-plugin</artifactId>
>>> + <configuration>
>>> + <excludedGroups>
>>> + org.apache.logging.log4j.categories.PerformanceTests
>>> + </excludedGroups>
>>> + <systemPropertyVariables>
>>> +
>>> <org.apache.activemq.SERIALIZABLE_PACKAGES>*</org.apache.activemq.SERIALIZABLE_PACKAGES>
>>> + </systemPropertyVariables>
>>> + </configuration>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-failsafe-plugin</artifactId>
>>> + <configuration>
>>> + <skipTests>true</skipTests>
>>> + </configuration>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-jar-plugin</artifactId>
>>> + <executions>
>>> + <execution>
>>> + <id>default-jar</id>
>>> + <goals>
>>> + <goal>jar</goal>
>>> + </goals>
>>> + <configuration combine.self="override">
>>> + <archive>
>>> + <manifestFile>${manifestfile}</manifestFile>
>>> + <manifestEntries>
>>> + <Specification-Title>${project.name
>>> }</Specification-Title>
>>> +
>>> <Specification-Version>${project.version}</Specification-Version>
>>> + <Specification-Vendor>${project.organization.name
>>> }</Specification-Vendor>
>>> + <Implementation-Title>${project.name
>>> }</Implementation-Title>
>>> +
>>> <Implementation-Version>${project.version}</Implementation-Version>
>>> + <Implementation-Vendor>${project.organization.name
>>> }</Implementation-Vendor>
>>> +
>>> <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
>>> +
>>> <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
>>> +
>>> <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
>>> +
>>> <Automatic-Module-Name>org.apache.logging.log4j.plugins</Automatic-Module-Name>
>>> + <Multi-Release>true</Multi-Release>
>>> + </manifestEntries>
>>> + </archive>
>>> + </configuration>
>>> + </execution>
>>> + <execution>
>>> + <id>default</id>
>>> + <goals>
>>> + <goal>test-jar</goal>
>>> + </goals>
>>> + <configuration>
>>> + <archive>
>>> + <manifestFile>${manifestfile}</manifestFile>
>>> + <manifestEntries>
>>> + <Specification-Title>${project.name
>>> }</Specification-Title>
>>> +
>>> <Specification-Version>${project.version}</Specification-Version>
>>> + <Specification-Vendor>${project.organization.name
>>> }</Specification-Vendor>
>>> + <Implementation-Title>${project.name
>>> }</Implementation-Title>
>>> +
>>> <Implementation-Version>${project.version}</Implementation-Version>
>>> + <Implementation-Vendor>${project.organization.name
>>> }</Implementation-Vendor>
>>> +
>>> <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
>>> +
>>> <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
>>> +
>>> <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
>>> + </manifestEntries>
>>> + </archive>
>>> + </configuration>
>>> + </execution>
>>> + </executions>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.felix</groupId>
>>> + <artifactId>maven-bundle-plugin</artifactId>
>>> + <configuration>
>>> + <instructions>
>>> +
>>> <Bundle-SymbolicName>org.apache.logging.log4j.plugins</Bundle-SymbolicName>
>>> + <!-- TODO: exclude internal classes from export -->
>>> +
>>> <Export-Package>org.apache.logging.log4j.plugins.*</Export-Package>
>>> + <Import-Package>
>>> + sun.reflect;resolution:=optional,
>>> + org.apache.logging.log4j.util,
>>> + *
>>> + </Import-Package>
>>> +
>>> <Bundle-Activator>org.apache.logging.log4j.plugins.osgi.Activator</Bundle-Activator>
>>> + </instructions>
>>> + </configuration>
>>> + </plugin>
>>> + </plugins>
>>> + </build>
>>> + <reporting>
>>> + <plugins>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-changes-plugin</artifactId>
>>> + <version>${changes.plugin.version}</version>
>>> + <reportSets>
>>> + <reportSet>
>>> + <reports>
>>> + <report>changes-report</report>
>>> + </reports>
>>> + </reportSet>
>>> + </reportSets>
>>> + <configuration>
>>> +
>>> <issueLinkTemplate>%URL%/show_bug.cgi?id=%ISSUE%</issueLinkTemplate>
>>> + <useJql>true</useJql>
>>> + </configuration>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-checkstyle-plugin</artifactId>
>>> + <version>${checkstyle.plugin.version}</version>
>>> + <configuration>
>>> +
>>> <!--<propertiesLocation>${vfs.parent.dir}/checkstyle.properties</propertiesLocation>
>>> -->
>>> +
>>> <configLocation>${log4jParentDir}/checkstyle.xml</configLocation>
>>> +
>>> <suppressionsLocation>${log4jParentDir}/checkstyle-suppressions.xml</suppressionsLocation>
>>> + <enableRulesSummary>false</enableRulesSummary>
>>> + <propertyExpansion>basedir=${basedir}</propertyExpansion>
>>> +
>>> <propertyExpansion>licensedir=${log4jParentDir}/checkstyle-header.txt</propertyExpansion>
>>> + </configuration>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-javadoc-plugin</artifactId>
>>> + <version>${javadoc.plugin.version}</version>
>>> + <configuration>
>>> + <failOnError>false</failOnError>
>>> + <bottom><![CDATA[<p align="center">Copyright ©
>>> {inceptionYear}-{currentYear} {organizationName}. All Rights Reserved.<br />
>>> + Apache Logging, Apache Log4j, Log4j, Apache, the Apache
>>> feather logo, the Apache Logging project logo,
>>> + and the Apache Log4j logo are trademarks of The Apache
>>> Software Foundation.</p>]]></bottom>
>>> + <!-- module link generation is completely broken in the javadoc
>>> plugin for a multi-module non-aggregating
>>> + project -->
>>> + <additionalparam>${javadoc.opts}</additionalparam>
>>> + <detectOfflineLinks>false</detectOfflineLinks>
>>> + <linksource>true</linksource>
>>> + <links>
>>> + <link>http://docs.oracle.com/javaee/6/api/</link>
>>> + <link>http://www.osgi.org/javadoc/r4v43/core/</link>
>>> + <link>
>>> https://commons.apache.org/proper/commons-lang/javadocs/api-release/
>>> </link>
>>> + </links>
>>> + <groups>
>>> + <group>
>>> + <title>Core API</title>
>>> + <packages>org.apache.logging.log4j.core</packages>
>>> + </group>
>>> + <group>
>>> + <title>Configuration</title>
>>> +
>>> <packages>org.apache.logging.log4j.core.config*:org.apache.logging.log4j.core.selector</packages>
>>> + </group>
>>> + <group>
>>> + <title>Core Plugins</title>
>>> +
>>> <packages>org.apache.logging.log4j.core.appender*:org.apache.logging.log4j.core.filter:org.apache.logging.log4j.core.layout:org.apache.logging.log4j.core.lookup:org.apache.logging.log4j.core.pattern:org.apache.logging.log4j.core.script</packages>
>>> + </group>
>>> + <group>
>>> + <title>Tools</title>
>>> + <packages>org.apache.logging.log4j.core.net
>>> *:org.apache.logging.log4j.core.tools</packages>
>>> + </group>
>>> + <group>
>>> + <title>Internals</title>
>>> +
>>> <packages>org.apache.logging.log4j.core.async:org.apache.logging.log4j.core.impl:org.apache.logging.log4j.core.util*:org.apache.logging.log4j.core.osgi:org.apache.logging.log4j.core.jackson:org.apache.logging.log4j.core.jmx</packages>
>>> + </group>
>>> + </groups>
>>> + </configuration>
>>> + <reportSets>
>>> + <reportSet>
>>> + <id>non-aggregate</id>
>>> + <reports>
>>> + <report>javadoc</report>
>>> + </reports>
>>> + </reportSet>
>>> + </reportSets>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>com.github.spotbugs</groupId>
>>> + <artifactId>spotbugs-maven-plugin</artifactId>
>>> + <configuration>
>>> + <fork>true</fork>
>>> + <jvmArgs>-Duser.language=en</jvmArgs>
>>> + <threshold>Normal</threshold>
>>> + <effort>Default</effort>
>>> +
>>> <excludeFilterFile>${log4jParentDir}/spotbugs-exclude-filter.xml</excludeFilterFile>
>>> + </configuration>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-jxr-plugin</artifactId>
>>> + <version>${jxr.plugin.version}</version>
>>> + <reportSets>
>>> + <reportSet>
>>> + <id>non-aggregate</id>
>>> + <reports>
>>> + <report>jxr</report>
>>> + </reports>
>>> + </reportSet>
>>> + <reportSet>
>>> + <id>aggregate</id>
>>> + <reports>
>>> + <report>aggregate</report>
>>> + </reports>
>>> + </reportSet>
>>> + </reportSets>
>>> + </plugin>
>>> + <plugin>
>>> + <groupId>org.apache.maven.plugins</groupId>
>>> + <artifactId>maven-pmd-plugin</artifactId>
>>> + <version>${pmd.plugin.version}</version>
>>> + <configuration>
>>> + <targetJdk>${maven.compiler.target}</targetJdk>
>>> + </configuration>
>>> + </plugin>
>>> + </plugins>
>>> + </reporting>
>>> +</project>
>>> +
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
>>> similarity index 97%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
>>> index c92c904..22fd9bf 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
>>> @@ -14,15 +14,15 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config;
>>> +package org.apache.logging.log4j.plugins;
>>> +
>>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>>
>>> import java.util.ArrayList;
>>> import java.util.HashMap;
>>> import java.util.List;
>>> import java.util.Map;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>>> -
>>> /**
>>> * A Configuration node.
>>> */
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
>>> similarity index 97%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
>>> index 8aaf117..348754f 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
>>> @@ -14,7 +14,9 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>> +
>>> +import org.apache.logging.log4j.util.Strings;
>>>
>>> import java.lang.annotation.Documented;
>>> import java.lang.annotation.ElementType;
>>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>>> import java.lang.annotation.RetentionPolicy;
>>> import java.lang.annotation.Target;
>>>
>>> -import org.apache.logging.log4j.util.Strings;
>>> -
>>> /**
>>> * Annotation that identifies a Class as a Plugin.
>>> */
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
>>> similarity index 87%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
>>> index 7be3dea..4dce103 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
>>> @@ -14,7 +14,7 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>>
>>> import java.lang.annotation.Documented;
>>> import java.lang.annotation.ElementType;
>>> @@ -23,7 +23,7 @@ import java.lang.annotation.RetentionPolicy;
>>> import java.lang.annotation.Target;
>>>
>>> /**
>>> - * Identifies a list of aliases for a {@link Plugin}, {@link
>>> PluginAttribute}, or {@link PluginBuilderAttribute}.
>>> + * Identifies a list of aliases for a Plugin, PluginAttribute, or
>>> PluginBuilderAttribute.
>>> */
>>> @Documented
>>> @Retention(RetentionPolicy.RUNTIME)
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
>>> similarity index 96%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
>>> index bd88220..b9d4684 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
>>> @@ -14,7 +14,10 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>> +
>>> +import org.apache.logging.log4j.plugins.visitors.PluginAttributeVisitor;
>>> +import org.apache.logging.log4j.util.Strings;
>>>
>>> import java.lang.annotation.Documented;
>>> import java.lang.annotation.ElementType;
>>> @@ -22,9 +25,6 @@ import java.lang.annotation.Retention;
>>> import java.lang.annotation.RetentionPolicy;
>>> import java.lang.annotation.Target;
>>>
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginAttributeVisitor;
>>> -import org.apache.logging.log4j.util.Strings;
>>> -
>>> /**
>>> * Identifies a Plugin Attribute and its default value. Note that only
>>> one of the defaultFoo attributes will be
>>> * used based on the type this annotation is attached to. Thus, for
>>> primitive types, the default<i>Type</i>
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
>>> similarity index 92%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
>>> index 675d78f..c7fce2f 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
>>> @@ -15,7 +15,10 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>> +
>>> +import
>>> org.apache.logging.log4j.plugins.visitors.PluginBuilderAttributeVisitor;
>>> +import org.apache.logging.log4j.util.Strings;
>>>
>>> import java.lang.annotation.Documented;
>>> import java.lang.annotation.ElementType;
>>> @@ -23,9 +26,6 @@ import java.lang.annotation.Retention;
>>> import java.lang.annotation.RetentionPolicy;
>>> import java.lang.annotation.Target;
>>>
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginBuilderAttributeVisitor;
>>> -import org.apache.logging.log4j.util.Strings;
>>> -
>>> /**
>>> * Marks a field as a Plugin Attribute.
>>> */
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
>>> similarity index 95%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
>>> index 4e69262..035b025 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
>>> @@ -15,7 +15,7 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>>
>>> import java.lang.annotation.Documented;
>>> import java.lang.annotation.ElementType;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
>>> similarity index 91%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
>>> index 7ea358b..6cfb6fa 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
>>> @@ -14,7 +14,9 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>> +
>>> +import org.apache.logging.log4j.plugins.visitors.PluginElementVisitor;
>>>
>>> import java.lang.annotation.Documented;
>>> import java.lang.annotation.ElementType;
>>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>>> import java.lang.annotation.RetentionPolicy;
>>> import java.lang.annotation.Target;
>>>
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor;
>>> -
>>> /**
>>> * Identifies a parameter as a Plugin and corresponds with an XML element
>>> (or equivalent) in configuration files.
>>> */
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
>>> similarity index 96%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
>>> index 1c04106..b071510 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
>>> @@ -14,7 +14,7 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>>
>>> import java.lang.annotation.Documented;
>>> import java.lang.annotation.ElementType;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
>>> similarity index 90%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
>>> index d60f1b5..b172268 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
>>> @@ -14,7 +14,9 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>> +
>>> +import org.apache.logging.log4j.plugins.visitors.PluginNodeVisitor;
>>>
>>> import java.lang.annotation.Documented;
>>> import java.lang.annotation.ElementType;
>>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>>> import java.lang.annotation.RetentionPolicy;
>>> import java.lang.annotation.Target;
>>>
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginNodeVisitor;
>>> -
>>> /**
>>> * Identifies a Plugin configuration Node.
>>> */
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
>>> similarity index 91%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
>>> index 9c20cc2..31e5a23 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
>>> @@ -14,7 +14,9 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>> +
>>> +import org.apache.logging.log4j.plugins.visitors.PluginValueVisitor;
>>>
>>> import java.lang.annotation.Documented;
>>> import java.lang.annotation.ElementType;
>>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>>> import java.lang.annotation.RetentionPolicy;
>>> import java.lang.annotation.Target;
>>>
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginValueVisitor;
>>> -
>>> /**
>>> * Identifies a parameter as a value. These correspond with property
>>> values generally, but are meant as values to be
>>> * used as a placeholder value somewhere.
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
>>> similarity index 89%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
>>> index 65fcb76..093cc50 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
>>> @@ -15,7 +15,9 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins;
>>> +package org.apache.logging.log4j.plugins;
>>> +
>>> +import org.apache.logging.log4j.plugins.visitors.PluginVisitor;
>>>
>>> import java.lang.annotation.Annotation;
>>> import java.lang.annotation.Documented;
>>> @@ -24,8 +26,6 @@ import java.lang.annotation.Retention;
>>> import java.lang.annotation.RetentionPolicy;
>>> import java.lang.annotation.Target;
>>>
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor;
>>> -
>>> /**
>>> * Meta-annotation to denote the class name to use that implements
>>> * {@link
>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor} for
>>> the annotated annotation.
>>> @@ -40,5 +40,5 @@ public @interface PluginVisitorStrategy {
>>> * for the given annotation. The generic type in {@code
>>> PluginVisitor} should match the annotation this annotation
>>> * is applied to.
>>> */
>>> - Class<? extends PluginVisitor<? extends Annotation>> value();
>>> + Class<? extends PluginVisitor<? extends Annotation, ?>> value();
>>> }
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
>>> similarity index 95%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>> copy to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
>>> index 15a162c..fd8012a 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
>>> @@ -14,7 +14,7 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>> +package org.apache.logging.log4j.plugins.convert;
>>>
>>> import org.apache.logging.log4j.util.EnglishEnums;
>>>
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
>>> similarity index 95%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
>>> index e629657..f9037b3 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
>>> @@ -14,7 +14,7 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>> +package org.apache.logging.log4j.plugins.convert;
>>>
>>> /**
>>> * Converts Strings to hex. This is used in place of
>>> java.xml.bind.DataTypeConverter which is not available by
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
>>> similarity index 95%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
>>> index e67e213..aaa5b4d 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
>>> @@ -15,7 +15,7 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>> +package org.apache.logging.log4j.plugins.convert;
>>>
>>> /**
>>> * Interface for doing automatic String conversion to a specific type.
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
>>> similarity index 92%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
>>> index 5088f15..fb5b27e 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
>>> @@ -14,7 +14,14 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>> +package org.apache.logging.log4j.plugins.convert;
>>> +
>>> +import org.apache.logging.log4j.Logger;
>>> +import org.apache.logging.log4j.plugins.util.PluginManager;
>>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>> +import org.apache.logging.log4j.plugins.util.TypeUtil;
>>> +import org.apache.logging.log4j.util.ReflectionUtil;
>>> +import org.apache.logging.log4j.status.StatusLogger;
>>>
>>> import java.lang.reflect.ParameterizedType;
>>> import java.lang.reflect.Type;
>>> @@ -25,13 +32,6 @@ import java.util.UnknownFormatConversionException;
>>> import java.util.concurrent.ConcurrentHashMap;
>>> import java.util.concurrent.ConcurrentMap;
>>>
>>> -import org.apache.logging.log4j.Logger;
>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>>> -import org.apache.logging.log4j.core.util.ReflectionUtil;
>>> -import org.apache.logging.log4j.core.util.TypeUtil;
>>> -import org.apache.logging.log4j.status.StatusLogger;
>>> -
>>> /**
>>> * Registry for {@link TypeConverter} plugins.
>>> *
>>> @@ -152,7 +152,12 @@ public class TypeConverterRegistry {
>>> }
>>>
>>> private void registerTypeAlias(final Type knownType, final Type
>>> aliasType) {
>>> - registry.putIfAbsent(aliasType, registry.get(knownType));
>>> + TypeConverter<?> converter = registry.get(knownType);
>>> + if (converter != null) {
>>> + registry.putIfAbsent(aliasType, converter);
>>> + } else {
>>> + LOGGER.error("Cannot locate converter for {}", knownType);
>>> + }
>>> }
>>>
>>> }
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
>>> similarity index 92%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
>>> index dc833f0..7a71b4a 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
>>> @@ -15,32 +15,27 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>> +package org.apache.logging.log4j.plugins.convert;
>>> +
>>> +import org.apache.logging.log4j.Level;
>>> +import org.apache.logging.log4j.Logger;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>> +import org.apache.logging.log4j.status.StatusLogger;
>>> +import org.apache.logging.log4j.util.LoaderUtil;
>>>
>>> import java.io.File;
>>> import java.math.BigDecimal;
>>> import java.math.BigInteger;
>>> -import java.net.InetAddress;
>>> -import java.net.MalformedURLException;
>>> -import java.net.URI;
>>> -import java.net.URISyntaxException;
>>> -import java.net.URL;
>>> +import java.net.*;
>>> import java.nio.charset.Charset;
>>> import java.nio.file.Path;
>>> import java.nio.file.Paths;
>>> import java.security.Provider;
>>> import java.security.Security;
>>> +import java.util.Base64;
>>> import java.util.UUID;
>>> import java.util.regex.Pattern;
>>>
>>> -import org.apache.logging.log4j.Level;
>>> -import org.apache.logging.log4j.Logger;
>>> -import org.apache.logging.log4j.core.appender.rolling.action.Duration;
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import org.apache.logging.log4j.core.util.CronExpression;
>>> -import org.apache.logging.log4j.status.StatusLogger;
>>> -import org.apache.logging.log4j.util.LoaderUtil;
>>> -
>>> /**
>>> * Collection of basic TypeConverter implementations. May be used to
>>> register additional TypeConverters or find
>>> * registered TypeConverters.
>>> @@ -56,6 +51,8 @@ public final class TypeConverters {
>>> */
>>> public static final String CATEGORY = "TypeConverter";
>>>
>>> + private static final Base64.Decoder decoder = Base64.getDecoder();
>>> +
>>> /**
>>> * Parses a {@link String} into a {@link BigDecimal}.
>>> */
>>> @@ -112,7 +109,7 @@ public final class TypeConverters {
>>> bytes = new byte[0];
>>> } else if (value.startsWith(PREFIX_BASE64)) {
>>> final String lexicalXSDBase64Binary =
>>> value.substring(PREFIX_BASE64.length());
>>> - bytes =
>>> Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
>>> + bytes = decoder.decode(lexicalXSDBase64Binary);
>>> } else if (value.startsWith(PREFIX_0x)) {
>>> final String lexicalXSDHexBinary =
>>> value.substring(PREFIX_0x.length());
>>> bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
>>> @@ -203,14 +200,6 @@ public final class TypeConverters {
>>> }
>>> }
>>>
>>> - @Plugin(name = "CronExpression", category = CATEGORY)
>>> - public static class CronExpressionConverter implements
>>> TypeConverter<CronExpression> {
>>> - @Override
>>> - public CronExpression convert(final String s) throws Exception {
>>> - return new CronExpression(s);
>>> - }
>>> - }
>>> -
>>> /**
>>> * Converts a {@link String} into a {@link Double}.
>>> */
>>> @@ -223,18 +212,6 @@ public final class TypeConverters {
>>> }
>>>
>>> /**
>>> - * Converts a {@link String} into a {@link Duration}.
>>> - * @since 2.5
>>> - */
>>> - @Plugin(name = "Duration", category = CATEGORY)
>>> - public static class DurationConverter implements
>>> TypeConverter<Duration> {
>>> - @Override
>>> - public Duration convert(final String s) {
>>> - return Duration.parse(s);
>>> - }
>>> - }
>>> -
>>> - /**
>>> * Converts a {@link String} into a {@link File}.
>>> */
>>> @Plugin(name = "File", category = CATEGORY)
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
>>> similarity index 80%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
>>> index f22ba49..958beb4 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
>>> @@ -16,8 +16,7 @@
>>> */
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * TypeConverter plugins for converter strings into various types. These
>>> plugins are used for parsing plugin
>>> + * attributes in plugin factory methods.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +package org.apache.logging.log4j.plugins.convert;
>>> diff --git
>>> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
>>> new file mode 100644
>>> index 0000000..518bee7
>>> --- /dev/null
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
>>> @@ -0,0 +1,103 @@
>>> +/*
>>> + * 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.plugins.osgi;
>>> +
>>> +import org.apache.logging.log4j.LogManager;
>>> +import org.apache.logging.log4j.Logger;
>>> +import org.apache.logging.log4j.plugins.processor.PluginService;
>>> +import org.apache.logging.log4j.plugins.util.PluginRegistry;
>>> +import org.apache.logging.log4j.spi.Provider;
>>> +import org.apache.logging.log4j.status.StatusLogger;
>>> +import org.apache.logging.log4j.util.PropertiesUtil;
>>> +import org.osgi.framework.*;
>>> +import org.osgi.framework.wiring.BundleWiring;
>>> +
>>> +import java.util.Hashtable;
>>> +import java.util.concurrent.atomic.AtomicReference;
>>> +
>>> +/**
>>> + * OSGi BundleActivator.
>>> + */
>>> +public final class Activator implements BundleActivator,
>>> SynchronousBundleListener {
>>> +
>>> + private static final Logger LOGGER = StatusLogger.getLogger();
>>> +
>>> + private final AtomicReference<BundleContext> contextRef = new
>>> AtomicReference<>();
>>> +
>>> + ServiceRegistration provideRegistration = null;
>>> +
>>> + @Override
>>> + public void start(final BundleContext context) throws Exception {
>>> + final PluginService pluginService = new Log4jProvider();
>>> + final Hashtable<String, String> props = new Hashtable<>();
>>> + props.put("APIVersion", "3.0");
>>> + provideRegistration =
>>> context.registerService(pluginService.class.getName(), provider, props);
>>> + if (this.contextRef.compareAndSet(null, context)) {
>>> + context.addBundleListener(this);
>>> + // done after the BundleListener as to not miss any new
>>> bundle installs in the interim
>>> + scanInstalledBundlesForPlugins(context);
>>> + }
>>> + }
>>> +
>>> + private static void scanInstalledBundlesForPlugins(final
>>> BundleContext context) {
>>> + final Bundle[] bundles = context.getBundles();
>>> + for (final Bundle bundle : bundles) {
>>> + // TODO: bundle state can change during this
>>> + scanBundleForPlugins(bundle);
>>> + }
>>> + }
>>> +
>>> + private static void scanBundleForPlugins(final Bundle bundle) {
>>> + final long bundleId = bundle.getBundleId();
>>> + // LOG4J2-920: don't scan system bundle for plugins
>>> + if (bundle.getState() == Bundle.ACTIVE && bundleId != 0) {
>>> + LOGGER.trace("Scanning bundle [{}, id=%d] for plugins.",
>>> bundle.getSymbolicName(), bundleId);
>>> + PluginRegistry.getInstance().loadFromBundle(bundleId,
>>> + bundle.adapt(BundleWiring.class).getClassLoader());
>>> + }
>>> + }
>>> +
>>> + private static void stopBundlePlugins(final Bundle bundle) {
>>> + LOGGER.trace("Stopping bundle [{}] plugins.",
>>> bundle.getSymbolicName());
>>> + // TODO: plugin lifecycle code
>>> +
>>> PluginRegistry.getInstance().clearBundlePlugins(bundle.getBundleId());
>>> + }
>>> +
>>> + @Override
>>> + public void stop(final BundleContext context) throws Exception {
>>> + provideRegistration.unregister();
>>> + this.contextRef.compareAndSet(context, null);
>>> + }
>>> +
>>> + @Override
>>> + public void bundleChanged(final BundleEvent event) {
>>> + switch (event.getType()) {
>>> + // FIXME: STARTING instead of STARTED?
>>> + case BundleEvent.STARTED:
>>> + scanBundleForPlugins(event.getBundle());
>>> + break;
>>> +
>>> + case BundleEvent.STOPPING:
>>> + stopBundlePlugins(event.getBundle());
>>> + break;
>>> +
>>> + default:
>>> + break;
>>> + }
>>> + }
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
>>> similarity index 87%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
>>> index f22ba49..37dadd4 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
>>> @@ -16,8 +16,6 @@
>>> */
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * Collection of OSGi-specific classes for bundles.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +package org.apache.logging.log4j.plugins.osgi;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
>>> similarity index 87%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
>>> index f22ba49..b161185 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
>>> @@ -16,8 +16,6 @@
>>> */
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * Annotations for Log4j 2 plugins.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +package org.apache.logging.log4j.plugins;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
>>> similarity index 71%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
>>> index 2fd4160..784dece 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
>>> @@ -15,7 +15,7 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>> +package org.apache.logging.log4j.plugins.processor;
>>>
>>> import java.io.BufferedInputStream;
>>> import java.io.BufferedOutputStream;
>>> @@ -60,34 +60,6 @@ public class PluginCache {
>>> }
>>>
>>> /**
>>> - * 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) 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());
>>> - }
>>> - }
>>> - }
>>> - }
>>> -
>>> - /**
>>> * Loads and merges all the Log4j plugin cache files specified.
>>> Usually, this is obtained via a ClassLoader.
>>> *
>>> * @param resources URLs to all the desired plugin cache files to
>>> load.
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
>>> similarity index 85%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
>>> index dd43601..bd452d3 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
>>> @@ -15,7 +15,7 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>> +package org.apache.logging.log4j.plugins.processor;
>>>
>>> import java.io.Serializable;
>>>
>>> @@ -32,6 +32,18 @@ public class PluginEntry implements Serializable {
>>> private boolean defer;
>>> private transient String category;
>>>
>>> + public PluginEntry() {
>>> + }
>>> +
>>> + public PluginEntry(String key, String className, String name, boolean
>>> printable, boolean defer, String category) {
>>> + this.key = key;
>>> + this.className = className;
>>> + this.name = name;
>>> + this.printable = printable;
>>> + this.defer = defer;
>>> + this.category = category;
>>> + }
>>> +
>>> public String getKey() {
>>> return key;
>>> }
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
>>> similarity index 54%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
>>> index 2f3b53f..975d2ab 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
>>> @@ -15,38 +15,47 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>> +package org.apache.logging.log4j.plugins.processor;
>>> +
>>> +import org.apache.logging.log4j.LoggingException;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>> +import org.apache.logging.log4j.plugins.PluginAliases;
>>> +import org.apache.logging.log4j.util.Strings;
>>>
>>> -import java.io.IOException;
>>> -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;
>>> import javax.annotation.processing.AbstractProcessor;
>>> +import javax.annotation.processing.Messager;
>>> import javax.annotation.processing.RoundEnvironment;
>>> import javax.annotation.processing.SupportedAnnotationTypes;
>>> import javax.lang.model.SourceVersion;
>>> import javax.lang.model.element.Element;
>>> import javax.lang.model.element.ElementVisitor;
>>> +import javax.lang.model.element.Name;
>>> import javax.lang.model.element.TypeElement;
>>> import javax.lang.model.util.Elements;
>>> import javax.lang.model.util.SimpleElementVisitor7;
>>> import javax.tools.Diagnostic.Kind;
>>> import javax.tools.FileObject;
>>> +import javax.tools.JavaFileObject;
>>> import javax.tools.StandardLocation;
>>> +import java.io.BufferedWriter;
>>> +import java.io.IOException;
>>> +import java.io.OutputStreamWriter;
>>> +import java.io.PrintWriter;
>>> +import java.util.ArrayList;
>>> +import java.util.Collection;
>>> +import java.util.Collections;
>>> +import java.util.List;
>>> +import java.util.Locale;
>>> +import java.util.Map;
>>> +import java.util.Objects;
>>> +import java.util.Set;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
>>> -import org.apache.logging.log4j.util.Strings;
>>> +import static java.nio.charset.StandardCharsets.UTF_8;
>>>
>>> /**
>>> * Annotation processor for pre-scanning Log4j 2 plugins.
>>> */
>>>
>>> -@SupportedAnnotationTypes("org.apache.logging.log4j.core.config.plugins.*")
>>> +@SupportedAnnotationTypes({"org.apache.logging.log4j.plugins.*",
>>> "org.apache.logging.log4j.core.config.plugins.*"})
>>> public class PluginProcessor extends AbstractProcessor {
>>>
>>> // TODO: this could be made more abstract to allow for compile-time
>>> and run-time plugin processing
>>> @@ -57,8 +66,8 @@ public class PluginProcessor extends AbstractProcessor {
>>> */
>>> public static final String PLUGIN_CACHE_FILE =
>>>
>>> "META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat";
>>> -
>>> - private final PluginCache pluginCache = new PluginCache();
>>> + private static final String SERVICE_FILE_NAME =
>>> +
>>> "META-INF/services/org.apache.logging.log4j.plugins.processor.PluginService";
>>>
>>> @Override
>>> public SourceVersion getSupportedSourceVersion() {
>>> @@ -67,16 +76,21 @@ public class PluginProcessor extends AbstractProcessor
>>> {
>>>
>>> @Override
>>> public boolean process(final Set<? extends TypeElement> annotations,
>>> final RoundEnvironment roundEnv) {
>>> - System.out.println("Processing annotations");
>>> + Map<String, String> options = processingEnv.getOptions();
>>> + String packageName = options.get("pluginPackage");
>>> + Messager messager = processingEnv.getMessager();
>>> + messager.printMessage(Kind.NOTE, "Processing Log4j annotations");
>>> try {
>>> final Set<? extends Element> elements =
>>> roundEnv.getElementsAnnotatedWith(Plugin.class);
>>> if (elements.isEmpty()) {
>>> - System.out.println("No elements to process");
>>> + messager.printMessage(Kind.NOTE, "No elements to
>>> process");
>>> return false;
>>> }
>>> - collectPlugins(elements);
>>> - writeCacheFile(elements.toArray(new
>>> Element[elements.size()]));
>>> - System.out.println("Annotations processed");
>>> + List<PluginEntry> list = new ArrayList<>();
>>> + packageName = collectPlugins(packageName, elements, list);
>>> + writeClassFile(packageName, list);
>>> + writeServiceFile(packageName);
>>> + messager.printMessage(Kind.NOTE, "Annotations processed");
>>> return true;
>>> } catch (final IOException e) {
>>> e.printStackTrace();
>>> @@ -93,7 +107,8 @@ public class PluginProcessor extends AbstractProcessor {
>>> processingEnv.getMessager().printMessage(Kind.ERROR, message);
>>> }
>>>
>>> - private void collectPlugins(final Iterable<? extends Element>
>>> elements) {
>>> + private String collectPlugins(String packageName, final Iterable<?
>>> extends Element> elements, List<PluginEntry> list) {
>>> + boolean calculatePackage = packageName == null;
>>> final Elements elementUtils = processingEnv.getElementUtils();
>>> final ElementVisitor<PluginEntry, Plugin> pluginVisitor = new
>>> PluginElementVisitor(elementUtils);
>>> final ElementVisitor<Collection<PluginEntry>, Plugin>
>>> pluginAliasesVisitor = new PluginAliasesElementVisitor(
>>> @@ -104,23 +119,93 @@ public class PluginProcessor extends
>>> AbstractProcessor {
>>> continue;
>>> }
>>> final PluginEntry entry = element.accept(pluginVisitor,
>>> plugin);
>>> - final Map<String, PluginEntry> category =
>>> pluginCache.getCategory(entry.getCategory());
>>> - category.put(entry.getKey(), entry);
>>> + list.add(entry);
>>> + if (calculatePackage) {
>>> + packageName = calculatePackage(elementUtils, element,
>>> packageName);
>>> + }
>>> final Collection<PluginEntry> entries =
>>> element.accept(pluginAliasesVisitor, plugin);
>>> for (final PluginEntry pluginEntry : entries) {
>>> - category.put(pluginEntry.getKey(), pluginEntry);
>>> + list.add(pluginEntry);
>>> }
>>> }
>>> + return packageName;
>>> }
>>>
>>> - private void writeCacheFile(final Element... elements) throws
>>> IOException {
>>> + private String calculatePackage(Elements elements, Element element,
>>> String packageName) {
>>> + Name name = elements.getPackageOf(element).getQualifiedName();
>>> + if (name == null) {
>>> + return null;
>>> + }
>>> + String pkgName = name.toString();
>>> + if (packageName == null) {
>>> + return pkgName;
>>> + }
>>> + if (pkgName.length() == packageName.length()) {
>>> + return packageName;
>>> + }
>>> + if (pkgName.length() < packageName.length() &&
>>> packageName.startsWith(pkgName)) {
>>> + return pkgName;
>>> + }
>>> +
>>> + return commonPrefix(pkgName, packageName);
>>> + }
>>> +
>>> + private void writeServiceFile(String pkgName) 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);
>>> + SERVICE_FILE_NAME);
>>> + try (final PrintWriter writer = new PrintWriter(new
>>> BufferedWriter(new OutputStreamWriter(fileObject.openOutputStream(),
>>> UTF_8)))) {
>>> + writer.println(createFqcn(pkgName));
>>> + }
>>> + }
>>> +
>>> + private void writeClassFile(String pkg, List<PluginEntry> list) {
>>> + String fqcn = createFqcn(pkg);
>>> + try (final PrintWriter writer = createSourceFile(fqcn)) {
>>> + writer.println("package " + pkg + ".plugins;");
>>> + writer.println("");
>>> + writer.println("import
>>> org.apache.logging.log4j.plugins.processor.PluginEntry;");
>>> + writer.println("import
>>> org.apache.logging.log4j.plugins.processor.PluginService;");
>>> + writer.println("");
>>> + writer.println("public class Log4jPlugins extends
>>> PluginService {");
>>> + writer.println("");
>>> + writer.println(" private static PluginEntry[] entries =
>>> new PluginEntry[] {");
>>> + StringBuilder sb = new StringBuilder();
>>> + int max = list.size() - 1;
>>> + for (int i = 0; i < list.size(); ++i) {
>>> + PluginEntry entry = list.get(i);
>>> + sb.append(" ").append("new PluginEntry(\"");
>>> + sb.append(entry.getKey()).append("\", \"");
>>> + sb.append(entry.getClassName()).append("\", \"");
>>> + sb.append(entry.getName()).append("\", ");
>>> + sb.append(entry.isPrintable()).append(", ");
>>> + sb.append(entry.isDefer()).append(", \"");
>>> + sb.append(entry.getCategory()).append("\")");
>>> + if (i < max) {
>>> + sb.append(",");
>>> + }
>>> + writer.println(sb.toString());
>>> + sb.setLength(0);
>>> + }
>>> + writer.println(" };");
>>> + writer.println(" @Override");
>>> + writer.println(" public PluginEntry[] getEntries() {
>>> return entries;}");
>>> + writer.println("}");
>>> }
>>> }
>>>
>>> + private PrintWriter createSourceFile(String fqcn) {
>>> + try {
>>> + JavaFileObject sourceFile =
>>> processingEnv.getFiler().createSourceFile(fqcn);
>>> + return new PrintWriter(sourceFile.openWriter());
>>> + } catch (IOException e) {
>>> + throw new LoggingException("Unable to create Plugin Service
>>> Class " + fqcn, e);
>>> + }
>>> + }
>>> +
>>> + private String createFqcn(String packageName) {
>>> + return packageName + ".plugins.Log4jPlugins";
>>> + }
>>> +
>>> /**
>>> * ElementVisitor to scan the Plugin annotation.
>>> */
>>> @@ -146,6 +231,20 @@ public class PluginProcessor extends
>>> AbstractProcessor {
>>> }
>>> }
>>>
>>> + private String commonPrefix(String str1, String str2) {
>>> + int minLength = str1.length() < str2.length() ? str1.length() :
>>> str2.length();
>>> + for (int i = 0; i < minLength; i++) {
>>> + if (str1.charAt(i) != str2.charAt(i)) {
>>> + if (i > 1 && str1.charAt(i-1) == '.') {
>>> + return str1.substring(0, i-1);
>>> + } else {
>>> + return str1.substring(0, i);
>>> + }
>>> + }
>>> + }
>>> + return str1.substring(0, minLength);
>>> + }
>>> +
>>> /**
>>> * ElementVisitor to scan the PluginAliases annotation.
>>> */
>>> diff --git
>>> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>> new file mode 100644
>>> index 0000000..5042456
>>> --- /dev/null
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>>> @@ -0,0 +1,56 @@
>>> +/*
>>> + * 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.plugins.processor;
>>> +
>>> +import java.util.Collections;
>>> +import java.util.LinkedHashMap;
>>> +import java.util.Map;
>>> +
>>> +/**
>>> + * Class Description goes here.
>>> + */
>>> +public abstract class PluginService {
>>> +
>>> + private final Map<String, Map<String, PluginEntry>> categories = new
>>> LinkedHashMap<>();
>>> +
>>> + public PluginService() {
>>> + PluginEntry[] entries = getEntries();
>>> + for (PluginEntry entry : entries) {
>>> + String category = entry.getCategory().toLowerCase();
>>> + if (!categories.containsKey(category)) {
>>> + categories.put(category, new LinkedHashMap<>());
>>> + }
>>> + Map<String, PluginEntry> map = categories.get(category);
>>> + map.put(entry.getKey(), entry);
>>> + }
>>> + }
>>> +
>>> + public abstract PluginEntry[] getEntries();
>>> +
>>> + public Map<String, Map<String, PluginEntry>> getCategories() {
>>> + return Collections.unmodifiableMap(categories);
>>> + }
>>> +
>>> + public Map<String, PluginEntry> getCategory(String category) {
>>> + return
>>> Collections.unmodifiableMap(categories.get(category.toLowerCase()));
>>> + }
>>> +
>>> + public long size() {
>>> + return categories.size();
>>> + }
>>> +
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
>>> similarity index 94%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>> copy to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
>>> index 4f6ddda..2c296f9 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
>>> @@ -19,4 +19,4 @@
>>> * Java annotation processor for pre-scanning Log4j 2 plugins. This is
>>> provided as an alternative to using the
>>> * executable {@link
>>> org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in
>>> your build process.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>> +package org.apache.logging.log4j.plugins.processor;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
>>> similarity index 93%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
>>> index 0935ce8..ec8a07f 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
>>> @@ -15,7 +15,7 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.util;
>>> +package org.apache.logging.log4j.plugins.util;
>>>
>>> /**
>>> * A type of builder that can be used to configure and create a instances
>>> using a Java DSL instead of
>>> @@ -25,7 +25,7 @@ package org.apache.logging.log4j.core.util;
>>> * <p>
>>> * When creating <em>plugin</em> builders, it is customary to create
>>> the builder class as a public static inner class
>>> * called {@code Builder}. For instance, the builder class for
>>> - * {@link org.apache.logging.log4j.core.layout.PatternLayout
>>> PatternLayout} would be
>>> + * org.apache.logging.log4j.core.layout.PatternLayout PatternLayout
>>> would be
>>> * {@code PatternLayout.Builder}.
>>> * </p>
>>> *
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
>>> similarity index 96%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
>>> index 6f38d0e..b6f02f5 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
>>> @@ -15,17 +15,13 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>> +package org.apache.logging.log4j.plugins.util;
>>>
>>> import org.apache.logging.log4j.Logger;
>>> import org.apache.logging.log4j.status.StatusLogger;
>>> import org.apache.logging.log4j.util.Strings;
>>>
>>> -import java.util.Collection;
>>> -import java.util.HashMap;
>>> -import java.util.LinkedHashMap;
>>> -import java.util.List;
>>> -import java.util.Map;
>>> +import java.util.*;
>>> import java.util.concurrent.CopyOnWriteArrayList;
>>>
>>> /**
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
>>> similarity index 81%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
>>> index 99fa610..9e8c6e2 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
>>> @@ -15,32 +15,28 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>> +package org.apache.logging.log4j.plugins.util;
>>> +
>>> +import org.apache.logging.log4j.Logger;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>> +import org.apache.logging.log4j.plugins.PluginAliases;
>>> +import org.apache.logging.log4j.plugins.processor.PluginCache;
>>> +import org.apache.logging.log4j.plugins.processor.PluginEntry;
>>> +import org.apache.logging.log4j.plugins.processor.PluginProcessor;
>>> +import org.apache.logging.log4j.plugins.processor.PluginService;
>>> +import org.apache.logging.log4j.status.StatusLogger;
>>> +import org.apache.logging.log4j.util.LoaderUtil;
>>> +import org.apache.logging.log4j.util.Strings;
>>>
>>> import java.io.IOException;
>>> import java.net.URI;
>>> import java.net.URL;
>>> import java.text.DecimalFormat;
>>> -import java.util.ArrayList;
>>> -import java.util.Collections;
>>> -import java.util.Enumeration;
>>> -import java.util.HashMap;
>>> -import java.util.List;
>>> -import java.util.Map;
>>> +import java.util.*;
>>> import java.util.concurrent.ConcurrentHashMap;
>>> import java.util.concurrent.ConcurrentMap;
>>> import java.util.concurrent.atomic.AtomicReference;
>>>
>>> -import org.apache.logging.log4j.Logger;
>>> -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;
>>> -import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor;
>>> -import org.apache.logging.log4j.core.util.Loader;
>>> -import org.apache.logging.log4j.status.StatusLogger;
>>> -import org.apache.logging.log4j.util.Strings;
>>> -
>>> /**
>>> * Registry singleton for PluginType maps partitioned by source type and
>>> then by category names.
>>> */
>>> @@ -116,7 +112,8 @@ public class PluginRegistry {
>>> // already loaded
>>> return existing;
>>> }
>>> - final Map<String, List<PluginType<?>>> newPluginsByCategory =
>>> decodeCacheFiles(Loader.getClassLoader());
>>> + final Map<String, List<PluginType<?>>> newPluginsByCategory =
>>> decodeCacheFiles(LoaderUtil.getClassLoader());
>>> + loadPlugins(newPluginsByCategory);
>>>
>>> // Note multiple threads could be calling this method
>>> concurrently. Both will do the work,
>>> // but only one will be allowed to store the result in the
>>> AtomicReference.
>>> @@ -144,6 +141,7 @@ public class PluginRegistry {
>>> return existing;
>>> }
>>> final Map<String, List<PluginType<?>>> newPluginsByCategory =
>>> decodeCacheFiles(loader);
>>> + loadPlugins(loader, newPluginsByCategory);
>>>
>>> // Note multiple threads could be calling this method
>>> concurrently. Both will do the work,
>>> // but only one will be allowed to store the result in the outer
>>> map.
>>> @@ -155,6 +153,51 @@ public class PluginRegistry {
>>> return newPluginsByCategory;
>>> }
>>>
>>> + /**
>>> + * @since 3.0
>>> + */
>>> + public void loadPlugins(Map<String, List<PluginType<?>>> map) {
>>> + for (ClassLoader classLoader : LoaderUtil.getClassLoaders()) {
>>> + try {
>>> + loadPlugins(classLoader, map);
>>> + } catch (Throwable ex) {
>>> + LOGGER.debug("Unable to retrieve provider from
>>> ClassLoader {}", classLoader, ex);
>>> + }
>>> + }
>>> + }
>>> +
>>> + /**
>>> + * @since 3.0
>>> + */
>>> + public void loadPlugins(ClassLoader classLoader, Map<String,
>>> List<PluginType<?>>> map) {
>>> + final long startTime = System.nanoTime();
>>> + final ServiceLoader<PluginService> serviceLoader =
>>> ServiceLoader.load(PluginService.class, classLoader);
>>> + int pluginCount = 0;
>>> + for (final PluginService pluginService : serviceLoader) {
>>> + PluginEntry[] entries = pluginService.getEntries();
>>> + for (PluginEntry entry : entries) {
>>> + try {
>>> + final Class<?> clazz =
>>> classLoader.loadClass(entry.getClassName());
>>> + final PluginType<?> type = new PluginType(entry,
>>> clazz, entry.getName());
>>> + String category = entry.getCategory().toLowerCase();
>>> + if (!map.containsKey(category)) {
>>> + map.put(category, new ArrayList<>());
>>> + }
>>> + List<PluginType<?>> list = map.get(category);
>>> + list.add(type);
>>> + ++pluginCount;
>>> + } catch (final ClassNotFoundException e) {
>>> + LOGGER.info("Plugin [{}] could not be loaded due to
>>> missing classes.", entry.getClassName(), e);
>>> + }
>>> + }
>>> + }
>>> + final long endTime = System.nanoTime();
>>> + final DecimalFormat numFormat = new DecimalFormat("#0.000000");
>>> + final double seconds = (endTime - startTime) * 1e-9;
>>> + LOGGER.debug("Took {} seconds to load {} plugins from {}",
>>> + numFormat.format(seconds), pluginCount, classLoader);
>>> + }
>>> +
>>> private Map<String, List<PluginType<?>>> decodeCacheFiles(final
>>> ClassLoader loader) {
>>> final long startTime = System.nanoTime();
>>> final PluginCache cache = new PluginCache();
>>> @@ -214,7 +257,7 @@ public class PluginRegistry {
>>>
>>> final long startTime = System.nanoTime();
>>> final ResolverUtil resolver = new ResolverUtil();
>>> - final ClassLoader classLoader = Loader.getClassLoader();
>>> + final ClassLoader classLoader = LoaderUtil.getClassLoader();
>>> if (classLoader != null) {
>>> resolver.setClassLoader(classLoader);
>>> }
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
>>> similarity index 92%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
>>> index cc6bc66..c213f64 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
>>> @@ -14,16 +14,16 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>> +package org.apache.logging.log4j.plugins.util;
>>>
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
>>> +import org.apache.logging.log4j.plugins.processor.PluginEntry;
>>>
>>> /**
>>> * Plugin Descriptor. This is a memento object for Plugin annotations
>>> paired to their annotated classes.
>>> *
>>> * @param <T> The plug-in class, which can be any kind of class.
>>> - * @see org.apache.logging.log4j.core.config.plugins.Plugin
>>> + * @see org.apache.logging.log4j.plugins.Plugin
>>> */
>>> public class PluginType<T> {
>>>
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
>>> similarity index 97%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
>>> index 73b5fc0..a57356c 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
>>> @@ -14,33 +14,24 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>> +package org.apache.logging.log4j.plugins.util;
>>>
>>> -import java.io.File;
>>> -import java.io.FileInputStream;
>>> -import java.io.IOException;
>>> -import java.io.InputStream;
>>> -import java.io.UnsupportedEncodingException;
>>> +import org.apache.logging.log4j.Logger;
>>> +import org.apache.logging.log4j.util.LoaderUtil;
>>> +import org.apache.logging.log4j.status.StatusLogger;
>>> +import org.osgi.framework.FrameworkUtil;
>>> +import org.osgi.framework.wiring.BundleWiring;
>>> +
>>> +import java.io.*;
>>> import java.net.URI;
>>> import java.net.URISyntaxException;
>>> import java.net.URL;
>>> import java.net.URLDecoder;
>>> import java.nio.charset.StandardCharsets;
>>> -import java.util.Arrays;
>>> -import java.util.Collection;
>>> -import java.util.Enumeration;
>>> -import java.util.HashSet;
>>> -import java.util.List;
>>> -import java.util.Set;
>>> +import java.util.*;
>>> import java.util.jar.JarEntry;
>>> import java.util.jar.JarInputStream;
>>>
>>> -import org.apache.logging.log4j.Logger;
>>> -import org.apache.logging.log4j.core.util.Loader;
>>> -import org.apache.logging.log4j.status.StatusLogger;
>>> -import org.osgi.framework.FrameworkUtil;
>>> -import org.osgi.framework.wiring.BundleWiring;
>>> -
>>> /**
>>> * <p>
>>> * ResolverUtil is used to locate classes that are available in the/a
>>> class path and meet arbitrary conditions. The two
>>> @@ -126,7 +117,7 @@ public class ResolverUtil {
>>> * @return the ClassLoader that will be used to scan for classes
>>> */
>>> public ClassLoader getClassLoader() {
>>> - return classloader != null ? classloader : (classloader =
>>> Loader.getClassLoader(ResolverUtil.class, null));
>>> + return classloader != null ? classloader : (classloader =
>>> LoaderUtil.getClassLoader(ResolverUtil.class, null));
>>> }
>>>
>>> /**
>>> diff --git
>>> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
>>> new file mode 100644
>>> index 0000000..e2bb462
>>> --- /dev/null
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
>>> @@ -0,0 +1,217 @@
>>> +/*
>>> + * 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.plugins.util;
>>> +
>>> +import java.lang.reflect.*;
>>> +import java.util.ArrayList;
>>> +import java.util.List;
>>> +import java.util.Objects;
>>> +
>>> +/**
>>> + * Utility class for working with Java {@link Type}s and derivatives.
>>> This class is adapted heavily from the
>>> + * <a href="http://projects.spring.io/spring-framework/">Spring
>>> Framework</a>, specifically the
>>> + * <a href="
>>> http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/TypeUtils.html
>>> ">TypeUtils</a>
>>> + * class.
>>> + *
>>> + * @see Type
>>> + * @see GenericArrayType
>>> + * @see ParameterizedType
>>> + * @see WildcardType
>>> + * @see Class
>>> + * @since 2.1
>>> + */
>>> +public final class TypeUtil {
>>> +
>>> + private TypeUtil() {
>>> + }
>>> +
>>> + /**
>>> + * Gets all declared fields for the given class (including
>>> superclasses).
>>> + *
>>> + * @param cls the class to examine
>>> + * @return all declared fields for the given class (including
>>> superclasses).
>>> + * @see Class#getDeclaredFields()
>>> + */
>>> + public static List<Field> getAllDeclaredFields(Class<?> cls) {
>>> + final List<Field> fields = new ArrayList<>();
>>> + while (cls != null) {
>>> + for (final Field field : cls.getDeclaredFields()) {
>>> + fields.add(field);
>>> + }
>>> + cls = cls.getSuperclass();
>>> + }
>>> + return fields;
>>> + }
>>> + /**
>>> + * Indicates if two {@link Type}s are assignment compatible.
>>> + *
>>> + * @param lhs the left hand side to check assignability to
>>> + * @param rhs the right hand side to check assignability from
>>> + * @return {@code true} if it is legal to assign a variable of type
>>> {@code rhs} to a variable of type {@code lhs}
>>> + * @see Class#isAssignableFrom(Class)
>>> + */
>>> + public static boolean isAssignable(final Type lhs, final Type rhs) {
>>> + Objects.requireNonNull(lhs, "No left hand side type provided");
>>> + Objects.requireNonNull(rhs, "No right hand side type provided");
>>> + if (lhs.equals(rhs)) {
>>> + return true;
>>> + }
>>> + if (Object.class.equals(lhs)) {
>>> + // everything is assignable to Object
>>> + return true;
>>> + }
>>> + // raw type on left
>>> + if (lhs instanceof Class<?>) {
>>> + final Class<?> lhsClass = (Class<?>) lhs;
>>> + if (rhs instanceof Class<?>) {
>>> + // no generics involved
>>> + final Class<?> rhsClass = (Class<?>) rhs;
>>> + return lhsClass.isAssignableFrom(rhsClass);
>>> + }
>>> + if (rhs instanceof ParameterizedType) {
>>> + // check to see if the parameterized type has the same
>>> raw type as the lhs; this is legal
>>> + final Type rhsRawType = ((ParameterizedType)
>>> rhs).getRawType();
>>> + if (rhsRawType instanceof Class<?>) {
>>> + return lhsClass.isAssignableFrom((Class<?>)
>>> rhsRawType);
>>> + }
>>> + }
>>> + if (lhsClass.isArray() && rhs instanceof GenericArrayType) {
>>> + // check for compatible array component types
>>> + return isAssignable(lhsClass.getComponentType(),
>>> ((GenericArrayType) rhs).getGenericComponentType());
>>> + }
>>> + }
>>> + // parameterized type on left
>>> + if (lhs instanceof ParameterizedType) {
>>> + final ParameterizedType lhsType = (ParameterizedType) lhs;
>>> + if (rhs instanceof Class<?>) {
>>> + final Type lhsRawType = lhsType.getRawType();
>>> + if (lhsRawType instanceof Class<?>) {
>>> + return ((Class<?>)
>>> lhsRawType).isAssignableFrom((Class<?>) rhs);
>>> + }
>>> + } else if (rhs instanceof ParameterizedType) {
>>> + final ParameterizedType rhsType = (ParameterizedType) rhs;
>>> + return isParameterizedAssignable(lhsType, rhsType);
>>> + }
>>> + }
>>> + // generic array type on left
>>> + if (lhs instanceof GenericArrayType) {
>>> + final Type lhsComponentType = ((GenericArrayType)
>>> lhs).getGenericComponentType();
>>> + if (rhs instanceof Class<?>) {
>>> + // raw type on right
>>> + final Class<?> rhsClass = (Class<?>) rhs;
>>> + if (rhsClass.isArray()) {
>>> + return isAssignable(lhsComponentType,
>>> rhsClass.getComponentType());
>>> + }
>>> + } else if (rhs instanceof GenericArrayType) {
>>> + return isAssignable(lhsComponentType, ((GenericArrayType)
>>> rhs).getGenericComponentType());
>>> + }
>>> + }
>>> + // wildcard type on left
>>> + if (lhs instanceof WildcardType) {
>>> + return isWildcardAssignable((WildcardType) lhs, rhs);
>>> + }
>>> + // strange...
>>> + return false;
>>> + }
>>> +
>>> + private static boolean isParameterizedAssignable(final
>>> ParameterizedType lhs, final ParameterizedType rhs) {
>>> + if (lhs.equals(rhs)) {
>>> + // that was easy
>>> + return true;
>>> + }
>>> + final Type[] lhsTypeArguments = lhs.getActualTypeArguments();
>>> + final Type[] rhsTypeArguments = rhs.getActualTypeArguments();
>>> + final int size = lhsTypeArguments.length;
>>> + if (rhsTypeArguments.length != size) {
>>> + // clearly incompatible types
>>> + return false;
>>> + }
>>> + for (int i = 0; i < size; i++) {
>>> + // verify all type arguments are assignable
>>> + final Type lhsArgument = lhsTypeArguments[i];
>>> + final Type rhsArgument = rhsTypeArguments[i];
>>> + if (!lhsArgument.equals(rhsArgument) &&
>>> + !(lhsArgument instanceof WildcardType &&
>>> + isWildcardAssignable((WildcardType) lhsArgument,
>>> rhsArgument))) {
>>> + return false;
>>> + }
>>> + }
>>> + return true;
>>> + }
>>> +
>>> + private static boolean isWildcardAssignable(final WildcardType lhs,
>>> final Type rhs) {
>>> + final Type[] lhsUpperBounds = getEffectiveUpperBounds(lhs);
>>> + final Type[] lhsLowerBounds = getEffectiveLowerBounds(lhs);
>>> + if (rhs instanceof WildcardType) {
>>> + // oh boy, this scenario requires checking a lot of
>>> assignability!
>>> + final WildcardType rhsType = (WildcardType) rhs;
>>> + final Type[] rhsUpperBounds =
>>> getEffectiveUpperBounds(rhsType);
>>> + final Type[] rhsLowerBounds =
>>> getEffectiveLowerBounds(rhsType);
>>> + for (final Type lhsUpperBound : lhsUpperBounds) {
>>> + for (final Type rhsUpperBound : rhsUpperBounds) {
>>> + if (!isBoundAssignable(lhsUpperBound, rhsUpperBound))
>>> {
>>> + return false;
>>> + }
>>> + }
>>> + for (final Type rhsLowerBound : rhsLowerBounds) {
>>> + if (!isBoundAssignable(lhsUpperBound, rhsLowerBound))
>>> {
>>> + return false;
>>> + }
>>> + }
>>> + }
>>> + for (final Type lhsLowerBound : lhsLowerBounds) {
>>> + for (final Type rhsUpperBound : rhsUpperBounds) {
>>> + if (!isBoundAssignable(rhsUpperBound, lhsLowerBound))
>>> {
>>> + return false;
>>> + }
>>> + }
>>> + for (final Type rhsLowerBound : rhsLowerBounds) {
>>> + if (!isBoundAssignable(rhsLowerBound, lhsLowerBound))
>>> {
>>> + return false;
>>> + }
>>> + }
>>> + }
>>> + } else {
>>> + // phew, far less bounds to check
>>> + for (final Type lhsUpperBound : lhsUpperBounds) {
>>> + if (!isBoundAssignable(lhsUpperBound, rhs)) {
>>> + return false;
>>> + }
>>> + }
>>> + for (final Type lhsLowerBound : lhsLowerBounds) {
>>> + if (!isBoundAssignable(lhsLowerBound, rhs)) {
>>> + return false;
>>> + }
>>> + }
>>> + }
>>> + return true;
>>> + }
>>> +
>>> + private static Type[] getEffectiveUpperBounds(final WildcardType
>>> type) {
>>> + final Type[] upperBounds = type.getUpperBounds();
>>> + return upperBounds.length == 0 ? new Type[]{Object.class} :
>>> upperBounds;
>>> + }
>>> +
>>> + private static Type[] getEffectiveLowerBounds(final WildcardType
>>> type) {
>>> + final Type[] lowerBounds = type.getLowerBounds();
>>> + return lowerBounds.length == 0 ? new Type[]{null} : lowerBounds;
>>> + }
>>> +
>>> + private static boolean isBoundAssignable(final Type lhs, final Type
>>> rhs) {
>>> + return (rhs == null) || ((lhs != null) && isAssignable(lhs, rhs));
>>> + }
>>> +}
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
>>> similarity index 94%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
>>> index 4f6ddda..fae7580 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
>>> @@ -19,4 +19,4 @@
>>> * Java annotation processor for pre-scanning Log4j 2 plugins. This is
>>> provided as an alternative to using the
>>> * executable {@link
>>> org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in
>>> your build process.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>> +package org.apache.logging.log4j.plugins.util;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
>>> similarity index 81%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
>>> index 0ac2223..4586315 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
>>> @@ -14,14 +14,9 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>>
>>> -import java.lang.annotation.Annotation;
>>> -import java.lang.annotation.Documented;
>>> -import java.lang.annotation.ElementType;
>>> -import java.lang.annotation.Retention;
>>> -import java.lang.annotation.RetentionPolicy;
>>> -import java.lang.annotation.Target;
>>> +import java.lang.annotation.*;
>>>
>>> /**
>>> * Meta annotation to mark an annotation as a validation constraint. This
>>> annotation must specify a
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
>>> similarity index 96%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
>>> index 1d8c0c5..2f638a7 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
>>> @@ -14,7 +14,7 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>>
>>> import java.lang.annotation.Annotation;
>>>
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
>>> similarity index 93%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
>>> index 374c8ec..6236bb6 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
>>> @@ -14,7 +14,9 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>> +
>>> +import org.apache.logging.log4j.util.ReflectionUtil;
>>>
>>> import java.lang.annotation.Annotation;
>>> import java.lang.reflect.ParameterizedType;
>>> @@ -22,8 +24,6 @@ import java.lang.reflect.Type;
>>> import java.util.ArrayList;
>>> import java.util.Collection;
>>>
>>> -import org.apache.logging.log4j.core.util.ReflectionUtil;
>>> -
>>> /**
>>> * Utility class to locate an appropriate {@link ConstraintValidator}
>>> implementation for an annotation.
>>> *
>>> @@ -36,7 +36,7 @@ public final class ConstraintValidators {
>>>
>>> /**
>>> * Finds all relevant {@link ConstraintValidator} objects from an
>>> array of annotations. All validators will be
>>> - * {@link
>>> ConstraintValidator#initialize(java.lang.annotation.Annotation)
>>> initialized} before being returned.
>>> + * {@link ConstraintValidator#initialize(Annotation) initialized}
>>> before being returned.
>>> *
>>> * @param annotations the annotations to find constraint validators
>>> for
>>> * @return a collection of ConstraintValidators for the given
>>> annotations
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
>>> similarity index 73%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
>>> index e6f3c56..9b8a75d 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
>>> @@ -15,16 +15,12 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>>
>>> -import java.lang.annotation.Documented;
>>> -import java.lang.annotation.ElementType;
>>> -import java.lang.annotation.Retention;
>>> -import java.lang.annotation.RetentionPolicy;
>>> -import java.lang.annotation.Target;
>>> +import org.apache.logging.log4j.plugins.validation.Constraint;
>>> +import
>>> org.apache.logging.log4j.plugins.validation.validators.RequiredValidator;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.validators.RequiredValidator;
>>> +import java.lang.annotation.*;
>>>
>>> /**
>>> * Marks a plugin builder field or plugin factory parameter as required.
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
>>> similarity index 84%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
>>> index c652d40..14dd9a8 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
>>> @@ -14,10 +14,10 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.validators.ValidHostValidator;
>>> +import org.apache.logging.log4j.plugins.validation.Constraint;
>>> +import
>>> org.apache.logging.log4j.plugins.validation.validators.ValidHostValidator;
>>>
>>> import java.lang.annotation.*;
>>> import java.net.InetAddress;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
>>> similarity index 74%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
>>> index a7c68b1..c4aba16 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
>>> @@ -14,16 +14,12 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>>
>>> -import java.lang.annotation.Documented;
>>> -import java.lang.annotation.ElementType;
>>> -import java.lang.annotation.Retention;
>>> -import java.lang.annotation.RetentionPolicy;
>>> -import java.lang.annotation.Target;
>>> +import org.apache.logging.log4j.plugins.validation.Constraint;
>>> +import
>>> org.apache.logging.log4j.plugins.validation.validators.ValidPortValidator;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.validators.ValidPortValidator;
>>> +import java.lang.annotation.*;
>>>
>>> /**
>>> * Indicates that a plugin attribute must be a valid port number. A valid
>>> port number is an integer between 0 and
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
>>> similarity index 91%
>>> copy from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> copy to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
>>> index f22ba49..298cd5a 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
>>> @@ -20,4 +20,4 @@
>>> *
>>> * @since 2.1
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
>>> similarity index 93%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
>>> index 171b25a..15955cb 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
>>> @@ -20,4 +20,4 @@
>>> *
>>> * @since 2.1
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
>>> similarity index 86%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
>>> index 98c0a71..9df6d3b 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
>>> @@ -14,17 +14,17 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>>> -
>>> -import java.util.Collection;
>>> -import java.util.Map;
>>> +package org.apache.logging.log4j.plugins.validation.validators;
>>>
>>> import org.apache.logging.log4j.Logger;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>> -import org.apache.logging.log4j.core.util.Assert;
>>> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>> +import org.apache.logging.log4j.util.Assert;
>>> import org.apache.logging.log4j.status.StatusLogger;
>>>
>>> +import java.util.Collection;
>>> +import java.util.Map;
>>> +
>>> /**
>>> * Validator that checks an object for emptiness. Emptiness is defined
>>> here as:
>>> * <ul>
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
>>> similarity index 89%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
>>> index 6c01753..41abbfd 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
>>> @@ -14,11 +14,11 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>>> +package org.apache.logging.log4j.plugins.validation.validators;
>>>
>>> import org.apache.logging.log4j.Logger;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
>>> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
>>> import org.apache.logging.log4j.status.StatusLogger;
>>>
>>> import java.net.InetAddress;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
>>> similarity index 85%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
>>> index a59742c..27e97f0 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
>>> @@ -14,12 +14,12 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>>> +package org.apache.logging.log4j.plugins.validation.validators;
>>>
>>> import org.apache.logging.log4j.Logger;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
>>> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
>>> +import org.apache.logging.log4j.plugins.convert.TypeConverters;
>>> import org.apache.logging.log4j.status.StatusLogger;
>>>
>>> /**
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
>>> similarity index 92%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
>>> index a8ac560..cfe2041 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
>>> @@ -20,4 +20,4 @@
>>> *
>>> * @since 2.1
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>>> +package org.apache.logging.log4j.plugins.validation.validators;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
>>> similarity index 84%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
>>> index 560cbe3..b98dc09 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
>>> @@ -15,18 +15,18 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>> +package org.apache.logging.log4j.plugins.visitors;
>>> +
>>> +import org.apache.logging.log4j.Logger;
>>> +import org.apache.logging.log4j.plugins.convert.TypeConverters;
>>> +import org.apache.logging.log4j.status.StatusLogger;
>>> +import org.apache.logging.log4j.util.Strings;
>>>
>>> import java.lang.annotation.Annotation;
>>> import java.lang.reflect.Member;
>>> import java.util.Map;
>>> import java.util.Objects;
>>> -
>>> -import org.apache.logging.log4j.Logger;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
>>> -import org.apache.logging.log4j.core.lookup.StrSubstitutor;
>>> -import org.apache.logging.log4j.status.StatusLogger;
>>> -import org.apache.logging.log4j.util.Strings;
>>> +import java.util.function.Function;
>>>
>>> /**
>>> * Base class for PluginVisitor implementations. Provides convenience
>>> methods as well as all method implementations
>>> @@ -34,7 +34,7 @@ import org.apache.logging.log4j.util.Strings;
>>> *
>>> * @param <A> the Plugin annotation type.
>>> */
>>> -public abstract class AbstractPluginVisitor<A extends Annotation>
>>> implements PluginVisitor<A> {
>>> +public abstract class AbstractPluginVisitor<A extends Annotation, T>
>>> implements PluginVisitor<A, T> {
>>>
>>> /** Status logger. */
>>> protected static final Logger LOGGER = StatusLogger.getLogger();
>>> @@ -58,10 +58,6 @@ public abstract class AbstractPluginVisitor<A extends
>>> Annotation> implements Plu
>>> /**
>>> *
>>> */
>>> - protected StrSubstitutor substitutor;
>>> - /**
>>> - *
>>> - */
>>> protected Member member;
>>>
>>> /**
>>> @@ -75,7 +71,7 @@ public abstract class AbstractPluginVisitor<A extends
>>> Annotation> implements Plu
>>>
>>> @SuppressWarnings("unchecked")
>>> @Override
>>> - public PluginVisitor<A> setAnnotation(final Annotation anAnnotation) {
>>> + public PluginVisitor<A, T> setAnnotation(final Annotation
>>> anAnnotation) {
>>> final Annotation a = Objects.requireNonNull(anAnnotation, "No
>>> annotation was provided");
>>> if (this.clazz.isInstance(a)) {
>>> this.annotation = (A) a;
>>> @@ -84,25 +80,19 @@ public abstract class AbstractPluginVisitor<A extends
>>> Annotation> implements Plu
>>> }
>>>
>>> @Override
>>> - public PluginVisitor<A> setAliases(final String... someAliases) {
>>> + public PluginVisitor<A, T> setAliases(final String... someAliases) {
>>> this.aliases = someAliases;
>>> return this;
>>> }
>>>
>>> @Override
>>> - public PluginVisitor<A> setConversionType(final Class<?>
>>> aConversionType) {
>>> + public PluginVisitor<A, T> setConversionType(final Class<?>
>>> aConversionType) {
>>> this.conversionType = Objects.requireNonNull(aConversionType, "No
>>> conversion type class was provided");
>>> return this;
>>> }
>>>
>>> @Override
>>> - public PluginVisitor<A> setStrSubstitutor(final StrSubstitutor
>>> aSubstitutor) {
>>> - this.substitutor = Objects.requireNonNull(aSubstitutor, "No
>>> StrSubstitutor was provided");
>>> - return this;
>>> - }
>>> -
>>> - @Override
>>> - public PluginVisitor<A> setMember(final Member aMember) {
>>> + public PluginVisitor<A, T> setMember(final Member aMember) {
>>> this.member = aMember;
>>> return this;
>>> }
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
>>> similarity index 80%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
>>> index f4da42b..fbd28b9 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
>>> @@ -15,40 +15,39 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>> +package org.apache.logging.log4j.plugins.visitors;
>>>
>>> -import java.util.Map;
>>> -
>>> -import org.apache.logging.log4j.core.LogEvent;
>>> -import org.apache.logging.log4j.core.config.Configuration;
>>> -import org.apache.logging.log4j.core.config.Node;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>> -import org.apache.logging.log4j.core.util.NameUtil;
>>> +import org.apache.logging.log4j.plugins.Node;
>>> +import org.apache.logging.log4j.plugins.PluginAttribute;
>>> +import org.apache.logging.log4j.util.NameUtil;
>>> import org.apache.logging.log4j.util.StringBuilders;
>>>
>>> +import java.util.Map;
>>> +import java.util.function.Function;
>>> +
>>> /**
>>> * PluginVisitor implementation for {@link PluginAttribute}.
>>> */
>>> -public class PluginAttributeVisitor extends
>>> AbstractPluginVisitor<PluginAttribute> {
>>> +public class PluginAttributeVisitor extends
>>> AbstractPluginVisitor<PluginAttribute, Object> {
>>> public PluginAttributeVisitor() {
>>> super(PluginAttribute.class);
>>> }
>>>
>>> @Override
>>> - public Object visit(final Configuration configuration, final Node
>>> node, final LogEvent event,
>>> + public Object visit(final Object unused, final Node node, final
>>> Function<String, String> substitutor,
>>> final StringBuilder log) {
>>> final String name = this.annotation.value();
>>> final Map<String, String> attributes = node.getAttributes();
>>> final String rawValue = removeAttributeValue(attributes, name,
>>> this.aliases);
>>> - final String replacedValue = this.substitutor.replace(event,
>>> rawValue);
>>> - final Object defaultValue = findDefaultValue(event);
>>> + final String replacedValue = substitutor.apply(rawValue);
>>> + final Object defaultValue = findDefaultValue(substitutor);
>>> final Object value = convert(replacedValue, defaultValue);
>>> final Object debugValue = this.annotation.sensitive() ?
>>> NameUtil.md5(value + this.getClass().getName()) : value;
>>> StringBuilders.appendKeyDqValue(log, name, debugValue);
>>> return value;
>>> }
>>>
>>> - private Object findDefaultValue(final LogEvent event) {
>>> + private Object findDefaultValue(Function<String, String> substitutor)
>>> {
>>> if (this.conversionType == int.class || this.conversionType ==
>>> Integer.class) {
>>> return this.annotation.defaultInt();
>>> }
>>> @@ -76,6 +75,6 @@ public class PluginAttributeVisitor extends
>>> AbstractPluginVisitor<PluginAttribut
>>> if (this.conversionType == Class.class) {
>>> return this.annotation.defaultClass();
>>> }
>>> - return this.substitutor.replace(event,
>>> this.annotation.defaultString());
>>> + return substitutor.apply(this.annotation.defaultString());
>>> }
>>> }
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
>>> similarity index 74%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
>>> index e951456..398ff1c 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
>>> @@ -15,38 +15,37 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>> +package org.apache.logging.log4j.plugins.visitors;
>>>
>>> -import java.util.Map;
>>> -
>>> -import org.apache.logging.log4j.core.LogEvent;
>>> -import org.apache.logging.log4j.core.config.Configuration;
>>> -import org.apache.logging.log4j.core.config.Node;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>> -import org.apache.logging.log4j.core.util.NameUtil;
>>> +import org.apache.logging.log4j.plugins.Node;
>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>> +import org.apache.logging.log4j.util.NameUtil;
>>> import org.apache.logging.log4j.util.StringBuilders;
>>>
>>> +import java.util.Map;
>>> +import java.util.function.Function;
>>> +
>>> /**
>>> * PluginVisitor for PluginBuilderAttribute. If {@code null} is returned
>>> for the
>>> - * {@link #visit(org.apache.logging.log4j.core.config.Configuration,
>>> org.apache.logging.log4j.core.config.Node,
>>> org.apache.logging.log4j.core.LogEvent, StringBuilder)}
>>> + * {@link #visit(org.apache.logging.log4j.core.config.Configuration,
>>> org.apache.logging.log4j.plugins.Node,
>>> org.apache.logging.log4j.core.LogEvent, StringBuilder)}
>>> * method, then the default value of the field should remain untouched.
>>> *
>>> * @see org.apache.logging.log4j.core.config.plugins.util.PluginBuilder
>>> */
>>> -public class PluginBuilderAttributeVisitor extends
>>> AbstractPluginVisitor<PluginBuilderAttribute> {
>>> +public class PluginBuilderAttributeVisitor extends
>>> AbstractPluginVisitor<PluginBuilderAttribute, Object> {
>>>
>>> public PluginBuilderAttributeVisitor() {
>>> super(PluginBuilderAttribute.class);
>>> }
>>>
>>> @Override
>>> - public Object visit(final Configuration configuration, final Node
>>> node, final LogEvent event,
>>> + public Object visit(final Object unused, final Node node, final
>>> Function<String, String> substitutor,
>>> final StringBuilder log) {
>>> final String overridden = this.annotation.value();
>>> final String name = overridden.isEmpty() ? this.member.getName()
>>> : overridden;
>>> final Map<String, String> attributes = node.getAttributes();
>>> final String rawValue = removeAttributeValue(attributes, name,
>>> this.aliases);
>>> - final String replacedValue = this.substitutor.replace(event,
>>> rawValue);
>>> + final String replacedValue = substitutor.apply(rawValue);
>>> final Object value = convert(replacedValue, null);
>>> final Object debugValue = this.annotation.sensitive() ?
>>> NameUtil.md5(value + this.getClass().getName()) : value;
>>> StringBuilders.appendKeyDqValue(log, name, debugValue);
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
>>> similarity index 90%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
>>> index 2e6e6ef..f8197f1 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
>>> @@ -15,30 +15,29 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>> +package org.apache.logging.log4j.plugins.visitors;
>>> +
>>> +import org.apache.logging.log4j.plugins.Node;
>>> +import org.apache.logging.log4j.plugins.PluginElement;
>>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>>
>>> import java.lang.reflect.Array;
>>> import java.util.ArrayList;
>>> import java.util.Arrays;
>>> import java.util.Collection;
>>> import java.util.List;
>>> -
>>> -import org.apache.logging.log4j.core.LogEvent;
>>> -import org.apache.logging.log4j.core.config.Configuration;
>>> -import org.apache.logging.log4j.core.config.Node;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginElement;
>>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>>> +import java.util.function.Function;
>>>
>>> /**
>>> * PluginVisitor implementation for {@link PluginElement}. Supports
>>> arrays as well as singular values.
>>> */
>>> -public class PluginElementVisitor extends
>>> AbstractPluginVisitor<PluginElement> {
>>> +public class PluginElementVisitor extends
>>> AbstractPluginVisitor<PluginElement, Object> {
>>> public PluginElementVisitor() {
>>> super(PluginElement.class);
>>> }
>>>
>>> @Override
>>> - public Object visit(final Configuration configuration, final Node
>>> node, final LogEvent event,
>>> + public Object visit(final Object unused, final Node node, final
>>> Function<String, String> substitutor,
>>> final StringBuilder log) {
>>> final String name = this.annotation.value();
>>> if (this.conversionType.isArray()) {
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
>>> similarity index 77%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
>>> index 7f15392..9438b39 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
>>> @@ -15,23 +15,23 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>> +package org.apache.logging.log4j.plugins.visitors;
>>>
>>> -import org.apache.logging.log4j.core.LogEvent;
>>> -import org.apache.logging.log4j.core.config.Configuration;
>>> -import org.apache.logging.log4j.core.config.Node;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginNode;
>>> +import org.apache.logging.log4j.plugins.Node;
>>> +import org.apache.logging.log4j.plugins.PluginNode;
>>> +
>>> +import java.util.function.Function;
>>>
>>> /**
>>> * PluginVisitor implementation for {@link PluginNode}.
>>> */
>>> -public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode> {
>>> +public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode,
>>> Object> {
>>> public PluginNodeVisitor() {
>>> super(PluginNode.class);
>>> }
>>>
>>> @Override
>>> - public Object visit(final Configuration configuration, final Node
>>> node, final LogEvent event,
>>> + public Object visit(final Object unused, final Node node, final
>>> Function<String, String> substitutor,
>>> final StringBuilder log) {
>>> if (this.conversionType.isInstance(node)) {
>>> log.append("Node=").append(node.getName());
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
>>> similarity index 79%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
>>> index 8544570..2f68f04 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
>>> @@ -15,26 +15,26 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>> +package org.apache.logging.log4j.plugins.visitors;
>>>
>>> -import org.apache.logging.log4j.core.LogEvent;
>>> -import org.apache.logging.log4j.core.config.Configuration;
>>> -import org.apache.logging.log4j.core.config.Node;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginValue;
>>> +import org.apache.logging.log4j.plugins.Node;
>>> +import org.apache.logging.log4j.plugins.PluginValue;
>>> import org.apache.logging.log4j.util.StringBuilders;
>>> import org.apache.logging.log4j.util.Strings;
>>>
>>> +import java.util.function.Function;
>>> +
>>> /**
>>> * PluginVisitor implementation for {@link PluginValue}.
>>> */
>>> -public class PluginValueVisitor extends
>>> AbstractPluginVisitor<PluginValue> {
>>> +public class PluginValueVisitor extends
>>> AbstractPluginVisitor<PluginValue, Object> {
>>> public PluginValueVisitor() {
>>> super(PluginValue.class);
>>> }
>>>
>>> @Override
>>> - public Object visit(final Configuration configuration, final Node
>>> node, final LogEvent event,
>>> - final StringBuilder log) {
>>> + public Object visit(final Object unused, final Node node, final
>>> Function<String, String> substitutor,
>>> + final StringBuilder log) {
>>> final String name = this.annotation.value();
>>> final String elementValue = node.getValue();
>>> final String attributeValue = node.getAttributes().get("value");
>>> @@ -49,7 +49,7 @@ public class PluginValueVisitor extends
>>> AbstractPluginVisitor<PluginValue> {
>>> } else {
>>> rawValue = removeAttributeValue(node.getAttributes(),
>>> "value");
>>> }
>>> - final String value = this.substitutor.replace(event, rawValue);
>>> + final String value = substitutor.apply(rawValue);
>>> StringBuilders.appendKeyDqValue(log, name, value);
>>> return value;
>>> }
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
>>> similarity index 68%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
>>> index 34e2b78..fb7aca4 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
>>> @@ -15,15 +15,13 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>> +package org.apache.logging.log4j.plugins.visitors;
>>> +
>>> +import org.apache.logging.log4j.plugins.Node;
>>>
>>> import java.lang.annotation.Annotation;
>>> import java.lang.reflect.Member;
>>> -
>>> -import org.apache.logging.log4j.core.LogEvent;
>>> -import org.apache.logging.log4j.core.config.Configuration;
>>> -import org.apache.logging.log4j.core.config.Node;
>>> -import org.apache.logging.log4j.core.lookup.StrSubstitutor;
>>> +import java.util.function.Function;
>>>
>>> /**
>>> * Visitor strategy for parsing data from a {@link Node}, doing any
>>> relevant type conversion, and returning a
>>> @@ -31,7 +29,7 @@ import
>>> org.apache.logging.log4j.core.lookup.StrSubstitutor;
>>> *
>>> * @param <A> the Annotation type.
>>> */
>>> -public interface PluginVisitor<A extends Annotation> {
>>> +public interface PluginVisitor<A extends Annotation, T> {
>>>
>>> /**
>>> * Sets the Annotation to be used for this. If the given Annotation
>>> is not compatible with this class's type, then
>>> @@ -41,7 +39,7 @@ public interface PluginVisitor<A extends Annotation> {
>>> * @return {@code this}.
>>> * @throws NullPointerException if the argument is {@code null}.
>>> */
>>> - PluginVisitor<A> setAnnotation(Annotation annotation);
>>> + PluginVisitor<A, T> setAnnotation(Annotation annotation);
>>>
>>> /**
>>> * Sets the list of aliases to use for this visit. No aliases are
>>> required, however.
>>> @@ -49,7 +47,7 @@ public interface PluginVisitor<A extends Annotation> {
>>> * @param aliases the list of aliases to use.
>>> * @return {@code this}.
>>> */
>>> - PluginVisitor<A> setAliases(String... aliases);
>>> + PluginVisitor<A, T> setAliases(String... aliases);
>>>
>>> /**
>>> * Sets the class to convert the plugin value to on this visit. This
>>> should correspond with a class obtained from
>>> @@ -59,17 +57,7 @@ public interface PluginVisitor<A extends Annotation> {
>>> * @return {@code this}.
>>> * @throws NullPointerException if the argument is {@code null}.
>>> */
>>> - PluginVisitor<A> setConversionType(Class<?> conversionType);
>>> -
>>> - /**
>>> - * Sets the StrSubstitutor to use for converting raw strings before
>>> type conversion. Generally obtained from a
>>> - * {@link org.apache.logging.log4j.core.config.Configuration}.
>>> - *
>>> - * @param substitutor the StrSubstitutor to use on plugin values.
>>> - * @return {@code this}.
>>> - * @throws NullPointerException if the argument is {@code null}.
>>> - */
>>> - PluginVisitor<A> setStrSubstitutor(StrSubstitutor substitutor);
>>> + PluginVisitor<A, T> setConversionType(Class<?> conversionType);
>>>
>>> /**
>>> * Sets the Member that this visitor is being used for injection
>>> upon. For instance, this could be the Field
>>> @@ -79,16 +67,16 @@ public interface PluginVisitor<A extends Annotation> {
>>> * @param member the member this visitor is parsing a value for.
>>> * @return {@code this}.
>>> */
>>> - PluginVisitor<A> setMember(Member member);
>>> + PluginVisitor<A, T> setMember(Member member);
>>>
>>> /**
>>> * Visits a Node to obtain a value for constructing a Plugin object.
>>> *
>>> * @param configuration the current Configuration.
>>> * @param node the current Node corresponding to the Plugin
>>> object being created.
>>> - * @param event the current LogEvent that caused this Plugin
>>> object to be made (optional).
>>> - * @param log the StringBuilder being used to build a debug
>>> message.
>>> + * @param substitutor the function to perform String substitutions.
>>> + * @param log th e StringBuilder being used to build a
>>> debug message.
>>> * @return the converted value to be used for Plugin creation.
>>> */
>>> - Object visit(Configuration configuration, Node node, LogEvent event,
>>> StringBuilder log);
>>> + Object visit(T configuration, Node node, Function<String, String>
>>> substitutor, StringBuilder log);
>>> }
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
>>> similarity index 86%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
>>> index 10ee0df..695d387 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
>>> @@ -15,14 +15,14 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>>> -
>>> -import java.lang.annotation.Annotation;
>>> +package org.apache.logging.log4j.plugins.visitors;
>>>
>>> import org.apache.logging.log4j.Logger;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginVisitorStrategy;
>>> +import org.apache.logging.log4j.plugins.PluginVisitorStrategy;
>>> import org.apache.logging.log4j.status.StatusLogger;
>>>
>>> +import java.lang.annotation.Annotation;
>>> +
>>> /**
>>> * Utility class to locate an appropriate {@link PluginVisitor}
>>> implementation for an annotation.
>>> */
>>> @@ -41,13 +41,13 @@ public final class PluginVisitors {
>>> * @param annotation the Plugin annotation class to find a
>>> PluginVisitor for.
>>> * @return a PluginVisitor instance if one could be created, or
>>> {@code null} otherwise.
>>> */
>>> - public static PluginVisitor<? extends Annotation> findVisitor(final
>>> Class<? extends Annotation> annotation) {
>>> + public static <T> PluginVisitor<? extends Annotation, T>
>>> findVisitor(final Class<? extends Annotation> annotation) {
>>> final PluginVisitorStrategy strategy =
>>> annotation.getAnnotation(PluginVisitorStrategy.class);
>>> if (strategy == null) {
>>> return null;
>>> }
>>> try {
>>> - return strategy.value().newInstance();
>>> + return (PluginVisitor<? extends Annotation, T>)
>>> strategy.value().newInstance();
>>> } catch (final Exception e) {
>>> LOGGER.error("Error loading PluginVisitor [{}] for annotation
>>> [{}].", strategy.value(), annotation, e);
>>> return null;
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
>>> similarity index 67%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> rename to
>>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
>>> index f22ba49..0855b16 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>>> +++
>>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
>>> @@ -16,8 +16,9 @@
>>> */
>>>
>>> /**
>>> - * Validation annotations.
>>> - *
>>> - * @since 2.1
>>> + * Visitor classes for extracting values from a Configuration or Node
>>> corresponding to a plugin annotation.
>>> + * Visitor implementations must implement {@link
>>> org.apache.logging.log4j.plugins.visitors.PluginVisitor},
>>> + * and the corresponding annotation must be annotated with
>>> + * {@link org.apache.logging.log4j.plugins.PluginVisitorStrategy}.
>>> */
>>> -package
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>>> +package org.apache.logging.log4j.plugins.visitors;
>>> diff --git
>>> a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>> b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>> similarity index 91%
>>> rename from
>>> log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>> rename to
>>> log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>> index bb9dcb9..5d6951a 100644
>>> ---
>>> a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>> +++
>>> b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>>> @@ -14,4 +14,4 @@
>>> # See the license for the specific language governing permissions and
>>> # limitations under the license.
>>> #
>>> -org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor
>>> +org.apache.logging.log4j.plugins.processor.PluginProcessor
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
>>> similarity index 97%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
>>> index f9e757d..6e4b059 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
>>> @@ -14,7 +14,7 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>> +package org.apache.logging.log4j.plugins.convert;
>>>
>>> import org.junit.Test;
>>>
>>> @@ -63,7 +63,7 @@ public class TypeConverterRegistryTest {
>>> // TODO: is there a specific converter this should return?
>>> }
>>>
>>> - public static enum Foo {
>>> + public enum Foo {
>>> I, PITY, THE
>>> }
>>>
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
>>> similarity index 84%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
>>> index f4ceb41..48ea7dc 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
>>> @@ -15,10 +15,10 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>> +package org.apache.logging.log4j.plugins.processor;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>> +import org.apache.logging.log4j.plugins.PluginAliases;
>>>
>>> /**
>>> * Test plugin class for unit tests.
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
>>> similarity index 75%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
>>> index 9c37af4..034705c 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
>>> @@ -15,17 +15,19 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.processor;
>>> +package org.apache.logging.log4j.plugins.processor;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>> +import org.apache.logging.log4j.plugins.PluginAliases;
>>> import org.junit.BeforeClass;
>>> import org.junit.Test;
>>> import org.junit.runner.RunWith;
>>> import org.junit.runners.JUnit4;
>>>
>>> import java.net.URL;
>>> +import java.util.ArrayList;
>>> import java.util.Enumeration;
>>> +import java.util.List;
>>> import java.util.Map;
>>>
>>> import static org.junit.Assert.*;
>>> @@ -33,29 +35,29 @@ import static org.junit.Assert.*;
>>> @RunWith(JUnit4.class)
>>> public class PluginProcessorTest {
>>>
>>> - private static final PluginCache pluginCache = new PluginCache();
>>> + private static PluginService pluginService;
>>>
>>> private final Plugin p = FakePlugin.class.getAnnotation(Plugin.class);
>>>
>>> @BeforeClass
>>> public static void setUpClass() throws Exception {
>>> - final Enumeration<URL> resources =
>>> -
>>> PluginProcessor.class.getClassLoader().getResources(PluginProcessor.PLUGIN_CACHE_FILE);
>>> - pluginCache.loadCacheFiles(resources);
>>> + Class<?> clazz =
>>> PluginProcessor.class.getClassLoader().loadClass("org.apache.logging.log4j.plugins.plugins.Log4jPlugins");
>>> + assertNotNull("Could not locate plugins class", clazz);
>>> + pluginService = (PluginService)
>>> clazz.getDeclaredConstructor().newInstance();;
>>> }
>>>
>>> @Test
>>> public void testTestCategoryFound() throws Exception {
>>> assertNotNull("No plugin annotation on FakePlugin.", p);
>>> - final Map<String, PluginEntry> testCategory =
>>> pluginCache.getCategory(p.category());
>>> - assertNotEquals("No plugins were found.", 0, pluginCache.size());
>>> + final Map<String, PluginEntry> testCategory =
>>> pluginService.getCategory(p.category());
>>> + assertNotEquals("No plugins were found.", 0,
>>> pluginService.size());
>>> assertNotNull("The category '" + p.category() + "' was not
>>> found.", testCategory);
>>> assertFalse(testCategory.isEmpty());
>>> }
>>>
>>> @Test
>>> public void testFakePluginFoundWithCorrectInformation() throws
>>> Exception {
>>> - final PluginEntry fake =
>>> pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
>>> + final PluginEntry fake =
>>> pluginService.getCategory(p.category()).get(p.name().toLowerCase());
>>> verifyFakePluginEntry(p.name(), fake);
>>> }
>>>
>>> @@ -63,7 +65,7 @@ public class PluginProcessorTest {
>>> public void testFakePluginAliasesContainSameInformation() throws
>>> Exception {
>>> final PluginAliases aliases =
>>> FakePlugin.class.getAnnotation(PluginAliases.class);
>>> for (final String alias : aliases.value()) {
>>> - final PluginEntry fake =
>>> pluginCache.getCategory(p.category()).get(alias.toLowerCase());
>>> + final PluginEntry fake =
>>> pluginService.getCategory(p.category()).get(alias.toLowerCase());
>>> verifyFakePluginEntry(alias, fake);
>>> }
>>> }
>>> @@ -81,7 +83,7 @@ public class PluginProcessorTest {
>>> @Test
>>> public void testNestedPlugin() throws Exception {
>>> final Plugin p =
>>> FakePlugin.Nested.class.getAnnotation(Plugin.class);
>>> - final PluginEntry nested =
>>> pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
>>> + final PluginEntry nested =
>>> pluginService.getCategory(p.category()).get(p.name().toLowerCase());
>>> assertNotNull(nested);
>>> assertEquals(p.name().toLowerCase(), nested.getKey());
>>> assertEquals(FakePlugin.Nested.class.getName(),
>>> nested.getClassName());
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
>>> similarity index 93%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
>>> index 33e0ee1..d0b35d1 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
>>> @@ -15,27 +15,21 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>> +package org.apache.logging.log4j.plugins.util;
>>>
>>> -import static org.junit.Assert.assertEquals;
>>> +import org.apache.logging.log4j.junit.CleanFolders;
>>> +import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
>>> +import org.junit.Rule;
>>> +import org.junit.Test;
>>> +import org.junit.rules.RuleChain;
>>>
>>> import java.io.IOException;
>>> -import java.net.Proxy;
>>> -import java.net.URL;
>>> -import java.net.URLClassLoader;
>>> -import java.net.URLConnection;
>>> -import java.net.URLStreamHandler;
>>> -import java.net.URLStreamHandlerFactory;
>>> +import java.net.*;
>>> import java.util.Arrays;
>>> import java.util.Collections;
>>> import java.util.Enumeration;
>>>
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
>>> -import org.apache.logging.log4j.junit.CleanFolders;
>>> -import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
>>> -import org.junit.Rule;
>>> -import org.junit.Test;
>>> -import org.junit.rules.RuleChain;
>>> +import static org.junit.Assert.assertEquals;
>>>
>>> /**
>>> * Tests the ResolverUtil class for custom protocol like bundleresource,
>>> vfs, vfszip.
>>> @@ -187,9 +181,9 @@ public class ResolverUtilCustomProtocolTest {
>>> final ResolverUtil resolverUtil = new ResolverUtil();
>>> resolverUtil
>>> .setClassLoader(new SingleURLClassLoader(new
>>> URL("vfs:/" + ResolverUtilTest.WORK_DIR + "/resolverutil3/customplugin3/"),
>>> cl));
>>> - resolverUtil.findInPackage(new PluginTest(), "customplugin3");
>>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>>> "customplugin3");
>>> assertEquals("Class not found in packages", 1,
>>> resolverUtil.getClasses().size());
>>> - assertEquals("Unexpected class resolved",
>>> cl.loadClass("customplugin3.FixedString3Layout"),
>>> + assertEquals("Unexpected class resolved",
>>> cl.loadClass("customplugin3.FixedString3"),
>>> resolverUtil.getClasses().iterator().next());
>>> }
>>> }
>>> @@ -200,9 +194,9 @@ public class ResolverUtilCustomProtocolTest {
>>> final ResolverUtil resolverUtil = new ResolverUtil();
>>> resolverUtil.setClassLoader(new SingleURLClassLoader(
>>> new URL("vfs:/" + ResolverUtilTest.WORK_DIR +
>>> "/resolverutil4/customplugin4.jar/customplugin4/"), cl));
>>> - resolverUtil.findInPackage(new PluginTest(), "customplugin4");
>>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>>> "customplugin4");
>>> assertEquals("Class not found in packages", 1,
>>> resolverUtil.getClasses().size());
>>> - assertEquals("Unexpected class resolved",
>>> cl.loadClass("customplugin4.FixedString4Layout"),
>>> + assertEquals("Unexpected class resolved",
>>> cl.loadClass("customplugin4.FixedString4"),
>>> resolverUtil.getClasses().iterator().next());
>>> }
>>> }
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
>>> similarity index 82%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
>>> index 1c6371b..361fe7b 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
>>> @@ -15,33 +15,25 @@
>>> * limitations under the license.
>>> */
>>>
>>> -package org.apache.logging.log4j.core.config.plugins.util;
>>> +package org.apache.logging.log4j.plugins.util;
>>>
>>> -import static org.junit.Assert.assertEquals;
>>> -import static org.junit.Assert.assertTrue;
>>> -
>>> -import java.io.File;
>>> -import java.io.IOException;
>>> -import java.io.UnsupportedEncodingException;
>>> -import java.net.MalformedURLException;
>>> -import java.net.URI;
>>> -import java.net.URISyntaxException;
>>> -import java.net.URL;
>>> -import java.net.URLClassLoader;
>>> -import java.nio.file.FileSystem;
>>> -import java.nio.file.FileSystems;
>>> -import java.nio.file.Files;
>>> -import java.nio.file.Path;
>>> -import java.nio.file.StandardCopyOption;
>>> -import java.util.HashMap;
>>> -import java.util.Map;
>>> -
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
>>> import org.apache.logging.log4j.junit.CleanFolders;
>>> import org.junit.Rule;
>>> import org.junit.Test;
>>> import org.junit.rules.RuleChain;
>>>
>>> +import javax.tools.*;
>>> +import java.io.File;
>>> +import java.io.IOException;
>>> +import java.io.UnsupportedEncodingException;
>>> +import java.net.*;
>>> +import java.nio.file.*;
>>> +import java.util.*;
>>> +
>>> +import static org.junit.Assert.assertEquals;
>>> +import static org.junit.Assert.assertTrue;
>>> +import static org.junit.Assert.assertNotNull;
>>> +
>>> /**
>>> * Tests the ResolverUtil class.
>>> */
>>> @@ -67,6 +59,7 @@ public class ResolverUtilTest {
>>> private void testExtractPathFromJarUrlNotDecodedIfFileExists(final
>>> String existingFile)
>>> throws MalformedURLException, UnsupportedEncodingException,
>>> URISyntaxException {
>>> URL url = ResolverUtilTest.class.getResource(existingFile);
>>> + assertNotNull("No url returned for " + existingFile, url);
>>> if (!url.getProtocol().equals("jar")) {
>>> // create fake jar: URL that resolves to existing file
>>> url = new URL("jar:" + url.toExternalForm() + "!/some/entry");
>>> @@ -152,9 +145,9 @@ public class ResolverUtilTest {
>>> try (final URLClassLoader cl = compileAndCreateClassLoader("1")) {
>>> final ResolverUtil resolverUtil = new ResolverUtil();
>>> resolverUtil.setClassLoader(cl);
>>> - resolverUtil.findInPackage(new PluginTest(), "customplugin1");
>>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>>> "customplugin1");
>>> assertEquals("Class not found in packages", 1,
>>> resolverUtil.getClasses().size());
>>> - assertEquals("Unexpected class resolved",
>>> cl.loadClass("customplugin1.FixedString1Layout"),
>>> + assertEquals("Unexpected class resolved",
>>> cl.loadClass("customplugin1.FixedString1"),
>>> resolverUtil.getClasses().iterator().next());
>>> }
>>> }
>>> @@ -164,9 +157,9 @@ public class ResolverUtilTest {
>>> try (final URLClassLoader cl =
>>> compileJarAndCreateClassLoader("2")) {
>>> final ResolverUtil resolverUtil = new ResolverUtil();
>>> resolverUtil.setClassLoader(cl);
>>> - resolverUtil.findInPackage(new PluginTest(), "customplugin2");
>>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>>> "customplugin2");
>>> assertEquals("Class not found in packages", 1,
>>> resolverUtil.getClasses().size());
>>> - assertEquals("Unexpected class resolved",
>>> cl.loadClass("customplugin2.FixedString2Layout"),
>>> + assertEquals("Unexpected class resolved",
>>> cl.loadClass("customplugin2.FixedString2"),
>>> resolverUtil.getClasses().iterator().next());
>>> }
>>> }
>>> @@ -176,7 +169,7 @@ public class ResolverUtilTest {
>>> final File jarFile = new File(workDir, "customplugin" + suffix +
>>> ".jar");
>>> final URI jarURI = jarFile.toURI();
>>> createJar(jarURI, workDir, new File(workDir,
>>> - "customplugin" + suffix + "/FixedString" + suffix +
>>> "Layout.class"));
>>> + "customplugin" + suffix + "/FixedString" + suffix +
>>> ".class"));
>>> return URLClassLoader.newInstance(new URL[] {jarURI.toURL()});
>>> }
>>>
>>> @@ -186,9 +179,9 @@ public class ResolverUtilTest {
>>> }
>>>
>>> static File compile(final String suffix) throws IOException {
>>> - final File orig = new
>>> File("target/test-classes/customplugin/FixedStringLayout.java.source");
>>> + final File orig = new
>>> File("target/test-classes/customplugin/FixedString.java.source");
>>> final File workDir = new File(WORK_DIR, "resolverutil" + suffix);
>>> - final File f = new File(workDir, "customplugin" + suffix +
>>> "/FixedString" + suffix + "Layout.java");
>>> + final File f = new File(workDir, "customplugin" + suffix +
>>> "/FixedString" + suffix + ".java");
>>> final File parent = f.getParentFile();
>>> if (!parent.exists()) {
>>> assertTrue("Create customplugin" + suffix + " folder KO",
>>> f.getParentFile().mkdirs());
>>> @@ -199,7 +192,7 @@ public class ResolverUtilTest {
>>> .replaceAll("customplugin", "customplugin" + suffix);
>>> Files.write(f.toPath(), content.getBytes());
>>>
>>> - PluginManagerPackagesTest.compile(f);
>>> + compile(f);
>>> return workDir;
>>> }
>>>
>>> @@ -218,4 +211,29 @@ public class ResolverUtilTest {
>>> }
>>> }
>>>
>>> + static void compile(final File f) throws IOException {
>>> + // set up compiler
>>> + final JavaCompiler compiler =
>>> ToolProvider.getSystemJavaCompiler();
>>> + final DiagnosticCollector<JavaFileObject> diagnostics = new
>>> DiagnosticCollector<>();
>>> + final List<String> errors = new ArrayList<>();
>>> + try (final StandardJavaFileManager fileManager =
>>> compiler.getStandardFileManager(diagnostics, null, null)) {
>>> + final Iterable<? extends JavaFileObject> compilationUnits =
>>> fileManager.getJavaFileObjectsFromFiles(Arrays
>>> + .asList(f));
>>> +
>>> + // compile generated source
>>> + // (switch off annotation processing: no need to create
>>> Log4j2Plugins.dat)
>>> + final List<String> options = Arrays.asList("-proc:none");
>>> + compiler.getTask(null, fileManager, diagnostics, options,
>>> null, compilationUnits).call();
>>> +
>>> + // check we don't have any compilation errors
>>> + for (final Diagnostic<? extends JavaFileObject> diagnostic :
>>> diagnostics.getDiagnostics()) {
>>> + if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
>>> + errors.add(String.format("Compile error at line %d,
>>> column %d: %s%n", diagnostic.getLineNumber(),
>>> + diagnostic.getColumnNumber(),
>>> diagnostic.getMessage(Locale.getDefault())));
>>> + }
>>> + }
>>> + }
>>> + assertTrue(errors.toString(), errors.isEmpty());
>>> + }
>>> +
>>> }
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
>>> similarity index 87%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
>>> index 5689e29..0e243f2 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
>>> @@ -14,10 +14,10 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>>
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>>
>>> /**
>>> *
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
>>> similarity index 78%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
>>> index 34123c0..626798e 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
>>> @@ -14,15 +14,15 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>>
>>> -import java.net.InetSocketAddress;
>>> +import org.apache.logging.log4j.plugins.PluginAttribute;
>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
>>> +import java.net.InetSocketAddress;
>>>
>>> @Plugin(name = "HostAndPort", category = "Test")
>>> public class HostAndPort {
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>> similarity index 81%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>> index 3f2b15a..c3fe6c5 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>>> @@ -14,18 +14,18 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>
>>> @Plugin(name = "PluginWithGenericSubclassFoo1Builder", category = "Test")
>>> public class PluginWithGenericSubclassFoo1Builder extends
>>> AbstractPluginWithGenericBuilder {
>>>
>>> public static class Builder<B extends Builder<B>> extends
>>> AbstractPluginWithGenericBuilder.Builder<B>
>>> - implements
>>> org.apache.logging.log4j.core.util.Builder<PluginWithGenericSubclassFoo1Builder>
>>> {
>>> + implements
>>> org.apache.logging.log4j.plugins.util.Builder<PluginWithGenericSubclassFoo1Builder>
>>> {
>>>
>>> @PluginBuilderFactory
>>> public static <B extends Builder<B>> B newBuilder() {
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
>>> similarity index 80%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
>>> index 95a4209..9caf453 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
>>> @@ -14,15 +14,15 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>>
>>> -import java.util.Objects;
>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>> +import java.util.Objects;
>>>
>>> /**
>>> *
>>> @@ -51,7 +51,7 @@ public class ValidatingPlugin {
>>> return new Builder();
>>> }
>>>
>>> - public static class Builder implements
>>> org.apache.logging.log4j.core.util.Builder<ValidatingPlugin> {
>>> + public static class Builder implements
>>> org.apache.logging.log4j.plugins.util.Builder<ValidatingPlugin> {
>>>
>>> @PluginBuilderAttribute
>>> @Required(message = "The name given by the builder is null")
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>> similarity index 80%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>> index 81b9d6f..b0bec53 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
>>> @@ -14,15 +14,16 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>>
>>> -import java.util.Objects;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>> +
>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>> +import java.util.Objects;
>>>
>>> /**
>>> *
>>> @@ -51,7 +52,7 @@ public class ValidatingPluginWithGenericBuilder {
>>> return new Builder<B>().asBuilder();
>>> }
>>>
>>> - public static class Builder<B extends Builder<B>> implements
>>> org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithGenericBuilder>
>>> {
>>> + public static class Builder<B extends Builder<B>> implements
>>> org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithGenericBuilder>
>>> {
>>>
>>> @PluginBuilderAttribute
>>> @Required(message = "The name given by the builder is null")
>>> diff --git
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>> similarity index 80%
>>> rename from
>>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>> rename to
>>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>> index 74a6477..256181c 100644
>>> ---
>>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>> +++
>>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
>>> @@ -14,15 +14,15 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.validation;
>>> +package org.apache.logging.log4j.plugins.validation;
>>>
>>> -import java.util.Objects;
>>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>>
>>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>> -import
>>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>>> +import java.util.Objects;
>>>
>>> /**
>>> *
>>> @@ -51,7 +51,7 @@ public class ValidatingPluginWithTypedBuilder {
>>> return new Builder<>();
>>> }
>>>
>>> - public static class Builder<T> implements
>>> org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithTypedBuilder>
>>> {
>>> + public static class Builder<T> implements
>>> org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithTypedBuilder>
>>> {
>>>
>>> @PluginBuilderAttribute
>>> @Required(message = "The name given by the builder is null")
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>> b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
>>> similarity index 52%
>>> rename from
>>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>> rename to
>>> log4j-plugins/src/test/resources/customplugin/FixedString.java.source
>>> index 15a162c..85a62ec 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>>> +++ b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
>>> @@ -14,25 +14,32 @@
>>> * See the license for the specific language governing permissions and
>>> * limitations under the license.
>>> */
>>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>>
>>> -import org.apache.logging.log4j.util.EnglishEnums;
>>> +package customplugin;
>>>
>>> -/**
>>> - * Converts a {@link String} into a {@link Enum}. Returns {@code null}
>>> for invalid enum names.
>>> - *
>>> - * @param <E> the enum class to parse.
>>> - * @since 2.1 moved from TypeConverters
>>> - */
>>> -public class EnumConverter<E extends Enum<E>> implements TypeConverter<E>
>>> {
>>> - private final Class<E> clazz;
>>> +import java.util.Collections;
>>> +import java.util.Map;
>>> +
>>> +import org.apache.logging.log4j.plugins.Plugin;
>>> +import org.apache.logging.log4j.plugins.PluginAttribute;
>>> +import org.apache.logging.log4j.plugins.PluginFactory;
>>> +
>>> +@Plugin(name = "FixedString", category = "Core", elementType = "plugin",
>>> printObject = true)
>>> +public class FixedString {
>>> +
>>> + private String fixedString;
>>> +
>>> + @PluginFactory
>>> + public static FixedString create(
>>> + @PluginAttribute("fixedString") final String fixedString) {
>>> + return new FixedString(fixedString);
>>> + }
>>>
>>> - public EnumConverter(final Class<E> clazz) {
>>> - this.clazz = clazz;
>>> + public FixedString(String fixedString) {
>>> + this.fixedString = fixedString;
>>> }
>>>
>>> - @Override
>>> - public E convert(final String s) {
>>> - return EnglishEnums.valueOf(clazz, s);
>>> + public Map<String, String> getContentFormat() {
>>> + return Collections.emptyMap();
>>> }
>>> }
>>> diff --git
>>> a/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
>>> b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
>>> new file mode 100644
>>> index 0000000..b85475a
>>> --- /dev/null
>>> +++
>>> b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
>>> @@ -0,0 +1,31 @@
>>> +<?xml version="1.0" encoding="UTF-8"?>
>>> +<!--
>>> + 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.
>>> +
>>> +-->
>>> +<Configuration status="OFF" name="XMLConfigTest">
>>> +
>>> + <Appenders>
>>> + <List name="List">
>>> + </List>
>>> + </Appenders>
>>> + <Loggers>
>>> + <Root level="trace">
>>> + <AppenderRef ref="List"/>
>>> + </Root>
>>> + </Loggers>
>>> +
>>> +</Configuration>
>>> \ No newline at end of file
>>> diff --git a/log4j-plugins/src/test/resources/s p a c e
>>> s/log4j+config+with+plus+characters.xml
>>> b/log4j-plugins/src/test/resources/s p a c e
>>> s/log4j+config+with+plus+characters.xml
>>> new file mode 100644
>>> index 0000000..b85475a
>>> --- /dev/null
>>> +++ b/log4j-plugins/src/test/resources/s p a c e
>>> s/log4j+config+with+plus+characters.xml
>>> @@ -0,0 +1,31 @@
>>> +<?xml version="1.0" encoding="UTF-8"?>
>>> +<!--
>>> + 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.
>>> +
>>> +-->
>>> +<Configuration status="OFF" name="XMLConfigTest">
>>> +
>>> + <Appenders>
>>> + <List name="List">
>>> + </List>
>>> + </Appenders>
>>> + <Loggers>
>>> + <Root level="trace">
>>> + <AppenderRef ref="List"/>
>>> + </Root>
>>> + </Loggers>
>>> +
>>> +</Configuration>
>>> \ No newline at end of file
>>>
>>>
>
>
>
Re: [logging-log4j2] 01/02: LOG4J2-2621 - Initial commit
Posted by Ralph Goers <ra...@dslextreme.com>.
Yes, but it shows up in the correct place in the git repo and the diff in the email shows the correct directory.
Ralph
> On Jun 3, 2019, at 3:56 AM, Gary Gregory <ga...@gmail.com> wrote:
>
> This is weird, note the "}":
>
> .../org/apache/logging/log4j}/util/Assert.java | 0
>
> Gary
>
> On Sun, Jun 2, 2019 at 6:38 PM <rg...@apache.org> wrote:
>
>> This is an automated email from the ASF dual-hosted git repository.
>>
>> rgoers pushed a commit to branch LOG4J2-2621
>> in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
>>
>> commit b69c2d9e4b79ee7830a69463c6f89de1c50fe84d
>> Author: Ralph Goers <rg...@apache.org>
>> AuthorDate: Sun Jun 2 13:18:36 2019 -0700
>>
>> LOG4J2-2621 - Initial commit
>> ---
>> .../org/apache/logging/log4j}/util/Assert.java | 0
>> .../logging/log4j/util/InternalException.java | 56 ++++
>> .../org/apache/logging/log4j}/util/NameUtil.java | 0
>> .../apache/logging/log4j}/util/ReflectionUtil.java | 6 +-
>> .../log4j/junit/AbstractExternalFileCleaner.java | 0
>> .../org/apache/logging/log4j/junit/CleanFiles.java | 0
>> .../apache/logging/log4j/junit/CleanFolders.java | 0
>> .../log4j/junit/URLStreamHandlerFactoryRule.java | 0
>> .../org/apache/logging/log4j}/util/AssertTest.java | 2 +-
>> .../config/plugins/convert/Base64Converter.java | 79 -----
>> ...TypeConverters.java => CoreTypeConverters.java} | 7 +-
>> .../ValidatingPluginWithGenericBuilderTest.java | 10 +-
>> log4j-plugins-java9/pom.xml | 157 +++++++++
>> log4j-plugins-java9/src/assembly/java9.xml | 40 +++
>> .../src/main/java/module-info.java | 15 +-
>> .../org/apache/logging/log4j/plugins/Dummy.java | 9 +-
>> .../logging/log4j/plugins/convert/Dummy.java | 9 +-
>> .../log4j/plugins/processor/PluginService.java | 9 +-
>> .../apache/logging/log4j/plugins/util/Dummy.java | 9 +-
>> .../logging/log4j/plugins/validation/Dummy.java | 9 +-
>> .../logging/log4j/plugins/visitors/Dummy.java | 9 +-
>> log4j-plugins/pom.xml | 360
>> +++++++++++++++++++++
>> .../org/apache/logging/log4j/plugins}/Node.java | 6 +-
>> .../org/apache/logging/log4j}/plugins/Plugin.java | 6 +-
>> .../logging/log4j}/plugins/PluginAliases.java | 4 +-
>> .../logging/log4j}/plugins/PluginAttribute.java | 8 +-
>> .../log4j}/plugins/PluginBuilderAttribute.java | 8 +-
>> .../log4j}/plugins/PluginBuilderFactory.java | 2 +-
>> .../logging/log4j}/plugins/PluginElement.java | 6 +-
>> .../logging/log4j}/plugins/PluginFactory.java | 2 +-
>> .../apache/logging/log4j}/plugins/PluginNode.java | 6 +-
>> .../apache/logging/log4j}/plugins/PluginValue.java | 6 +-
>> .../log4j}/plugins/PluginVisitorStrategy.java | 8 +-
>> .../log4j}/plugins/convert/EnumConverter.java | 2 +-
>> .../log4j}/plugins/convert/HexConverter.java | 2 +-
>> .../log4j}/plugins/convert/TypeConverter.java | 2 +-
>> .../plugins/convert/TypeConverterRegistry.java | 23 +-
>> .../log4j}/plugins/convert/TypeConverters.java | 47 +--
>> .../log4j/plugins/convert}/package-info.java | 7 +-
>> .../logging/log4j/plugins/osgi/Activator.java | 103 ++++++
>> .../logging/log4j/plugins/osgi}/package-info.java | 6 +-
>> .../logging/log4j/plugins}/package-info.java | 6 +-
>> .../log4j}/plugins/processor/PluginCache.java | 30 +-
>> .../log4j}/plugins/processor/PluginEntry.java | 14 +-
>> .../log4j}/plugins/processor/PluginProcessor.java | 157 +++++++--
>> .../log4j/plugins/processor/PluginService.java | 56 ++++
>> .../log4j}/plugins/processor/package-info.java | 2 +-
>> .../logging/log4j/plugins}/util/Builder.java | 4 +-
>> .../logging/log4j}/plugins/util/PluginManager.java | 8 +-
>> .../log4j}/plugins/util/PluginRegistry.java | 81 +++--
>> .../logging/log4j}/plugins/util/PluginType.java | 6 +-
>> .../logging/log4j}/plugins/util/ResolverUtil.java | 29 +-
>> .../logging/log4j/plugins/util/TypeUtil.java | 217 +++++++++++++
>> .../logging/log4j/plugins/util}/package-info.java | 2 +-
>> .../log4j}/plugins/validation/Constraint.java | 9 +-
>> .../plugins/validation/ConstraintValidator.java | 2 +-
>> .../plugins/validation/ConstraintValidators.java | 8 +-
>> .../plugins/validation/constraints/Required.java | 12 +-
>> .../plugins/validation/constraints/ValidHost.java | 6 +-
>> .../plugins/validation/constraints/ValidPort.java | 12 +-
>> .../validation/constraints/package-info.java | 2 +-
>> .../log4j}/plugins/validation/package-info.java | 2 +-
>> .../validation/validators/RequiredValidator.java | 14 +-
>> .../validation/validators/ValidHostValidator.java | 6 +-
>> .../validation/validators/ValidPortValidator.java | 8 +-
>> .../validation/validators/package-info.java | 2 +-
>> .../plugins/visitors/AbstractPluginVisitor.java | 34 +-
>> .../plugins/visitors/PluginAttributeVisitor.java | 27 +-
>> .../visitors/PluginBuilderAttributeVisitor.java | 23 +-
>> .../plugins/visitors/PluginElementVisitor.java | 17 +-
>> .../log4j}/plugins/visitors/PluginNodeVisitor.java | 14 +-
>> .../plugins/visitors/PluginValueVisitor.java | 18 +-
>> .../log4j}/plugins/visitors/PluginVisitor.java | 36 +--
>> .../log4j}/plugins/visitors/PluginVisitors.java | 12 +-
>> .../log4j/plugins/visitors}/package-info.java | 9 +-
>> .../services/javax.annotation.processing.Processor | 2 +-
>> .../plugins/convert/TypeConverterRegistryTest.java | 4 +-
>> .../log4j}/plugins/processor/FakePlugin.java | 6 +-
>> .../plugins/processor/PluginProcessorTest.java | 26 +-
>> .../util/ResolverUtilCustomProtocolTest.java | 30 +-
>> .../log4j}/plugins/util/ResolverUtilTest.java | 76 +++--
>> .../AbstractPluginWithGenericBuilder.java | 6 +-
>> .../log4j}/plugins/validation/HostAndPort.java | 14 +-
>> .../PluginWithGenericSubclassFoo1Builder.java | 12 +-
>> .../plugins/validation/ValidatingPlugin.java | 16 +-
>> .../ValidatingPluginWithGenericBuilder.java | 17 +-
>> .../ValidatingPluginWithTypedBuilder.java | 16 +-
>> .../resources/customplugin/FixedString.java.source | 37 ++-
>> .../log4j+config+with+plus+characters.xml | 31 ++
>> .../log4j+config+with+plus+characters.xml | 31 ++
>> 90 files changed, 1655 insertions(+), 594 deletions(-)
>>
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
>> similarity index 100%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java
>> rename to log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
>> diff --git
>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
>> new file mode 100644
>> index 0000000..8c433db
>> --- /dev/null
>> +++
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
>> @@ -0,0 +1,56 @@
>> +/*
>> + * 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;
>> +
>> +/**
>> + * Exception thrown when an error occurs while logging. In most cases
>> exceptions will be handled
>> + * within Log4j but certain Appenders may be configured to allow
>> exceptions to propagate to the
>> + * application. This is a RuntimeException so that the exception may be
>> thrown in those cases without
>> + * requiring all Logger methods be contained with try/catch blocks.
>> + */
>> +public class LoggingException extends RuntimeException {
>> +
>> + private static final long serialVersionUID = 6366395965071580537L;
>> +
>> + /**
>> + * Construct an exception with a message.
>> + *
>> + * @param message The reason for the exception
>> + */
>> + public LoggingException(final String message) {
>> + super(message);
>> + }
>> +
>> + /**
>> + * Construct an exception with a message and underlying cause.
>> + *
>> + * @param message The reason for the exception
>> + * @param cause The underlying cause of the exception
>> + */
>> + public LoggingException(final String message, final Throwable cause) {
>> + super(message, cause);
>> + }
>> +
>> + /**
>> + * Construct an exception with an underlying cause.
>> + *
>> + * @param cause The underlying cause of the exception
>> + */
>> + public LoggingException(final Throwable cause) {
>> + super(cause);
>> + }
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
>> similarity index 100%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java
>> rename to
>> log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> similarity index 98%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
>> rename to
>> log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> index ffee439..f00e64a 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
>> +++
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> @@ -193,8 +193,10 @@ public final class ReflectionUtil {
>> } catch (final IllegalAccessException e) {
>> throw new IllegalStateException(e);
>> } catch (final InvocationTargetException e) {
>> - Throwables.rethrow(e.getCause());
>> - throw new InternalError("Unreachable");
>> + if (e.getCause() instanceof RuntimeException) {
>> + throw (RuntimeException) e.getCause();
>> + }
>> + throw new
>> }
>> }
>> }
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>> similarity index 100%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>> rename to
>> log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>> similarity index 100%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>> rename to
>> log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>> similarity index 100%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>> rename to
>> log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>> similarity index 100%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>> rename to
>> log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
>> b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
>> similarity index 99%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
>> rename to
>> log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
>> index 242c41e..7e46036 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
>> +++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
>> @@ -65,4 +65,4 @@ public class AssertTest {
>> assertEquals(isEmpty, Assert.isEmpty(value));
>> }
>>
>> -}
>> \ No newline at end of file
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
>> deleted file mode 100644
>> index f4e421f..0000000
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
>> +++ /dev/null
>> @@ -1,79 +0,0 @@
>> -/*
>> - * 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.convert;
>> -
>> -import java.lang.reflect.InvocationTargetException;
>> -import java.lang.reflect.Method;
>> -
>> -import org.apache.logging.log4j.Logger;
>> -import org.apache.logging.log4j.status.StatusLogger;
>> -import org.apache.logging.log4j.util.LoaderUtil;
>> -
>> -/**
>> - * @Since 2.9
>> - */
>> -public class Base64Converter {
>> -
>> - private static final Logger LOGGER = StatusLogger.getLogger();
>> - private static Method method = null;
>> - private static Object decoder = null;
>> -
>> - static {
>> - try {
>> - // Base64 is available in Java 8 and up.
>> - Class<?> clazz = LoaderUtil.loadClass("java.util.Base64");
>> - final Method getDecoder = clazz.getMethod("getDecoder",
>> (Class[]) null);
>> - decoder = getDecoder.invoke(null, (Object[]) null);
>> - clazz = decoder.getClass();
>> - method = clazz.getMethod("decode", String.class);
>> - } catch (final ClassNotFoundException ex) {
>> -
>> - } catch (final NoSuchMethodException ex) {
>> -
>> - } catch (final IllegalAccessException ex) {
>> -
>> - } catch (final InvocationTargetException ex) {
>> -
>> - }
>> - if (method == null) {
>> - try {
>> - // DatatypeConverter is not in the default module in Java
>> 9.
>> - final Class<?> clazz =
>> LoaderUtil.loadClass("javax.xml.bind.DatatypeConverter");
>> - method = clazz.getMethod("parseBase64Binary",
>> String.class);
>> - } catch (final ClassNotFoundException ex) {
>> - LOGGER.error("No Base64 Converter is available");
>> - } catch (final NoSuchMethodException ex) {
>> -
>> - }
>> - }
>> - }
>> -
>> - public static byte[] parseBase64Binary(final String encoded) {
>> - if (method == null) {
>> - LOGGER.error("No base64 converter");
>> - } else {
>> - try {
>> - return (byte[]) method.invoke(decoder, encoded);
>> - } catch (final IllegalAccessException ex) {
>> - LOGGER.error("Error decoding string - " +
>> ex.getMessage());
>> - } catch (final InvocationTargetException ex) {
>> - LOGGER.error("Error decoding string - " +
>> ex.getMessage());
>> - }
>> - }
>> - return new byte[0];
>> - }
>> -}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
>> similarity index 98%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>> copy to
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
>> index dc833f0..00e6da7 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>> +++
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
>> @@ -30,13 +30,14 @@ import java.nio.file.Path;
>> import java.nio.file.Paths;
>> import java.security.Provider;
>> import java.security.Security;
>> +import java.util.Base64;
>> import java.util.UUID;
>> import java.util.regex.Pattern;
>>
>> import org.apache.logging.log4j.Level;
>> import org.apache.logging.log4j.Logger;
>> import org.apache.logging.log4j.core.appender.rolling.action.Duration;
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> +import org.apache.logging.log4j.plugins.Plugin;
>> import org.apache.logging.log4j.core.util.CronExpression;
>> import org.apache.logging.log4j.status.StatusLogger;
>> import org.apache.logging.log4j.util.LoaderUtil;
>> @@ -56,6 +57,8 @@ public final class TypeConverters {
>> */
>> public static final String CATEGORY = "TypeConverter";
>>
>> + private static final Base64.Decoder decoder = Base64.getDecoder();
>> +
>> /**
>> * Parses a {@link String} into a {@link BigDecimal}.
>> */
>> @@ -112,7 +115,7 @@ public final class TypeConverters {
>> bytes = new byte[0];
>> } else if (value.startsWith(PREFIX_BASE64)) {
>> final String lexicalXSDBase64Binary =
>> value.substring(PREFIX_BASE64.length());
>> - bytes =
>> Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
>> + bytes = decoder.decode(lexicalXSDBase64Binary);
>> } else if (value.startsWith(PREFIX_0x)) {
>> final String lexicalXSDHexBinary =
>> value.substring(PREFIX_0x.length());
>> bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>> b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>> index 8ee5abb..27ac5fe 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>> +++
>> b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
>> @@ -20,12 +20,12 @@ import static org.junit.Assert.assertEquals;
>> import static org.junit.Assert.assertNotNull;
>> import static org.junit.Assert.assertNull;
>>
>> -import org.apache.logging.log4j.core.config.Node;
>> +import org.apache.logging.log4j.plugins.Node;
>> import org.apache.logging.log4j.core.config.NullConfiguration;
>> -import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
>> -import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.ValidatingPluginWithGenericBuilder;
>> +import org.apache.logging.log4j.plugins.util.PluginBuilder;
>> +import org.apache.logging.log4j.plugins.util.PluginManager;
>> +import org.apache.logging.log4j.plugins.util.PluginType;
>> +import
>> org.apache.logging.log4j.plugins.validation.ValidatingPluginWithGenericBuilder;
>> import org.junit.Before;
>> import org.junit.Test;
>>
>> diff --git a/log4j-plugins-java9/pom.xml b/log4j-plugins-java9/pom.xml
>> new file mode 100644
>> index 0000000..49f81c6
>> --- /dev/null
>> +++ b/log4j-plugins-java9/pom.xml
>> @@ -0,0 +1,157 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<!--
>> + ~ 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.
>> + -->
>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>> http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
>> ">
>> + <modelVersion>4.0.0</modelVersion>
>> + <parent>
>> + <groupId>org.apache.logging.log4j</groupId>
>> + <artifactId>log4j</artifactId>
>> + <version>3.0.0-SNAPSHOT</version>
>> + <relativePath>../</relativePath>
>> + </parent>
>> + <artifactId>log4j-plugins-java9</artifactId>
>> + <packaging>pom</packaging>
>> + <name>Apache Log4j Plugins Module support</name>
>> + <description>Apache Log4j Plugin Moduels Support</description>
>> + <properties>
>> + <log4jParentDir>${basedir}/..</log4jParentDir>
>> + <docLabel>Log4j Plugins Documentation</docLabel>
>> + <projectDir>/plugins</projectDir>
>> + </properties>
>> + <dependencies>
>> + <dependency>
>> + <groupId>org.apache.logging.log4j</groupId>
>> + <artifactId>log4j-api</artifactId>
>> + </dependency>
>> + <dependency>
>> + <groupId>junit</groupId>
>> + <artifactId>junit</artifactId>
>> + <scope>test</scope>
>> + </dependency>
>> + <dependency>
>> + <groupId>org.apache.maven</groupId>
>> + <artifactId>maven-core</artifactId>
>> + <scope>test</scope>
>> + </dependency>
>> + </dependencies>
>> + <build>
>> + <plugins>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-toolchains-plugin</artifactId>
>> + <version>1.1</version>
>> + <executions>
>> + <execution>
>> + <goals>
>> + <goal>toolchain</goal>
>> + </goals>
>> + </execution>
>> + </executions>
>> + <configuration>
>> + <toolchains>
>> + <jdk>
>> + <version>[9, )</version>
>> + </jdk>
>> + </toolchains>
>> + </configuration>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-compiler-plugin</artifactId>
>> + <executions>
>> + <execution>
>> + <id>default-compile</id>
>> + <phase>compile</phase>
>> + <goals>
>> + <goal>compile</goal>
>> + </goals>
>> + </execution>
>> + <execution>
>> + <id>default-test-compile</id>
>> + <phase>test-compile</phase>
>> + <goals>
>> + <goal>testCompile</goal>
>> + </goals>
>> + </execution>
>> + </executions>
>> + <configuration>
>> + <source>9</source>
>> + <target>9</target>
>> + <release>9</release>
>> + <proc>none</proc>
>> + <!-- disable errorprone -->
>> + <compilerId>javac</compilerId>
>> + </configuration>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-surefire-plugin</artifactId>
>> + <!-- Do not upgrade until
>> https://issues.apache.org/jira/browse/SUREFIRE-720 is fixed -->
>> + <version>2.13</version>
>> + <executions>
>> + <execution>
>> + <id>test</id>
>> + <phase>test</phase>
>> + <goals>
>> + <goal>test</goal>
>> + </goals>
>> + </execution>
>> + </executions>
>> + <configuration>
>> + <systemPropertyVariables>
>> + <java.awt.headless>true</java.awt.headless>
>> + </systemPropertyVariables>
>> + <includes>
>> + <include>**/Test*.java</include>
>> + <include>**/*Test.java</include>
>> + </includes>
>> + <excludes>
>> + <exclude>**/*FuncTest.java</exclude>
>> + </excludes>
>> + </configuration>
>> + </plugin>
>> + <plugin>
>> + <artifactId>maven-assembly-plugin</artifactId>
>> + <executions>
>> + <execution>
>> + <id>zip</id>
>> + <phase>package</phase>
>> + <goals>
>> + <goal>single</goal>
>> + </goals>
>> + <configuration>
>> +
>> <finalName>log4j-plugins-java9-${project.version}</finalName>
>> + <appendAssemblyId>false</appendAssemblyId>
>> + <descriptors>
>> + <descriptor>src/assembly/java9.xml</descriptor>
>> + </descriptors>
>> + </configuration>
>> + </execution>
>> + </executions>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-deploy-plugin</artifactId>
>> + <version>${deploy.plugin.version}</version>
>> + <configuration>
>> + <skip>true</skip>
>> + </configuration>
>> + </plugin>
>> + </plugins>
>> + </build>
>> +</project>
>> +
>> diff --git a/log4j-plugins-java9/src/assembly/java9.xml
>> b/log4j-plugins-java9/src/assembly/java9.xml
>> new file mode 100644
>> index 0000000..34649d4
>> --- /dev/null
>> +++ b/log4j-plugins-java9/src/assembly/java9.xml
>> @@ -0,0 +1,40 @@
>> +<?xml version='1.0' encoding='UTF-8'?>
>> +<!--
>> + 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.
>> +-->
>> +
>> +<assembly>
>> + <id>src</id>
>> + <formats>
>> + <format>zip</format>
>> + </formats>
>> + <baseDirectory>/</baseDirectory>
>> + <fileSets>
>> + <fileSet>
>> + <directory>${project.build.outputDirectory}</directory>
>> + <outputDirectory>/classes/META-INF/versions/9</outputDirectory>
>> + <includes>
>> + <include>module-info.class</include>
>> + </includes>
>> + <excludes>
>> + <exclude>**/Dummy.class</exclude>
>> + <exclude>**/PluginService.class</exclude>
>> + </excludes>
>> + </fileSet>
>> + </fileSets>
>> +</assembly>
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins-java9/src/main/java/module-info.java
>> similarity index 65%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to log4j-plugins-java9/src/main/java/module-info.java
>> index f22ba49..9802622 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++ b/log4j-plugins-java9/src/main/java/module-info.java
>> @@ -14,10 +14,13 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> +module org.apache.logging.log4j.plugins {
>> + exports org.apache.logging.log4j.plugins;
>> + exports org.apache.logging.log4j.plugins.convert;
>> + exports org.apache.logging.log4j.plugins.processor;
>> + exports org.apache.logging.log4j.plugins.util;
>> + exports org.apache.logging.log4j.plugins.validation;
>> + exports org.apache.logging.log4j.plugins.visitors;
>>
>> -/**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> - */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> + uses org.apache.logging.log4j.plugins.processor.PluginService;
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
>> similarity index 80%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
>> index f22ba49..14a90ed 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
>> @@ -14,10 +14,11 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> +package org.apache.logging.log4j.plugins;
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * This is a dummy class and is only here to allow module-info.java to
>> compile. It will not
>> + * be copied into the log4j-api module.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +public class Dummy {
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
>> similarity index 79%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
>> index f22ba49..10923e8 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
>> @@ -14,10 +14,11 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> +package org.apache.logging.log4j.plugins.convert;
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * This is a dummy class and is only here to allow module-info.java to
>> compile. It will not
>> + * be copied into the log4j-api module.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +public class Dummy {
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>> similarity index 79%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>> index f22ba49..b93ef59 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>> @@ -14,10 +14,11 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> +package org.apache.logging.log4j.plugins.processor;
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * This is a dummy class and is only here to allow module-info.java to
>> compile. It will not
>> + * be copied into the log4j-api module.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +public class PluginService {
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
>> similarity index 80%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
>> index f22ba49..5940b03 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
>> @@ -14,10 +14,11 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> +package org.apache.logging.log4j.plugins.util;
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * This is a dummy class and is only here to allow module-info.java to
>> compile. It will not
>> + * be copied into the log4j-api module.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +public class Dummy {
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
>> similarity index 79%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
>> index f22ba49..14882b5 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
>> @@ -14,10 +14,11 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> +package org.apache.logging.log4j.plugins.validation;
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * This is a dummy class and is only here to allow module-info.java to
>> compile. It will not
>> + * be copied into the log4j-api module.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +public class Dummy {
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
>> similarity index 79%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
>> index f22ba49..5596338 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
>> @@ -14,10 +14,11 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> +package org.apache.logging.log4j.plugins.visitors;
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * This is a dummy class and is only here to allow module-info.java to
>> compile. It will not
>> + * be copied into the log4j-api module.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +public class Dummy {
>> +}
>> diff --git a/log4j-plugins/pom.xml b/log4j-plugins/pom.xml
>> new file mode 100644
>> index 0000000..3551d51
>> --- /dev/null
>> +++ b/log4j-plugins/pom.xml
>> @@ -0,0 +1,360 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<!--
>> + ~ 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.
>> + -->
>> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
>> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
>> http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
>> ">
>> + <modelVersion>4.0.0</modelVersion>
>> + <parent>
>> + <groupId>org.apache.logging.log4j</groupId>
>> + <artifactId>log4j</artifactId>
>> + <version>3.0.0-SNAPSHOT</version>
>> + <relativePath>../</relativePath>
>> + </parent>
>> + <artifactId>log4j-plugins</artifactId>
>> + <packaging>jar</packaging>
>> + <name>Apache Log4j Plugins</name>
>> + <description>Log4j Plugin Support</description>
>> + <properties>
>> + <log4jParentDir>${basedir}/..</log4jParentDir>
>> + <docLabel>Plugin Documentation</docLabel>
>> + <projectDir>/plugins</projectDir>
>> + </properties>
>> + <dependencies>
>> + <dependency>
>> + <groupId>org.apache.logging.log4j</groupId>
>> + <artifactId>log4j-api</artifactId>
>> + </dependency>
>> + <!-- Classes and resources to be shaded into the core jar -->
>> + <dependency>
>> + <groupId>org.apache.logging.log4j</groupId>
>> + <artifactId>log4j-plugins-java9</artifactId>
>> + <scope>provided</scope>
>> + <type>zip</type>
>> + </dependency>
>> + <!-- Used for OSGi bundle support -->
>> + <dependency>
>> + <groupId>org.osgi</groupId>
>> + <artifactId>org.osgi.core</artifactId>
>> + <scope>provided</scope>
>> + </dependency>
>> +
>> + <!-- TEST DEPENDENCIES -->
>> +
>> + <!-- Pull in useful test classes from API -->
>> + <dependency>
>> + <groupId>org.apache.logging.log4j</groupId>
>> + <artifactId>log4j-api</artifactId>
>> + <type>test-jar</type>
>> + <scope>test</scope>
>> + </dependency>
>> + <dependency>
>> + <groupId>junit</groupId>
>> + <artifactId>junit</artifactId>
>> + <scope>test</scope>
>> + </dependency>
>> + <dependency>
>> + <groupId>org.hamcrest</groupId>
>> + <artifactId>hamcrest-all</artifactId>
>> + <scope>test</scope>
>> + </dependency>
>> + </dependencies>
>> + <build>
>> + <plugins>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-dependency-plugin</artifactId>
>> + <version>3.0.2</version>
>> + <executions>
>> + <execution>
>> + <id>unpack-classes</id>
>> + <phase>prepare-package</phase>
>> + <goals>
>> + <goal>unpack</goal>
>> + </goals>
>> + <configuration>
>> + <artifactItems>
>> + <artifactItem>
>> + <groupId>org.apache.logging.log4j</groupId>
>> + <artifactId>log4j-plugins-java9</artifactId>
>> + <version>${project.version}</version>
>> + <type>zip</type>
>> + <overWrite>false</overWrite>
>> + </artifactItem>
>> + </artifactItems>
>> + <includes>**/*.class</includes>
>> + <excludes>**/*.java</excludes>
>> +
>> <outputDirectory>${project.build.directory}</outputDirectory>
>> + <overWriteReleases>false</overWriteReleases>
>> + <overWriteSnapshots>true</overWriteSnapshots>
>> + </configuration>
>> + </execution>
>> + </executions>
>> + </plugin>
>> + <plugin>
>> + <artifactId>maven-compiler-plugin</artifactId>
>> + <executions>
>> + <execution>
>> + <!-- disable annotation processing for first pass -->
>> + <id>generate-plugins</id>
>> + <phase>process-classes</phase>
>> + <goals>
>> + <goal>compile</goal>
>> + </goals>
>> + <configuration>
>> + <excludes>
>> + <exclude>module-info.java</exclude>
>> + </excludes>
>> + </configuration>
>> + </execution>
>> + <execution>
>> + <!-- disable annotation processing for first pass -->
>> + <id>generate-test-plugins</id>
>> + <phase>generate-test-sources</phase>
>> + <goals>
>> + <goal>compile</goal>
>> + </goals>
>> + <configuration>
>> + <excludes>
>> + <exclude>module-info.java</exclude>
>> + </excludes>
>> + <proc>only</proc>
>> + </configuration>
>> + </execution>
>> + <execution>
>> + <!-- disable annotation processing for first pass -->
>> + <id>default-compile</id>
>> + <configuration>
>> + <excludes>
>> + <exclude>module-info.java</exclude>
>> + </excludes>
>> + <proc>none</proc>
>> + </configuration>
>> + </execution>
>> + </executions>
>> + </plugin>
>> + <plugin>
>> + <artifactId>maven-surefire-plugin</artifactId>
>> + <configuration>
>> + <excludedGroups>
>> + org.apache.logging.log4j.categories.PerformanceTests
>> + </excludedGroups>
>> + <systemPropertyVariables>
>> +
>> <org.apache.activemq.SERIALIZABLE_PACKAGES>*</org.apache.activemq.SERIALIZABLE_PACKAGES>
>> + </systemPropertyVariables>
>> + </configuration>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-failsafe-plugin</artifactId>
>> + <configuration>
>> + <skipTests>true</skipTests>
>> + </configuration>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-jar-plugin</artifactId>
>> + <executions>
>> + <execution>
>> + <id>default-jar</id>
>> + <goals>
>> + <goal>jar</goal>
>> + </goals>
>> + <configuration combine.self="override">
>> + <archive>
>> + <manifestFile>${manifestfile}</manifestFile>
>> + <manifestEntries>
>> + <Specification-Title>${project.name
>> }</Specification-Title>
>> +
>> <Specification-Version>${project.version}</Specification-Version>
>> + <Specification-Vendor>${project.organization.name
>> }</Specification-Vendor>
>> + <Implementation-Title>${project.name
>> }</Implementation-Title>
>> +
>> <Implementation-Version>${project.version}</Implementation-Version>
>> + <Implementation-Vendor>${project.organization.name
>> }</Implementation-Vendor>
>> +
>> <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
>> +
>> <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
>> +
>> <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
>> +
>> <Automatic-Module-Name>org.apache.logging.log4j.plugins</Automatic-Module-Name>
>> + <Multi-Release>true</Multi-Release>
>> + </manifestEntries>
>> + </archive>
>> + </configuration>
>> + </execution>
>> + <execution>
>> + <id>default</id>
>> + <goals>
>> + <goal>test-jar</goal>
>> + </goals>
>> + <configuration>
>> + <archive>
>> + <manifestFile>${manifestfile}</manifestFile>
>> + <manifestEntries>
>> + <Specification-Title>${project.name
>> }</Specification-Title>
>> +
>> <Specification-Version>${project.version}</Specification-Version>
>> + <Specification-Vendor>${project.organization.name
>> }</Specification-Vendor>
>> + <Implementation-Title>${project.name
>> }</Implementation-Title>
>> +
>> <Implementation-Version>${project.version}</Implementation-Version>
>> + <Implementation-Vendor>${project.organization.name
>> }</Implementation-Vendor>
>> +
>> <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
>> +
>> <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
>> +
>> <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
>> + </manifestEntries>
>> + </archive>
>> + </configuration>
>> + </execution>
>> + </executions>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.felix</groupId>
>> + <artifactId>maven-bundle-plugin</artifactId>
>> + <configuration>
>> + <instructions>
>> +
>> <Bundle-SymbolicName>org.apache.logging.log4j.plugins</Bundle-SymbolicName>
>> + <!-- TODO: exclude internal classes from export -->
>> +
>> <Export-Package>org.apache.logging.log4j.plugins.*</Export-Package>
>> + <Import-Package>
>> + sun.reflect;resolution:=optional,
>> + org.apache.logging.log4j.util,
>> + *
>> + </Import-Package>
>> +
>> <Bundle-Activator>org.apache.logging.log4j.plugins.osgi.Activator</Bundle-Activator>
>> + </instructions>
>> + </configuration>
>> + </plugin>
>> + </plugins>
>> + </build>
>> + <reporting>
>> + <plugins>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-changes-plugin</artifactId>
>> + <version>${changes.plugin.version}</version>
>> + <reportSets>
>> + <reportSet>
>> + <reports>
>> + <report>changes-report</report>
>> + </reports>
>> + </reportSet>
>> + </reportSets>
>> + <configuration>
>> +
>> <issueLinkTemplate>%URL%/show_bug.cgi?id=%ISSUE%</issueLinkTemplate>
>> + <useJql>true</useJql>
>> + </configuration>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-checkstyle-plugin</artifactId>
>> + <version>${checkstyle.plugin.version}</version>
>> + <configuration>
>> +
>> <!--<propertiesLocation>${vfs.parent.dir}/checkstyle.properties</propertiesLocation>
>> -->
>> +
>> <configLocation>${log4jParentDir}/checkstyle.xml</configLocation>
>> +
>> <suppressionsLocation>${log4jParentDir}/checkstyle-suppressions.xml</suppressionsLocation>
>> + <enableRulesSummary>false</enableRulesSummary>
>> + <propertyExpansion>basedir=${basedir}</propertyExpansion>
>> +
>> <propertyExpansion>licensedir=${log4jParentDir}/checkstyle-header.txt</propertyExpansion>
>> + </configuration>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-javadoc-plugin</artifactId>
>> + <version>${javadoc.plugin.version}</version>
>> + <configuration>
>> + <failOnError>false</failOnError>
>> + <bottom><![CDATA[<p align="center">Copyright ©
>> {inceptionYear}-{currentYear} {organizationName}. All Rights Reserved.<br />
>> + Apache Logging, Apache Log4j, Log4j, Apache, the Apache
>> feather logo, the Apache Logging project logo,
>> + and the Apache Log4j logo are trademarks of The Apache
>> Software Foundation.</p>]]></bottom>
>> + <!-- module link generation is completely broken in the javadoc
>> plugin for a multi-module non-aggregating
>> + project -->
>> + <additionalparam>${javadoc.opts}</additionalparam>
>> + <detectOfflineLinks>false</detectOfflineLinks>
>> + <linksource>true</linksource>
>> + <links>
>> + <link>http://docs.oracle.com/javaee/6/api/</link>
>> + <link>http://www.osgi.org/javadoc/r4v43/core/</link>
>> + <link>
>> https://commons.apache.org/proper/commons-lang/javadocs/api-release/
>> </link>
>> + </links>
>> + <groups>
>> + <group>
>> + <title>Core API</title>
>> + <packages>org.apache.logging.log4j.core</packages>
>> + </group>
>> + <group>
>> + <title>Configuration</title>
>> +
>> <packages>org.apache.logging.log4j.core.config*:org.apache.logging.log4j.core.selector</packages>
>> + </group>
>> + <group>
>> + <title>Core Plugins</title>
>> +
>> <packages>org.apache.logging.log4j.core.appender*:org.apache.logging.log4j.core.filter:org.apache.logging.log4j.core.layout:org.apache.logging.log4j.core.lookup:org.apache.logging.log4j.core.pattern:org.apache.logging.log4j.core.script</packages>
>> + </group>
>> + <group>
>> + <title>Tools</title>
>> + <packages>org.apache.logging.log4j.core.net
>> *:org.apache.logging.log4j.core.tools</packages>
>> + </group>
>> + <group>
>> + <title>Internals</title>
>> +
>> <packages>org.apache.logging.log4j.core.async:org.apache.logging.log4j.core.impl:org.apache.logging.log4j.core.util*:org.apache.logging.log4j.core.osgi:org.apache.logging.log4j.core.jackson:org.apache.logging.log4j.core.jmx</packages>
>> + </group>
>> + </groups>
>> + </configuration>
>> + <reportSets>
>> + <reportSet>
>> + <id>non-aggregate</id>
>> + <reports>
>> + <report>javadoc</report>
>> + </reports>
>> + </reportSet>
>> + </reportSets>
>> + </plugin>
>> + <plugin>
>> + <groupId>com.github.spotbugs</groupId>
>> + <artifactId>spotbugs-maven-plugin</artifactId>
>> + <configuration>
>> + <fork>true</fork>
>> + <jvmArgs>-Duser.language=en</jvmArgs>
>> + <threshold>Normal</threshold>
>> + <effort>Default</effort>
>> +
>> <excludeFilterFile>${log4jParentDir}/spotbugs-exclude-filter.xml</excludeFilterFile>
>> + </configuration>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-jxr-plugin</artifactId>
>> + <version>${jxr.plugin.version}</version>
>> + <reportSets>
>> + <reportSet>
>> + <id>non-aggregate</id>
>> + <reports>
>> + <report>jxr</report>
>> + </reports>
>> + </reportSet>
>> + <reportSet>
>> + <id>aggregate</id>
>> + <reports>
>> + <report>aggregate</report>
>> + </reports>
>> + </reportSet>
>> + </reportSets>
>> + </plugin>
>> + <plugin>
>> + <groupId>org.apache.maven.plugins</groupId>
>> + <artifactId>maven-pmd-plugin</artifactId>
>> + <version>${pmd.plugin.version}</version>
>> + <configuration>
>> + <targetJdk>${maven.compiler.target}</targetJdk>
>> + </configuration>
>> + </plugin>
>> + </plugins>
>> + </reporting>
>> +</project>
>> +
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
>> similarity index 97%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
>> index c92c904..22fd9bf 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
>> @@ -14,15 +14,15 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config;
>> +package org.apache.logging.log4j.plugins;
>> +
>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>
>> import java.util.ArrayList;
>> import java.util.HashMap;
>> import java.util.List;
>> import java.util.Map;
>>
>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>> -
>> /**
>> * A Configuration node.
>> */
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
>> similarity index 97%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
>> index 8aaf117..348754f 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
>> @@ -14,7 +14,9 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>> +
>> +import org.apache.logging.log4j.util.Strings;
>>
>> import java.lang.annotation.Documented;
>> import java.lang.annotation.ElementType;
>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>> import java.lang.annotation.RetentionPolicy;
>> import java.lang.annotation.Target;
>>
>> -import org.apache.logging.log4j.util.Strings;
>> -
>> /**
>> * Annotation that identifies a Class as a Plugin.
>> */
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
>> similarity index 87%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
>> index 7be3dea..4dce103 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
>> @@ -14,7 +14,7 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>>
>> import java.lang.annotation.Documented;
>> import java.lang.annotation.ElementType;
>> @@ -23,7 +23,7 @@ import java.lang.annotation.RetentionPolicy;
>> import java.lang.annotation.Target;
>>
>> /**
>> - * Identifies a list of aliases for a {@link Plugin}, {@link
>> PluginAttribute}, or {@link PluginBuilderAttribute}.
>> + * Identifies a list of aliases for a Plugin, PluginAttribute, or
>> PluginBuilderAttribute.
>> */
>> @Documented
>> @Retention(RetentionPolicy.RUNTIME)
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
>> similarity index 96%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
>> index bd88220..b9d4684 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
>> @@ -14,7 +14,10 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>> +
>> +import org.apache.logging.log4j.plugins.visitors.PluginAttributeVisitor;
>> +import org.apache.logging.log4j.util.Strings;
>>
>> import java.lang.annotation.Documented;
>> import java.lang.annotation.ElementType;
>> @@ -22,9 +25,6 @@ import java.lang.annotation.Retention;
>> import java.lang.annotation.RetentionPolicy;
>> import java.lang.annotation.Target;
>>
>> -import
>> org.apache.logging.log4j.core.config.plugins.visitors.PluginAttributeVisitor;
>> -import org.apache.logging.log4j.util.Strings;
>> -
>> /**
>> * Identifies a Plugin Attribute and its default value. Note that only
>> one of the defaultFoo attributes will be
>> * used based on the type this annotation is attached to. Thus, for
>> primitive types, the default<i>Type</i>
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
>> similarity index 92%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
>> index 675d78f..c7fce2f 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
>> @@ -15,7 +15,10 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>> +
>> +import
>> org.apache.logging.log4j.plugins.visitors.PluginBuilderAttributeVisitor;
>> +import org.apache.logging.log4j.util.Strings;
>>
>> import java.lang.annotation.Documented;
>> import java.lang.annotation.ElementType;
>> @@ -23,9 +26,6 @@ import java.lang.annotation.Retention;
>> import java.lang.annotation.RetentionPolicy;
>> import java.lang.annotation.Target;
>>
>> -import
>> org.apache.logging.log4j.core.config.plugins.visitors.PluginBuilderAttributeVisitor;
>> -import org.apache.logging.log4j.util.Strings;
>> -
>> /**
>> * Marks a field as a Plugin Attribute.
>> */
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
>> similarity index 95%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
>> index 4e69262..035b025 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
>> @@ -15,7 +15,7 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>>
>> import java.lang.annotation.Documented;
>> import java.lang.annotation.ElementType;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
>> similarity index 91%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
>> index 7ea358b..6cfb6fa 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
>> @@ -14,7 +14,9 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>> +
>> +import org.apache.logging.log4j.plugins.visitors.PluginElementVisitor;
>>
>> import java.lang.annotation.Documented;
>> import java.lang.annotation.ElementType;
>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>> import java.lang.annotation.RetentionPolicy;
>> import java.lang.annotation.Target;
>>
>> -import
>> org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor;
>> -
>> /**
>> * Identifies a parameter as a Plugin and corresponds with an XML element
>> (or equivalent) in configuration files.
>> */
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
>> similarity index 96%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
>> index 1c04106..b071510 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
>> @@ -14,7 +14,7 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>>
>> import java.lang.annotation.Documented;
>> import java.lang.annotation.ElementType;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
>> similarity index 90%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
>> index d60f1b5..b172268 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
>> @@ -14,7 +14,9 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>> +
>> +import org.apache.logging.log4j.plugins.visitors.PluginNodeVisitor;
>>
>> import java.lang.annotation.Documented;
>> import java.lang.annotation.ElementType;
>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>> import java.lang.annotation.RetentionPolicy;
>> import java.lang.annotation.Target;
>>
>> -import
>> org.apache.logging.log4j.core.config.plugins.visitors.PluginNodeVisitor;
>> -
>> /**
>> * Identifies a Plugin configuration Node.
>> */
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
>> similarity index 91%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
>> index 9c20cc2..31e5a23 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
>> @@ -14,7 +14,9 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>> +
>> +import org.apache.logging.log4j.plugins.visitors.PluginValueVisitor;
>>
>> import java.lang.annotation.Documented;
>> import java.lang.annotation.ElementType;
>> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
>> import java.lang.annotation.RetentionPolicy;
>> import java.lang.annotation.Target;
>>
>> -import
>> org.apache.logging.log4j.core.config.plugins.visitors.PluginValueVisitor;
>> -
>> /**
>> * Identifies a parameter as a value. These correspond with property
>> values generally, but are meant as values to be
>> * used as a placeholder value somewhere.
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
>> similarity index 89%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
>> index 65fcb76..093cc50 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
>> @@ -15,7 +15,9 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins;
>> +package org.apache.logging.log4j.plugins;
>> +
>> +import org.apache.logging.log4j.plugins.visitors.PluginVisitor;
>>
>> import java.lang.annotation.Annotation;
>> import java.lang.annotation.Documented;
>> @@ -24,8 +26,6 @@ import java.lang.annotation.Retention;
>> import java.lang.annotation.RetentionPolicy;
>> import java.lang.annotation.Target;
>>
>> -import
>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor;
>> -
>> /**
>> * Meta-annotation to denote the class name to use that implements
>> * {@link
>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor} for
>> the annotated annotation.
>> @@ -40,5 +40,5 @@ public @interface PluginVisitorStrategy {
>> * for the given annotation. The generic type in {@code
>> PluginVisitor} should match the annotation this annotation
>> * is applied to.
>> */
>> - Class<? extends PluginVisitor<? extends Annotation>> value();
>> + Class<? extends PluginVisitor<? extends Annotation, ?>> value();
>> }
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
>> similarity index 95%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>> copy to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
>> index 15a162c..fd8012a 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
>> @@ -14,7 +14,7 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.convert;
>> +package org.apache.logging.log4j.plugins.convert;
>>
>> import org.apache.logging.log4j.util.EnglishEnums;
>>
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
>> similarity index 95%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
>> index e629657..f9037b3 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
>> @@ -14,7 +14,7 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.convert;
>> +package org.apache.logging.log4j.plugins.convert;
>>
>> /**
>> * Converts Strings to hex. This is used in place of
>> java.xml.bind.DataTypeConverter which is not available by
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
>> similarity index 95%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
>> index e67e213..aaa5b4d 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
>> @@ -15,7 +15,7 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.convert;
>> +package org.apache.logging.log4j.plugins.convert;
>>
>> /**
>> * Interface for doing automatic String conversion to a specific type.
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
>> similarity index 92%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
>> index 5088f15..fb5b27e 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
>> @@ -14,7 +14,14 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.convert;
>> +package org.apache.logging.log4j.plugins.convert;
>> +
>> +import org.apache.logging.log4j.Logger;
>> +import org.apache.logging.log4j.plugins.util.PluginManager;
>> +import org.apache.logging.log4j.plugins.util.PluginType;
>> +import org.apache.logging.log4j.plugins.util.TypeUtil;
>> +import org.apache.logging.log4j.util.ReflectionUtil;
>> +import org.apache.logging.log4j.status.StatusLogger;
>>
>> import java.lang.reflect.ParameterizedType;
>> import java.lang.reflect.Type;
>> @@ -25,13 +32,6 @@ import java.util.UnknownFormatConversionException;
>> import java.util.concurrent.ConcurrentHashMap;
>> import java.util.concurrent.ConcurrentMap;
>>
>> -import org.apache.logging.log4j.Logger;
>> -import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>> -import org.apache.logging.log4j.core.util.ReflectionUtil;
>> -import org.apache.logging.log4j.core.util.TypeUtil;
>> -import org.apache.logging.log4j.status.StatusLogger;
>> -
>> /**
>> * Registry for {@link TypeConverter} plugins.
>> *
>> @@ -152,7 +152,12 @@ public class TypeConverterRegistry {
>> }
>>
>> private void registerTypeAlias(final Type knownType, final Type
>> aliasType) {
>> - registry.putIfAbsent(aliasType, registry.get(knownType));
>> + TypeConverter<?> converter = registry.get(knownType);
>> + if (converter != null) {
>> + registry.putIfAbsent(aliasType, converter);
>> + } else {
>> + LOGGER.error("Cannot locate converter for {}", knownType);
>> + }
>> }
>>
>> }
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
>> similarity index 92%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
>> index dc833f0..7a71b4a 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
>> @@ -15,32 +15,27 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.convert;
>> +package org.apache.logging.log4j.plugins.convert;
>> +
>> +import org.apache.logging.log4j.Level;
>> +import org.apache.logging.log4j.Logger;
>> +import org.apache.logging.log4j.plugins.Plugin;
>> +import org.apache.logging.log4j.status.StatusLogger;
>> +import org.apache.logging.log4j.util.LoaderUtil;
>>
>> import java.io.File;
>> import java.math.BigDecimal;
>> import java.math.BigInteger;
>> -import java.net.InetAddress;
>> -import java.net.MalformedURLException;
>> -import java.net.URI;
>> -import java.net.URISyntaxException;
>> -import java.net.URL;
>> +import java.net.*;
>> import java.nio.charset.Charset;
>> import java.nio.file.Path;
>> import java.nio.file.Paths;
>> import java.security.Provider;
>> import java.security.Security;
>> +import java.util.Base64;
>> import java.util.UUID;
>> import java.util.regex.Pattern;
>>
>> -import org.apache.logging.log4j.Level;
>> -import org.apache.logging.log4j.Logger;
>> -import org.apache.logging.log4j.core.appender.rolling.action.Duration;
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> -import org.apache.logging.log4j.core.util.CronExpression;
>> -import org.apache.logging.log4j.status.StatusLogger;
>> -import org.apache.logging.log4j.util.LoaderUtil;
>> -
>> /**
>> * Collection of basic TypeConverter implementations. May be used to
>> register additional TypeConverters or find
>> * registered TypeConverters.
>> @@ -56,6 +51,8 @@ public final class TypeConverters {
>> */
>> public static final String CATEGORY = "TypeConverter";
>>
>> + private static final Base64.Decoder decoder = Base64.getDecoder();
>> +
>> /**
>> * Parses a {@link String} into a {@link BigDecimal}.
>> */
>> @@ -112,7 +109,7 @@ public final class TypeConverters {
>> bytes = new byte[0];
>> } else if (value.startsWith(PREFIX_BASE64)) {
>> final String lexicalXSDBase64Binary =
>> value.substring(PREFIX_BASE64.length());
>> - bytes =
>> Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
>> + bytes = decoder.decode(lexicalXSDBase64Binary);
>> } else if (value.startsWith(PREFIX_0x)) {
>> final String lexicalXSDHexBinary =
>> value.substring(PREFIX_0x.length());
>> bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
>> @@ -203,14 +200,6 @@ public final class TypeConverters {
>> }
>> }
>>
>> - @Plugin(name = "CronExpression", category = CATEGORY)
>> - public static class CronExpressionConverter implements
>> TypeConverter<CronExpression> {
>> - @Override
>> - public CronExpression convert(final String s) throws Exception {
>> - return new CronExpression(s);
>> - }
>> - }
>> -
>> /**
>> * Converts a {@link String} into a {@link Double}.
>> */
>> @@ -223,18 +212,6 @@ public final class TypeConverters {
>> }
>>
>> /**
>> - * Converts a {@link String} into a {@link Duration}.
>> - * @since 2.5
>> - */
>> - @Plugin(name = "Duration", category = CATEGORY)
>> - public static class DurationConverter implements
>> TypeConverter<Duration> {
>> - @Override
>> - public Duration convert(final String s) {
>> - return Duration.parse(s);
>> - }
>> - }
>> -
>> - /**
>> * Converts a {@link String} into a {@link File}.
>> */
>> @Plugin(name = "File", category = CATEGORY)
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
>> similarity index 80%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
>> index f22ba49..958beb4 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
>> @@ -16,8 +16,7 @@
>> */
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * TypeConverter plugins for converter strings into various types. These
>> plugins are used for parsing plugin
>> + * attributes in plugin factory methods.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +package org.apache.logging.log4j.plugins.convert;
>> diff --git
>> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
>> new file mode 100644
>> index 0000000..518bee7
>> --- /dev/null
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
>> @@ -0,0 +1,103 @@
>> +/*
>> + * 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.plugins.osgi;
>> +
>> +import org.apache.logging.log4j.LogManager;
>> +import org.apache.logging.log4j.Logger;
>> +import org.apache.logging.log4j.plugins.processor.PluginService;
>> +import org.apache.logging.log4j.plugins.util.PluginRegistry;
>> +import org.apache.logging.log4j.spi.Provider;
>> +import org.apache.logging.log4j.status.StatusLogger;
>> +import org.apache.logging.log4j.util.PropertiesUtil;
>> +import org.osgi.framework.*;
>> +import org.osgi.framework.wiring.BundleWiring;
>> +
>> +import java.util.Hashtable;
>> +import java.util.concurrent.atomic.AtomicReference;
>> +
>> +/**
>> + * OSGi BundleActivator.
>> + */
>> +public final class Activator implements BundleActivator,
>> SynchronousBundleListener {
>> +
>> + private static final Logger LOGGER = StatusLogger.getLogger();
>> +
>> + private final AtomicReference<BundleContext> contextRef = new
>> AtomicReference<>();
>> +
>> + ServiceRegistration provideRegistration = null;
>> +
>> + @Override
>> + public void start(final BundleContext context) throws Exception {
>> + final PluginService pluginService = new Log4jProvider();
>> + final Hashtable<String, String> props = new Hashtable<>();
>> + props.put("APIVersion", "3.0");
>> + provideRegistration =
>> context.registerService(pluginService.class.getName(), provider, props);
>> + if (this.contextRef.compareAndSet(null, context)) {
>> + context.addBundleListener(this);
>> + // done after the BundleListener as to not miss any new
>> bundle installs in the interim
>> + scanInstalledBundlesForPlugins(context);
>> + }
>> + }
>> +
>> + private static void scanInstalledBundlesForPlugins(final
>> BundleContext context) {
>> + final Bundle[] bundles = context.getBundles();
>> + for (final Bundle bundle : bundles) {
>> + // TODO: bundle state can change during this
>> + scanBundleForPlugins(bundle);
>> + }
>> + }
>> +
>> + private static void scanBundleForPlugins(final Bundle bundle) {
>> + final long bundleId = bundle.getBundleId();
>> + // LOG4J2-920: don't scan system bundle for plugins
>> + if (bundle.getState() == Bundle.ACTIVE && bundleId != 0) {
>> + LOGGER.trace("Scanning bundle [{}, id=%d] for plugins.",
>> bundle.getSymbolicName(), bundleId);
>> + PluginRegistry.getInstance().loadFromBundle(bundleId,
>> + bundle.adapt(BundleWiring.class).getClassLoader());
>> + }
>> + }
>> +
>> + private static void stopBundlePlugins(final Bundle bundle) {
>> + LOGGER.trace("Stopping bundle [{}] plugins.",
>> bundle.getSymbolicName());
>> + // TODO: plugin lifecycle code
>> +
>> PluginRegistry.getInstance().clearBundlePlugins(bundle.getBundleId());
>> + }
>> +
>> + @Override
>> + public void stop(final BundleContext context) throws Exception {
>> + provideRegistration.unregister();
>> + this.contextRef.compareAndSet(context, null);
>> + }
>> +
>> + @Override
>> + public void bundleChanged(final BundleEvent event) {
>> + switch (event.getType()) {
>> + // FIXME: STARTING instead of STARTED?
>> + case BundleEvent.STARTED:
>> + scanBundleForPlugins(event.getBundle());
>> + break;
>> +
>> + case BundleEvent.STOPPING:
>> + stopBundlePlugins(event.getBundle());
>> + break;
>> +
>> + default:
>> + break;
>> + }
>> + }
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
>> similarity index 87%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
>> index f22ba49..37dadd4 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
>> @@ -16,8 +16,6 @@
>> */
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * Collection of OSGi-specific classes for bundles.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +package org.apache.logging.log4j.plugins.osgi;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
>> similarity index 87%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
>> index f22ba49..b161185 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
>> @@ -16,8 +16,6 @@
>> */
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * Annotations for Log4j 2 plugins.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +package org.apache.logging.log4j.plugins;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
>> similarity index 71%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
>> index 2fd4160..784dece 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
>> @@ -15,7 +15,7 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.processor;
>> +package org.apache.logging.log4j.plugins.processor;
>>
>> import java.io.BufferedInputStream;
>> import java.io.BufferedOutputStream;
>> @@ -60,34 +60,6 @@ public class PluginCache {
>> }
>>
>> /**
>> - * 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) 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());
>> - }
>> - }
>> - }
>> - }
>> -
>> - /**
>> * Loads and merges all the Log4j plugin cache files specified.
>> Usually, this is obtained via a ClassLoader.
>> *
>> * @param resources URLs to all the desired plugin cache files to
>> load.
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
>> similarity index 85%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
>> index dd43601..bd452d3 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
>> @@ -15,7 +15,7 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.processor;
>> +package org.apache.logging.log4j.plugins.processor;
>>
>> import java.io.Serializable;
>>
>> @@ -32,6 +32,18 @@ public class PluginEntry implements Serializable {
>> private boolean defer;
>> private transient String category;
>>
>> + public PluginEntry() {
>> + }
>> +
>> + public PluginEntry(String key, String className, String name, boolean
>> printable, boolean defer, String category) {
>> + this.key = key;
>> + this.className = className;
>> + this.name = name;
>> + this.printable = printable;
>> + this.defer = defer;
>> + this.category = category;
>> + }
>> +
>> public String getKey() {
>> return key;
>> }
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
>> similarity index 54%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
>> index 2f3b53f..975d2ab 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
>> @@ -15,38 +15,47 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.processor;
>> +package org.apache.logging.log4j.plugins.processor;
>> +
>> +import org.apache.logging.log4j.LoggingException;
>> +import org.apache.logging.log4j.plugins.Plugin;
>> +import org.apache.logging.log4j.plugins.PluginAliases;
>> +import org.apache.logging.log4j.util.Strings;
>>
>> -import java.io.IOException;
>> -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;
>> import javax.annotation.processing.AbstractProcessor;
>> +import javax.annotation.processing.Messager;
>> import javax.annotation.processing.RoundEnvironment;
>> import javax.annotation.processing.SupportedAnnotationTypes;
>> import javax.lang.model.SourceVersion;
>> import javax.lang.model.element.Element;
>> import javax.lang.model.element.ElementVisitor;
>> +import javax.lang.model.element.Name;
>> import javax.lang.model.element.TypeElement;
>> import javax.lang.model.util.Elements;
>> import javax.lang.model.util.SimpleElementVisitor7;
>> import javax.tools.Diagnostic.Kind;
>> import javax.tools.FileObject;
>> +import javax.tools.JavaFileObject;
>> import javax.tools.StandardLocation;
>> +import java.io.BufferedWriter;
>> +import java.io.IOException;
>> +import java.io.OutputStreamWriter;
>> +import java.io.PrintWriter;
>> +import java.util.ArrayList;
>> +import java.util.Collection;
>> +import java.util.Collections;
>> +import java.util.List;
>> +import java.util.Locale;
>> +import java.util.Map;
>> +import java.util.Objects;
>> +import java.util.Set;
>>
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
>> -import org.apache.logging.log4j.util.Strings;
>> +import static java.nio.charset.StandardCharsets.UTF_8;
>>
>> /**
>> * Annotation processor for pre-scanning Log4j 2 plugins.
>> */
>>
>> -@SupportedAnnotationTypes("org.apache.logging.log4j.core.config.plugins.*")
>> +@SupportedAnnotationTypes({"org.apache.logging.log4j.plugins.*",
>> "org.apache.logging.log4j.core.config.plugins.*"})
>> public class PluginProcessor extends AbstractProcessor {
>>
>> // TODO: this could be made more abstract to allow for compile-time
>> and run-time plugin processing
>> @@ -57,8 +66,8 @@ public class PluginProcessor extends AbstractProcessor {
>> */
>> public static final String PLUGIN_CACHE_FILE =
>>
>> "META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat";
>> -
>> - private final PluginCache pluginCache = new PluginCache();
>> + private static final String SERVICE_FILE_NAME =
>> +
>> "META-INF/services/org.apache.logging.log4j.plugins.processor.PluginService";
>>
>> @Override
>> public SourceVersion getSupportedSourceVersion() {
>> @@ -67,16 +76,21 @@ public class PluginProcessor extends AbstractProcessor
>> {
>>
>> @Override
>> public boolean process(final Set<? extends TypeElement> annotations,
>> final RoundEnvironment roundEnv) {
>> - System.out.println("Processing annotations");
>> + Map<String, String> options = processingEnv.getOptions();
>> + String packageName = options.get("pluginPackage");
>> + Messager messager = processingEnv.getMessager();
>> + messager.printMessage(Kind.NOTE, "Processing Log4j annotations");
>> try {
>> final Set<? extends Element> elements =
>> roundEnv.getElementsAnnotatedWith(Plugin.class);
>> if (elements.isEmpty()) {
>> - System.out.println("No elements to process");
>> + messager.printMessage(Kind.NOTE, "No elements to
>> process");
>> return false;
>> }
>> - collectPlugins(elements);
>> - writeCacheFile(elements.toArray(new
>> Element[elements.size()]));
>> - System.out.println("Annotations processed");
>> + List<PluginEntry> list = new ArrayList<>();
>> + packageName = collectPlugins(packageName, elements, list);
>> + writeClassFile(packageName, list);
>> + writeServiceFile(packageName);
>> + messager.printMessage(Kind.NOTE, "Annotations processed");
>> return true;
>> } catch (final IOException e) {
>> e.printStackTrace();
>> @@ -93,7 +107,8 @@ public class PluginProcessor extends AbstractProcessor {
>> processingEnv.getMessager().printMessage(Kind.ERROR, message);
>> }
>>
>> - private void collectPlugins(final Iterable<? extends Element>
>> elements) {
>> + private String collectPlugins(String packageName, final Iterable<?
>> extends Element> elements, List<PluginEntry> list) {
>> + boolean calculatePackage = packageName == null;
>> final Elements elementUtils = processingEnv.getElementUtils();
>> final ElementVisitor<PluginEntry, Plugin> pluginVisitor = new
>> PluginElementVisitor(elementUtils);
>> final ElementVisitor<Collection<PluginEntry>, Plugin>
>> pluginAliasesVisitor = new PluginAliasesElementVisitor(
>> @@ -104,23 +119,93 @@ public class PluginProcessor extends
>> AbstractProcessor {
>> continue;
>> }
>> final PluginEntry entry = element.accept(pluginVisitor,
>> plugin);
>> - final Map<String, PluginEntry> category =
>> pluginCache.getCategory(entry.getCategory());
>> - category.put(entry.getKey(), entry);
>> + list.add(entry);
>> + if (calculatePackage) {
>> + packageName = calculatePackage(elementUtils, element,
>> packageName);
>> + }
>> final Collection<PluginEntry> entries =
>> element.accept(pluginAliasesVisitor, plugin);
>> for (final PluginEntry pluginEntry : entries) {
>> - category.put(pluginEntry.getKey(), pluginEntry);
>> + list.add(pluginEntry);
>> }
>> }
>> + return packageName;
>> }
>>
>> - private void writeCacheFile(final Element... elements) throws
>> IOException {
>> + private String calculatePackage(Elements elements, Element element,
>> String packageName) {
>> + Name name = elements.getPackageOf(element).getQualifiedName();
>> + if (name == null) {
>> + return null;
>> + }
>> + String pkgName = name.toString();
>> + if (packageName == null) {
>> + return pkgName;
>> + }
>> + if (pkgName.length() == packageName.length()) {
>> + return packageName;
>> + }
>> + if (pkgName.length() < packageName.length() &&
>> packageName.startsWith(pkgName)) {
>> + return pkgName;
>> + }
>> +
>> + return commonPrefix(pkgName, packageName);
>> + }
>> +
>> + private void writeServiceFile(String pkgName) 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);
>> + SERVICE_FILE_NAME);
>> + try (final PrintWriter writer = new PrintWriter(new
>> BufferedWriter(new OutputStreamWriter(fileObject.openOutputStream(),
>> UTF_8)))) {
>> + writer.println(createFqcn(pkgName));
>> + }
>> + }
>> +
>> + private void writeClassFile(String pkg, List<PluginEntry> list) {
>> + String fqcn = createFqcn(pkg);
>> + try (final PrintWriter writer = createSourceFile(fqcn)) {
>> + writer.println("package " + pkg + ".plugins;");
>> + writer.println("");
>> + writer.println("import
>> org.apache.logging.log4j.plugins.processor.PluginEntry;");
>> + writer.println("import
>> org.apache.logging.log4j.plugins.processor.PluginService;");
>> + writer.println("");
>> + writer.println("public class Log4jPlugins extends
>> PluginService {");
>> + writer.println("");
>> + writer.println(" private static PluginEntry[] entries =
>> new PluginEntry[] {");
>> + StringBuilder sb = new StringBuilder();
>> + int max = list.size() - 1;
>> + for (int i = 0; i < list.size(); ++i) {
>> + PluginEntry entry = list.get(i);
>> + sb.append(" ").append("new PluginEntry(\"");
>> + sb.append(entry.getKey()).append("\", \"");
>> + sb.append(entry.getClassName()).append("\", \"");
>> + sb.append(entry.getName()).append("\", ");
>> + sb.append(entry.isPrintable()).append(", ");
>> + sb.append(entry.isDefer()).append(", \"");
>> + sb.append(entry.getCategory()).append("\")");
>> + if (i < max) {
>> + sb.append(",");
>> + }
>> + writer.println(sb.toString());
>> + sb.setLength(0);
>> + }
>> + writer.println(" };");
>> + writer.println(" @Override");
>> + writer.println(" public PluginEntry[] getEntries() {
>> return entries;}");
>> + writer.println("}");
>> }
>> }
>>
>> + private PrintWriter createSourceFile(String fqcn) {
>> + try {
>> + JavaFileObject sourceFile =
>> processingEnv.getFiler().createSourceFile(fqcn);
>> + return new PrintWriter(sourceFile.openWriter());
>> + } catch (IOException e) {
>> + throw new LoggingException("Unable to create Plugin Service
>> Class " + fqcn, e);
>> + }
>> + }
>> +
>> + private String createFqcn(String packageName) {
>> + return packageName + ".plugins.Log4jPlugins";
>> + }
>> +
>> /**
>> * ElementVisitor to scan the Plugin annotation.
>> */
>> @@ -146,6 +231,20 @@ public class PluginProcessor extends
>> AbstractProcessor {
>> }
>> }
>>
>> + private String commonPrefix(String str1, String str2) {
>> + int minLength = str1.length() < str2.length() ? str1.length() :
>> str2.length();
>> + for (int i = 0; i < minLength; i++) {
>> + if (str1.charAt(i) != str2.charAt(i)) {
>> + if (i > 1 && str1.charAt(i-1) == '.') {
>> + return str1.substring(0, i-1);
>> + } else {
>> + return str1.substring(0, i);
>> + }
>> + }
>> + }
>> + return str1.substring(0, minLength);
>> + }
>> +
>> /**
>> * ElementVisitor to scan the PluginAliases annotation.
>> */
>> diff --git
>> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>> new file mode 100644
>> index 0000000..5042456
>> --- /dev/null
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
>> @@ -0,0 +1,56 @@
>> +/*
>> + * 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.plugins.processor;
>> +
>> +import java.util.Collections;
>> +import java.util.LinkedHashMap;
>> +import java.util.Map;
>> +
>> +/**
>> + * Class Description goes here.
>> + */
>> +public abstract class PluginService {
>> +
>> + private final Map<String, Map<String, PluginEntry>> categories = new
>> LinkedHashMap<>();
>> +
>> + public PluginService() {
>> + PluginEntry[] entries = getEntries();
>> + for (PluginEntry entry : entries) {
>> + String category = entry.getCategory().toLowerCase();
>> + if (!categories.containsKey(category)) {
>> + categories.put(category, new LinkedHashMap<>());
>> + }
>> + Map<String, PluginEntry> map = categories.get(category);
>> + map.put(entry.getKey(), entry);
>> + }
>> + }
>> +
>> + public abstract PluginEntry[] getEntries();
>> +
>> + public Map<String, Map<String, PluginEntry>> getCategories() {
>> + return Collections.unmodifiableMap(categories);
>> + }
>> +
>> + public Map<String, PluginEntry> getCategory(String category) {
>> + return
>> Collections.unmodifiableMap(categories.get(category.toLowerCase()));
>> + }
>> +
>> + public long size() {
>> + return categories.size();
>> + }
>> +
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
>> similarity index 94%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>> copy to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
>> index 4f6ddda..2c296f9 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
>> @@ -19,4 +19,4 @@
>> * Java annotation processor for pre-scanning Log4j 2 plugins. This is
>> provided as an alternative to using the
>> * executable {@link
>> org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in
>> your build process.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.processor;
>> +package org.apache.logging.log4j.plugins.processor;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
>> similarity index 93%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
>> index 0935ce8..ec8a07f 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
>> @@ -15,7 +15,7 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.util;
>> +package org.apache.logging.log4j.plugins.util;
>>
>> /**
>> * A type of builder that can be used to configure and create a instances
>> using a Java DSL instead of
>> @@ -25,7 +25,7 @@ package org.apache.logging.log4j.core.util;
>> * <p>
>> * When creating <em>plugin</em> builders, it is customary to create
>> the builder class as a public static inner class
>> * called {@code Builder}. For instance, the builder class for
>> - * {@link org.apache.logging.log4j.core.layout.PatternLayout
>> PatternLayout} would be
>> + * org.apache.logging.log4j.core.layout.PatternLayout PatternLayout
>> would be
>> * {@code PatternLayout.Builder}.
>> * </p>
>> *
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
>> similarity index 96%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
>> index 6f38d0e..b6f02f5 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
>> @@ -15,17 +15,13 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.util;
>> +package org.apache.logging.log4j.plugins.util;
>>
>> import org.apache.logging.log4j.Logger;
>> import org.apache.logging.log4j.status.StatusLogger;
>> import org.apache.logging.log4j.util.Strings;
>>
>> -import java.util.Collection;
>> -import java.util.HashMap;
>> -import java.util.LinkedHashMap;
>> -import java.util.List;
>> -import java.util.Map;
>> +import java.util.*;
>> import java.util.concurrent.CopyOnWriteArrayList;
>>
>> /**
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
>> similarity index 81%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
>> index 99fa610..9e8c6e2 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
>> @@ -15,32 +15,28 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.util;
>> +package org.apache.logging.log4j.plugins.util;
>> +
>> +import org.apache.logging.log4j.Logger;
>> +import org.apache.logging.log4j.plugins.Plugin;
>> +import org.apache.logging.log4j.plugins.PluginAliases;
>> +import org.apache.logging.log4j.plugins.processor.PluginCache;
>> +import org.apache.logging.log4j.plugins.processor.PluginEntry;
>> +import org.apache.logging.log4j.plugins.processor.PluginProcessor;
>> +import org.apache.logging.log4j.plugins.processor.PluginService;
>> +import org.apache.logging.log4j.status.StatusLogger;
>> +import org.apache.logging.log4j.util.LoaderUtil;
>> +import org.apache.logging.log4j.util.Strings;
>>
>> import java.io.IOException;
>> import java.net.URI;
>> import java.net.URL;
>> import java.text.DecimalFormat;
>> -import java.util.ArrayList;
>> -import java.util.Collections;
>> -import java.util.Enumeration;
>> -import java.util.HashMap;
>> -import java.util.List;
>> -import java.util.Map;
>> +import java.util.*;
>> import java.util.concurrent.ConcurrentHashMap;
>> import java.util.concurrent.ConcurrentMap;
>> import java.util.concurrent.atomic.AtomicReference;
>>
>> -import org.apache.logging.log4j.Logger;
>> -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;
>> -import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
>> -import
>> org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor;
>> -import org.apache.logging.log4j.core.util.Loader;
>> -import org.apache.logging.log4j.status.StatusLogger;
>> -import org.apache.logging.log4j.util.Strings;
>> -
>> /**
>> * Registry singleton for PluginType maps partitioned by source type and
>> then by category names.
>> */
>> @@ -116,7 +112,8 @@ public class PluginRegistry {
>> // already loaded
>> return existing;
>> }
>> - final Map<String, List<PluginType<?>>> newPluginsByCategory =
>> decodeCacheFiles(Loader.getClassLoader());
>> + final Map<String, List<PluginType<?>>> newPluginsByCategory =
>> decodeCacheFiles(LoaderUtil.getClassLoader());
>> + loadPlugins(newPluginsByCategory);
>>
>> // Note multiple threads could be calling this method
>> concurrently. Both will do the work,
>> // but only one will be allowed to store the result in the
>> AtomicReference.
>> @@ -144,6 +141,7 @@ public class PluginRegistry {
>> return existing;
>> }
>> final Map<String, List<PluginType<?>>> newPluginsByCategory =
>> decodeCacheFiles(loader);
>> + loadPlugins(loader, newPluginsByCategory);
>>
>> // Note multiple threads could be calling this method
>> concurrently. Both will do the work,
>> // but only one will be allowed to store the result in the outer
>> map.
>> @@ -155,6 +153,51 @@ public class PluginRegistry {
>> return newPluginsByCategory;
>> }
>>
>> + /**
>> + * @since 3.0
>> + */
>> + public void loadPlugins(Map<String, List<PluginType<?>>> map) {
>> + for (ClassLoader classLoader : LoaderUtil.getClassLoaders()) {
>> + try {
>> + loadPlugins(classLoader, map);
>> + } catch (Throwable ex) {
>> + LOGGER.debug("Unable to retrieve provider from
>> ClassLoader {}", classLoader, ex);
>> + }
>> + }
>> + }
>> +
>> + /**
>> + * @since 3.0
>> + */
>> + public void loadPlugins(ClassLoader classLoader, Map<String,
>> List<PluginType<?>>> map) {
>> + final long startTime = System.nanoTime();
>> + final ServiceLoader<PluginService> serviceLoader =
>> ServiceLoader.load(PluginService.class, classLoader);
>> + int pluginCount = 0;
>> + for (final PluginService pluginService : serviceLoader) {
>> + PluginEntry[] entries = pluginService.getEntries();
>> + for (PluginEntry entry : entries) {
>> + try {
>> + final Class<?> clazz =
>> classLoader.loadClass(entry.getClassName());
>> + final PluginType<?> type = new PluginType(entry,
>> clazz, entry.getName());
>> + String category = entry.getCategory().toLowerCase();
>> + if (!map.containsKey(category)) {
>> + map.put(category, new ArrayList<>());
>> + }
>> + List<PluginType<?>> list = map.get(category);
>> + list.add(type);
>> + ++pluginCount;
>> + } catch (final ClassNotFoundException e) {
>> + LOGGER.info("Plugin [{}] could not be loaded due to
>> missing classes.", entry.getClassName(), e);
>> + }
>> + }
>> + }
>> + final long endTime = System.nanoTime();
>> + final DecimalFormat numFormat = new DecimalFormat("#0.000000");
>> + final double seconds = (endTime - startTime) * 1e-9;
>> + LOGGER.debug("Took {} seconds to load {} plugins from {}",
>> + numFormat.format(seconds), pluginCount, classLoader);
>> + }
>> +
>> private Map<String, List<PluginType<?>>> decodeCacheFiles(final
>> ClassLoader loader) {
>> final long startTime = System.nanoTime();
>> final PluginCache cache = new PluginCache();
>> @@ -214,7 +257,7 @@ public class PluginRegistry {
>>
>> final long startTime = System.nanoTime();
>> final ResolverUtil resolver = new ResolverUtil();
>> - final ClassLoader classLoader = Loader.getClassLoader();
>> + final ClassLoader classLoader = LoaderUtil.getClassLoader();
>> if (classLoader != null) {
>> resolver.setClassLoader(classLoader);
>> }
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
>> similarity index 92%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
>> index cc6bc66..c213f64 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
>> @@ -14,16 +14,16 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.util;
>> +package org.apache.logging.log4j.plugins.util;
>>
>>
>> -import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
>> +import org.apache.logging.log4j.plugins.processor.PluginEntry;
>>
>> /**
>> * Plugin Descriptor. This is a memento object for Plugin annotations
>> paired to their annotated classes.
>> *
>> * @param <T> The plug-in class, which can be any kind of class.
>> - * @see org.apache.logging.log4j.core.config.plugins.Plugin
>> + * @see org.apache.logging.log4j.plugins.Plugin
>> */
>> public class PluginType<T> {
>>
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
>> similarity index 97%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
>> index 73b5fc0..a57356c 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
>> @@ -14,33 +14,24 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.util;
>> +package org.apache.logging.log4j.plugins.util;
>>
>> -import java.io.File;
>> -import java.io.FileInputStream;
>> -import java.io.IOException;
>> -import java.io.InputStream;
>> -import java.io.UnsupportedEncodingException;
>> +import org.apache.logging.log4j.Logger;
>> +import org.apache.logging.log4j.util.LoaderUtil;
>> +import org.apache.logging.log4j.status.StatusLogger;
>> +import org.osgi.framework.FrameworkUtil;
>> +import org.osgi.framework.wiring.BundleWiring;
>> +
>> +import java.io.*;
>> import java.net.URI;
>> import java.net.URISyntaxException;
>> import java.net.URL;
>> import java.net.URLDecoder;
>> import java.nio.charset.StandardCharsets;
>> -import java.util.Arrays;
>> -import java.util.Collection;
>> -import java.util.Enumeration;
>> -import java.util.HashSet;
>> -import java.util.List;
>> -import java.util.Set;
>> +import java.util.*;
>> import java.util.jar.JarEntry;
>> import java.util.jar.JarInputStream;
>>
>> -import org.apache.logging.log4j.Logger;
>> -import org.apache.logging.log4j.core.util.Loader;
>> -import org.apache.logging.log4j.status.StatusLogger;
>> -import org.osgi.framework.FrameworkUtil;
>> -import org.osgi.framework.wiring.BundleWiring;
>> -
>> /**
>> * <p>
>> * ResolverUtil is used to locate classes that are available in the/a
>> class path and meet arbitrary conditions. The two
>> @@ -126,7 +117,7 @@ public class ResolverUtil {
>> * @return the ClassLoader that will be used to scan for classes
>> */
>> public ClassLoader getClassLoader() {
>> - return classloader != null ? classloader : (classloader =
>> Loader.getClassLoader(ResolverUtil.class, null));
>> + return classloader != null ? classloader : (classloader =
>> LoaderUtil.getClassLoader(ResolverUtil.class, null));
>> }
>>
>> /**
>> diff --git
>> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
>> new file mode 100644
>> index 0000000..e2bb462
>> --- /dev/null
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
>> @@ -0,0 +1,217 @@
>> +/*
>> + * 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.plugins.util;
>> +
>> +import java.lang.reflect.*;
>> +import java.util.ArrayList;
>> +import java.util.List;
>> +import java.util.Objects;
>> +
>> +/**
>> + * Utility class for working with Java {@link Type}s and derivatives.
>> This class is adapted heavily from the
>> + * <a href="http://projects.spring.io/spring-framework/">Spring
>> Framework</a>, specifically the
>> + * <a href="
>> http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/TypeUtils.html
>> ">TypeUtils</a>
>> + * class.
>> + *
>> + * @see Type
>> + * @see GenericArrayType
>> + * @see ParameterizedType
>> + * @see WildcardType
>> + * @see Class
>> + * @since 2.1
>> + */
>> +public final class TypeUtil {
>> +
>> + private TypeUtil() {
>> + }
>> +
>> + /**
>> + * Gets all declared fields for the given class (including
>> superclasses).
>> + *
>> + * @param cls the class to examine
>> + * @return all declared fields for the given class (including
>> superclasses).
>> + * @see Class#getDeclaredFields()
>> + */
>> + public static List<Field> getAllDeclaredFields(Class<?> cls) {
>> + final List<Field> fields = new ArrayList<>();
>> + while (cls != null) {
>> + for (final Field field : cls.getDeclaredFields()) {
>> + fields.add(field);
>> + }
>> + cls = cls.getSuperclass();
>> + }
>> + return fields;
>> + }
>> + /**
>> + * Indicates if two {@link Type}s are assignment compatible.
>> + *
>> + * @param lhs the left hand side to check assignability to
>> + * @param rhs the right hand side to check assignability from
>> + * @return {@code true} if it is legal to assign a variable of type
>> {@code rhs} to a variable of type {@code lhs}
>> + * @see Class#isAssignableFrom(Class)
>> + */
>> + public static boolean isAssignable(final Type lhs, final Type rhs) {
>> + Objects.requireNonNull(lhs, "No left hand side type provided");
>> + Objects.requireNonNull(rhs, "No right hand side type provided");
>> + if (lhs.equals(rhs)) {
>> + return true;
>> + }
>> + if (Object.class.equals(lhs)) {
>> + // everything is assignable to Object
>> + return true;
>> + }
>> + // raw type on left
>> + if (lhs instanceof Class<?>) {
>> + final Class<?> lhsClass = (Class<?>) lhs;
>> + if (rhs instanceof Class<?>) {
>> + // no generics involved
>> + final Class<?> rhsClass = (Class<?>) rhs;
>> + return lhsClass.isAssignableFrom(rhsClass);
>> + }
>> + if (rhs instanceof ParameterizedType) {
>> + // check to see if the parameterized type has the same
>> raw type as the lhs; this is legal
>> + final Type rhsRawType = ((ParameterizedType)
>> rhs).getRawType();
>> + if (rhsRawType instanceof Class<?>) {
>> + return lhsClass.isAssignableFrom((Class<?>)
>> rhsRawType);
>> + }
>> + }
>> + if (lhsClass.isArray() && rhs instanceof GenericArrayType) {
>> + // check for compatible array component types
>> + return isAssignable(lhsClass.getComponentType(),
>> ((GenericArrayType) rhs).getGenericComponentType());
>> + }
>> + }
>> + // parameterized type on left
>> + if (lhs instanceof ParameterizedType) {
>> + final ParameterizedType lhsType = (ParameterizedType) lhs;
>> + if (rhs instanceof Class<?>) {
>> + final Type lhsRawType = lhsType.getRawType();
>> + if (lhsRawType instanceof Class<?>) {
>> + return ((Class<?>)
>> lhsRawType).isAssignableFrom((Class<?>) rhs);
>> + }
>> + } else if (rhs instanceof ParameterizedType) {
>> + final ParameterizedType rhsType = (ParameterizedType) rhs;
>> + return isParameterizedAssignable(lhsType, rhsType);
>> + }
>> + }
>> + // generic array type on left
>> + if (lhs instanceof GenericArrayType) {
>> + final Type lhsComponentType = ((GenericArrayType)
>> lhs).getGenericComponentType();
>> + if (rhs instanceof Class<?>) {
>> + // raw type on right
>> + final Class<?> rhsClass = (Class<?>) rhs;
>> + if (rhsClass.isArray()) {
>> + return isAssignable(lhsComponentType,
>> rhsClass.getComponentType());
>> + }
>> + } else if (rhs instanceof GenericArrayType) {
>> + return isAssignable(lhsComponentType, ((GenericArrayType)
>> rhs).getGenericComponentType());
>> + }
>> + }
>> + // wildcard type on left
>> + if (lhs instanceof WildcardType) {
>> + return isWildcardAssignable((WildcardType) lhs, rhs);
>> + }
>> + // strange...
>> + return false;
>> + }
>> +
>> + private static boolean isParameterizedAssignable(final
>> ParameterizedType lhs, final ParameterizedType rhs) {
>> + if (lhs.equals(rhs)) {
>> + // that was easy
>> + return true;
>> + }
>> + final Type[] lhsTypeArguments = lhs.getActualTypeArguments();
>> + final Type[] rhsTypeArguments = rhs.getActualTypeArguments();
>> + final int size = lhsTypeArguments.length;
>> + if (rhsTypeArguments.length != size) {
>> + // clearly incompatible types
>> + return false;
>> + }
>> + for (int i = 0; i < size; i++) {
>> + // verify all type arguments are assignable
>> + final Type lhsArgument = lhsTypeArguments[i];
>> + final Type rhsArgument = rhsTypeArguments[i];
>> + if (!lhsArgument.equals(rhsArgument) &&
>> + !(lhsArgument instanceof WildcardType &&
>> + isWildcardAssignable((WildcardType) lhsArgument,
>> rhsArgument))) {
>> + return false;
>> + }
>> + }
>> + return true;
>> + }
>> +
>> + private static boolean isWildcardAssignable(final WildcardType lhs,
>> final Type rhs) {
>> + final Type[] lhsUpperBounds = getEffectiveUpperBounds(lhs);
>> + final Type[] lhsLowerBounds = getEffectiveLowerBounds(lhs);
>> + if (rhs instanceof WildcardType) {
>> + // oh boy, this scenario requires checking a lot of
>> assignability!
>> + final WildcardType rhsType = (WildcardType) rhs;
>> + final Type[] rhsUpperBounds =
>> getEffectiveUpperBounds(rhsType);
>> + final Type[] rhsLowerBounds =
>> getEffectiveLowerBounds(rhsType);
>> + for (final Type lhsUpperBound : lhsUpperBounds) {
>> + for (final Type rhsUpperBound : rhsUpperBounds) {
>> + if (!isBoundAssignable(lhsUpperBound, rhsUpperBound))
>> {
>> + return false;
>> + }
>> + }
>> + for (final Type rhsLowerBound : rhsLowerBounds) {
>> + if (!isBoundAssignable(lhsUpperBound, rhsLowerBound))
>> {
>> + return false;
>> + }
>> + }
>> + }
>> + for (final Type lhsLowerBound : lhsLowerBounds) {
>> + for (final Type rhsUpperBound : rhsUpperBounds) {
>> + if (!isBoundAssignable(rhsUpperBound, lhsLowerBound))
>> {
>> + return false;
>> + }
>> + }
>> + for (final Type rhsLowerBound : rhsLowerBounds) {
>> + if (!isBoundAssignable(rhsLowerBound, lhsLowerBound))
>> {
>> + return false;
>> + }
>> + }
>> + }
>> + } else {
>> + // phew, far less bounds to check
>> + for (final Type lhsUpperBound : lhsUpperBounds) {
>> + if (!isBoundAssignable(lhsUpperBound, rhs)) {
>> + return false;
>> + }
>> + }
>> + for (final Type lhsLowerBound : lhsLowerBounds) {
>> + if (!isBoundAssignable(lhsLowerBound, rhs)) {
>> + return false;
>> + }
>> + }
>> + }
>> + return true;
>> + }
>> +
>> + private static Type[] getEffectiveUpperBounds(final WildcardType
>> type) {
>> + final Type[] upperBounds = type.getUpperBounds();
>> + return upperBounds.length == 0 ? new Type[]{Object.class} :
>> upperBounds;
>> + }
>> +
>> + private static Type[] getEffectiveLowerBounds(final WildcardType
>> type) {
>> + final Type[] lowerBounds = type.getLowerBounds();
>> + return lowerBounds.length == 0 ? new Type[]{null} : lowerBounds;
>> + }
>> +
>> + private static boolean isBoundAssignable(final Type lhs, final Type
>> rhs) {
>> + return (rhs == null) || ((lhs != null) && isAssignable(lhs, rhs));
>> + }
>> +}
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
>> similarity index 94%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
>> index 4f6ddda..fae7580 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
>> @@ -19,4 +19,4 @@
>> * Java annotation processor for pre-scanning Log4j 2 plugins. This is
>> provided as an alternative to using the
>> * executable {@link
>> org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in
>> your build process.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.processor;
>> +package org.apache.logging.log4j.plugins.util;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
>> similarity index 81%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
>> index 0ac2223..4586315 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
>> @@ -14,14 +14,9 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>>
>> -import java.lang.annotation.Annotation;
>> -import java.lang.annotation.Documented;
>> -import java.lang.annotation.ElementType;
>> -import java.lang.annotation.Retention;
>> -import java.lang.annotation.RetentionPolicy;
>> -import java.lang.annotation.Target;
>> +import java.lang.annotation.*;
>>
>> /**
>> * Meta annotation to mark an annotation as a validation constraint. This
>> annotation must specify a
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
>> similarity index 96%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
>> index 1d8c0c5..2f638a7 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
>> @@ -14,7 +14,7 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>>
>> import java.lang.annotation.Annotation;
>>
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
>> similarity index 93%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
>> index 374c8ec..6236bb6 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
>> @@ -14,7 +14,9 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>> +
>> +import org.apache.logging.log4j.util.ReflectionUtil;
>>
>> import java.lang.annotation.Annotation;
>> import java.lang.reflect.ParameterizedType;
>> @@ -22,8 +24,6 @@ import java.lang.reflect.Type;
>> import java.util.ArrayList;
>> import java.util.Collection;
>>
>> -import org.apache.logging.log4j.core.util.ReflectionUtil;
>> -
>> /**
>> * Utility class to locate an appropriate {@link ConstraintValidator}
>> implementation for an annotation.
>> *
>> @@ -36,7 +36,7 @@ public final class ConstraintValidators {
>>
>> /**
>> * Finds all relevant {@link ConstraintValidator} objects from an
>> array of annotations. All validators will be
>> - * {@link
>> ConstraintValidator#initialize(java.lang.annotation.Annotation)
>> initialized} before being returned.
>> + * {@link ConstraintValidator#initialize(Annotation) initialized}
>> before being returned.
>> *
>> * @param annotations the annotations to find constraint validators
>> for
>> * @return a collection of ConstraintValidators for the given
>> annotations
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
>> similarity index 73%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
>> index e6f3c56..9b8a75d 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
>> @@ -15,16 +15,12 @@
>> * limitations under the license.
>> */
>>
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>
>> -import java.lang.annotation.Documented;
>> -import java.lang.annotation.ElementType;
>> -import java.lang.annotation.Retention;
>> -import java.lang.annotation.RetentionPolicy;
>> -import java.lang.annotation.Target;
>> +import org.apache.logging.log4j.plugins.validation.Constraint;
>> +import
>> org.apache.logging.log4j.plugins.validation.validators.RequiredValidator;
>>
>> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.validators.RequiredValidator;
>> +import java.lang.annotation.*;
>>
>> /**
>> * Marks a plugin builder field or plugin factory parameter as required.
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
>> similarity index 84%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
>> index c652d40..14dd9a8 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
>> @@ -14,10 +14,10 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>
>> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.validators.ValidHostValidator;
>> +import org.apache.logging.log4j.plugins.validation.Constraint;
>> +import
>> org.apache.logging.log4j.plugins.validation.validators.ValidHostValidator;
>>
>> import java.lang.annotation.*;
>> import java.net.InetAddress;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
>> similarity index 74%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
>> index a7c68b1..c4aba16 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
>> @@ -14,16 +14,12 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +package org.apache.logging.log4j.plugins.validation.constraints;
>>
>> -import java.lang.annotation.Documented;
>> -import java.lang.annotation.ElementType;
>> -import java.lang.annotation.Retention;
>> -import java.lang.annotation.RetentionPolicy;
>> -import java.lang.annotation.Target;
>> +import org.apache.logging.log4j.plugins.validation.Constraint;
>> +import
>> org.apache.logging.log4j.plugins.validation.validators.ValidPortValidator;
>>
>> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.validators.ValidPortValidator;
>> +import java.lang.annotation.*;
>>
>> /**
>> * Indicates that a plugin attribute must be a valid port number. A valid
>> port number is an integer between 0 and
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
>> similarity index 91%
>> copy from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> copy to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
>> index f22ba49..298cd5a 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
>> @@ -20,4 +20,4 @@
>> *
>> * @since 2.1
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +package org.apache.logging.log4j.plugins.validation.constraints;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
>> similarity index 93%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
>> index 171b25a..15955cb 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
>> @@ -20,4 +20,4 @@
>> *
>> * @since 2.1
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
>> similarity index 86%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
>> index 98c0a71..9df6d3b 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
>> @@ -14,17 +14,17 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>> -
>> -import java.util.Collection;
>> -import java.util.Map;
>> +package org.apache.logging.log4j.plugins.validation.validators;
>>
>> import org.apache.logging.log4j.Logger;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>> -import org.apache.logging.log4j.core.util.Assert;
>> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>> +import org.apache.logging.log4j.util.Assert;
>> import org.apache.logging.log4j.status.StatusLogger;
>>
>> +import java.util.Collection;
>> +import java.util.Map;
>> +
>> /**
>> * Validator that checks an object for emptiness. Emptiness is defined
>> here as:
>> * <ul>
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
>> similarity index 89%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
>> index 6c01753..41abbfd 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
>> @@ -14,11 +14,11 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>> +package org.apache.logging.log4j.plugins.validation.validators;
>>
>> import org.apache.logging.log4j.Logger;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
>> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
>> import org.apache.logging.log4j.status.StatusLogger;
>>
>> import java.net.InetAddress;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
>> similarity index 85%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
>> index a59742c..27e97f0 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
>> @@ -14,12 +14,12 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>> +package org.apache.logging.log4j.plugins.validation.validators;
>>
>> import org.apache.logging.log4j.Logger;
>> -import
>> org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
>> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
>> +import org.apache.logging.log4j.plugins.convert.TypeConverters;
>> import org.apache.logging.log4j.status.StatusLogger;
>>
>> /**
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
>> similarity index 92%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
>> index a8ac560..cfe2041 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
>> @@ -20,4 +20,4 @@
>> *
>> * @since 2.1
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.validators;
>> +package org.apache.logging.log4j.plugins.validation.validators;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
>> similarity index 84%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
>> index 560cbe3..b98dc09 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
>> @@ -15,18 +15,18 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>> +package org.apache.logging.log4j.plugins.visitors;
>> +
>> +import org.apache.logging.log4j.Logger;
>> +import org.apache.logging.log4j.plugins.convert.TypeConverters;
>> +import org.apache.logging.log4j.status.StatusLogger;
>> +import org.apache.logging.log4j.util.Strings;
>>
>> import java.lang.annotation.Annotation;
>> import java.lang.reflect.Member;
>> import java.util.Map;
>> import java.util.Objects;
>> -
>> -import org.apache.logging.log4j.Logger;
>> -import
>> org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
>> -import org.apache.logging.log4j.core.lookup.StrSubstitutor;
>> -import org.apache.logging.log4j.status.StatusLogger;
>> -import org.apache.logging.log4j.util.Strings;
>> +import java.util.function.Function;
>>
>> /**
>> * Base class for PluginVisitor implementations. Provides convenience
>> methods as well as all method implementations
>> @@ -34,7 +34,7 @@ import org.apache.logging.log4j.util.Strings;
>> *
>> * @param <A> the Plugin annotation type.
>> */
>> -public abstract class AbstractPluginVisitor<A extends Annotation>
>> implements PluginVisitor<A> {
>> +public abstract class AbstractPluginVisitor<A extends Annotation, T>
>> implements PluginVisitor<A, T> {
>>
>> /** Status logger. */
>> protected static final Logger LOGGER = StatusLogger.getLogger();
>> @@ -58,10 +58,6 @@ public abstract class AbstractPluginVisitor<A extends
>> Annotation> implements Plu
>> /**
>> *
>> */
>> - protected StrSubstitutor substitutor;
>> - /**
>> - *
>> - */
>> protected Member member;
>>
>> /**
>> @@ -75,7 +71,7 @@ public abstract class AbstractPluginVisitor<A extends
>> Annotation> implements Plu
>>
>> @SuppressWarnings("unchecked")
>> @Override
>> - public PluginVisitor<A> setAnnotation(final Annotation anAnnotation) {
>> + public PluginVisitor<A, T> setAnnotation(final Annotation
>> anAnnotation) {
>> final Annotation a = Objects.requireNonNull(anAnnotation, "No
>> annotation was provided");
>> if (this.clazz.isInstance(a)) {
>> this.annotation = (A) a;
>> @@ -84,25 +80,19 @@ public abstract class AbstractPluginVisitor<A extends
>> Annotation> implements Plu
>> }
>>
>> @Override
>> - public PluginVisitor<A> setAliases(final String... someAliases) {
>> + public PluginVisitor<A, T> setAliases(final String... someAliases) {
>> this.aliases = someAliases;
>> return this;
>> }
>>
>> @Override
>> - public PluginVisitor<A> setConversionType(final Class<?>
>> aConversionType) {
>> + public PluginVisitor<A, T> setConversionType(final Class<?>
>> aConversionType) {
>> this.conversionType = Objects.requireNonNull(aConversionType, "No
>> conversion type class was provided");
>> return this;
>> }
>>
>> @Override
>> - public PluginVisitor<A> setStrSubstitutor(final StrSubstitutor
>> aSubstitutor) {
>> - this.substitutor = Objects.requireNonNull(aSubstitutor, "No
>> StrSubstitutor was provided");
>> - return this;
>> - }
>> -
>> - @Override
>> - public PluginVisitor<A> setMember(final Member aMember) {
>> + public PluginVisitor<A, T> setMember(final Member aMember) {
>> this.member = aMember;
>> return this;
>> }
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
>> similarity index 80%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
>> index f4da42b..fbd28b9 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
>> @@ -15,40 +15,39 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>> +package org.apache.logging.log4j.plugins.visitors;
>>
>> -import java.util.Map;
>> -
>> -import org.apache.logging.log4j.core.LogEvent;
>> -import org.apache.logging.log4j.core.config.Configuration;
>> -import org.apache.logging.log4j.core.config.Node;
>> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>> -import org.apache.logging.log4j.core.util.NameUtil;
>> +import org.apache.logging.log4j.plugins.Node;
>> +import org.apache.logging.log4j.plugins.PluginAttribute;
>> +import org.apache.logging.log4j.util.NameUtil;
>> import org.apache.logging.log4j.util.StringBuilders;
>>
>> +import java.util.Map;
>> +import java.util.function.Function;
>> +
>> /**
>> * PluginVisitor implementation for {@link PluginAttribute}.
>> */
>> -public class PluginAttributeVisitor extends
>> AbstractPluginVisitor<PluginAttribute> {
>> +public class PluginAttributeVisitor extends
>> AbstractPluginVisitor<PluginAttribute, Object> {
>> public PluginAttributeVisitor() {
>> super(PluginAttribute.class);
>> }
>>
>> @Override
>> - public Object visit(final Configuration configuration, final Node
>> node, final LogEvent event,
>> + public Object visit(final Object unused, final Node node, final
>> Function<String, String> substitutor,
>> final StringBuilder log) {
>> final String name = this.annotation.value();
>> final Map<String, String> attributes = node.getAttributes();
>> final String rawValue = removeAttributeValue(attributes, name,
>> this.aliases);
>> - final String replacedValue = this.substitutor.replace(event,
>> rawValue);
>> - final Object defaultValue = findDefaultValue(event);
>> + final String replacedValue = substitutor.apply(rawValue);
>> + final Object defaultValue = findDefaultValue(substitutor);
>> final Object value = convert(replacedValue, defaultValue);
>> final Object debugValue = this.annotation.sensitive() ?
>> NameUtil.md5(value + this.getClass().getName()) : value;
>> StringBuilders.appendKeyDqValue(log, name, debugValue);
>> return value;
>> }
>>
>> - private Object findDefaultValue(final LogEvent event) {
>> + private Object findDefaultValue(Function<String, String> substitutor)
>> {
>> if (this.conversionType == int.class || this.conversionType ==
>> Integer.class) {
>> return this.annotation.defaultInt();
>> }
>> @@ -76,6 +75,6 @@ public class PluginAttributeVisitor extends
>> AbstractPluginVisitor<PluginAttribut
>> if (this.conversionType == Class.class) {
>> return this.annotation.defaultClass();
>> }
>> - return this.substitutor.replace(event,
>> this.annotation.defaultString());
>> + return substitutor.apply(this.annotation.defaultString());
>> }
>> }
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
>> similarity index 74%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
>> index e951456..398ff1c 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
>> @@ -15,38 +15,37 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>> +package org.apache.logging.log4j.plugins.visitors;
>>
>> -import java.util.Map;
>> -
>> -import org.apache.logging.log4j.core.LogEvent;
>> -import org.apache.logging.log4j.core.config.Configuration;
>> -import org.apache.logging.log4j.core.config.Node;
>> -import
>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>> -import org.apache.logging.log4j.core.util.NameUtil;
>> +import org.apache.logging.log4j.plugins.Node;
>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>> +import org.apache.logging.log4j.util.NameUtil;
>> import org.apache.logging.log4j.util.StringBuilders;
>>
>> +import java.util.Map;
>> +import java.util.function.Function;
>> +
>> /**
>> * PluginVisitor for PluginBuilderAttribute. If {@code null} is returned
>> for the
>> - * {@link #visit(org.apache.logging.log4j.core.config.Configuration,
>> org.apache.logging.log4j.core.config.Node,
>> org.apache.logging.log4j.core.LogEvent, StringBuilder)}
>> + * {@link #visit(org.apache.logging.log4j.core.config.Configuration,
>> org.apache.logging.log4j.plugins.Node,
>> org.apache.logging.log4j.core.LogEvent, StringBuilder)}
>> * method, then the default value of the field should remain untouched.
>> *
>> * @see org.apache.logging.log4j.core.config.plugins.util.PluginBuilder
>> */
>> -public class PluginBuilderAttributeVisitor extends
>> AbstractPluginVisitor<PluginBuilderAttribute> {
>> +public class PluginBuilderAttributeVisitor extends
>> AbstractPluginVisitor<PluginBuilderAttribute, Object> {
>>
>> public PluginBuilderAttributeVisitor() {
>> super(PluginBuilderAttribute.class);
>> }
>>
>> @Override
>> - public Object visit(final Configuration configuration, final Node
>> node, final LogEvent event,
>> + public Object visit(final Object unused, final Node node, final
>> Function<String, String> substitutor,
>> final StringBuilder log) {
>> final String overridden = this.annotation.value();
>> final String name = overridden.isEmpty() ? this.member.getName()
>> : overridden;
>> final Map<String, String> attributes = node.getAttributes();
>> final String rawValue = removeAttributeValue(attributes, name,
>> this.aliases);
>> - final String replacedValue = this.substitutor.replace(event,
>> rawValue);
>> + final String replacedValue = substitutor.apply(rawValue);
>> final Object value = convert(replacedValue, null);
>> final Object debugValue = this.annotation.sensitive() ?
>> NameUtil.md5(value + this.getClass().getName()) : value;
>> StringBuilders.appendKeyDqValue(log, name, debugValue);
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
>> similarity index 90%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
>> index 2e6e6ef..f8197f1 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
>> @@ -15,30 +15,29 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>> +package org.apache.logging.log4j.plugins.visitors;
>> +
>> +import org.apache.logging.log4j.plugins.Node;
>> +import org.apache.logging.log4j.plugins.PluginElement;
>> +import org.apache.logging.log4j.plugins.util.PluginType;
>>
>> import java.lang.reflect.Array;
>> import java.util.ArrayList;
>> import java.util.Arrays;
>> import java.util.Collection;
>> import java.util.List;
>> -
>> -import org.apache.logging.log4j.core.LogEvent;
>> -import org.apache.logging.log4j.core.config.Configuration;
>> -import org.apache.logging.log4j.core.config.Node;
>> -import org.apache.logging.log4j.core.config.plugins.PluginElement;
>> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
>> +import java.util.function.Function;
>>
>> /**
>> * PluginVisitor implementation for {@link PluginElement}. Supports
>> arrays as well as singular values.
>> */
>> -public class PluginElementVisitor extends
>> AbstractPluginVisitor<PluginElement> {
>> +public class PluginElementVisitor extends
>> AbstractPluginVisitor<PluginElement, Object> {
>> public PluginElementVisitor() {
>> super(PluginElement.class);
>> }
>>
>> @Override
>> - public Object visit(final Configuration configuration, final Node
>> node, final LogEvent event,
>> + public Object visit(final Object unused, final Node node, final
>> Function<String, String> substitutor,
>> final StringBuilder log) {
>> final String name = this.annotation.value();
>> if (this.conversionType.isArray()) {
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
>> similarity index 77%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
>> index 7f15392..9438b39 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
>> @@ -15,23 +15,23 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>> +package org.apache.logging.log4j.plugins.visitors;
>>
>> -import org.apache.logging.log4j.core.LogEvent;
>> -import org.apache.logging.log4j.core.config.Configuration;
>> -import org.apache.logging.log4j.core.config.Node;
>> -import org.apache.logging.log4j.core.config.plugins.PluginNode;
>> +import org.apache.logging.log4j.plugins.Node;
>> +import org.apache.logging.log4j.plugins.PluginNode;
>> +
>> +import java.util.function.Function;
>>
>> /**
>> * PluginVisitor implementation for {@link PluginNode}.
>> */
>> -public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode> {
>> +public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode,
>> Object> {
>> public PluginNodeVisitor() {
>> super(PluginNode.class);
>> }
>>
>> @Override
>> - public Object visit(final Configuration configuration, final Node
>> node, final LogEvent event,
>> + public Object visit(final Object unused, final Node node, final
>> Function<String, String> substitutor,
>> final StringBuilder log) {
>> if (this.conversionType.isInstance(node)) {
>> log.append("Node=").append(node.getName());
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
>> similarity index 79%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
>> index 8544570..2f68f04 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
>> @@ -15,26 +15,26 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>> +package org.apache.logging.log4j.plugins.visitors;
>>
>> -import org.apache.logging.log4j.core.LogEvent;
>> -import org.apache.logging.log4j.core.config.Configuration;
>> -import org.apache.logging.log4j.core.config.Node;
>> -import org.apache.logging.log4j.core.config.plugins.PluginValue;
>> +import org.apache.logging.log4j.plugins.Node;
>> +import org.apache.logging.log4j.plugins.PluginValue;
>> import org.apache.logging.log4j.util.StringBuilders;
>> import org.apache.logging.log4j.util.Strings;
>>
>> +import java.util.function.Function;
>> +
>> /**
>> * PluginVisitor implementation for {@link PluginValue}.
>> */
>> -public class PluginValueVisitor extends
>> AbstractPluginVisitor<PluginValue> {
>> +public class PluginValueVisitor extends
>> AbstractPluginVisitor<PluginValue, Object> {
>> public PluginValueVisitor() {
>> super(PluginValue.class);
>> }
>>
>> @Override
>> - public Object visit(final Configuration configuration, final Node
>> node, final LogEvent event,
>> - final StringBuilder log) {
>> + public Object visit(final Object unused, final Node node, final
>> Function<String, String> substitutor,
>> + final StringBuilder log) {
>> final String name = this.annotation.value();
>> final String elementValue = node.getValue();
>> final String attributeValue = node.getAttributes().get("value");
>> @@ -49,7 +49,7 @@ public class PluginValueVisitor extends
>> AbstractPluginVisitor<PluginValue> {
>> } else {
>> rawValue = removeAttributeValue(node.getAttributes(),
>> "value");
>> }
>> - final String value = this.substitutor.replace(event, rawValue);
>> + final String value = substitutor.apply(rawValue);
>> StringBuilders.appendKeyDqValue(log, name, value);
>> return value;
>> }
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
>> similarity index 68%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
>> index 34e2b78..fb7aca4 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
>> @@ -15,15 +15,13 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>> +package org.apache.logging.log4j.plugins.visitors;
>> +
>> +import org.apache.logging.log4j.plugins.Node;
>>
>> import java.lang.annotation.Annotation;
>> import java.lang.reflect.Member;
>> -
>> -import org.apache.logging.log4j.core.LogEvent;
>> -import org.apache.logging.log4j.core.config.Configuration;
>> -import org.apache.logging.log4j.core.config.Node;
>> -import org.apache.logging.log4j.core.lookup.StrSubstitutor;
>> +import java.util.function.Function;
>>
>> /**
>> * Visitor strategy for parsing data from a {@link Node}, doing any
>> relevant type conversion, and returning a
>> @@ -31,7 +29,7 @@ import
>> org.apache.logging.log4j.core.lookup.StrSubstitutor;
>> *
>> * @param <A> the Annotation type.
>> */
>> -public interface PluginVisitor<A extends Annotation> {
>> +public interface PluginVisitor<A extends Annotation, T> {
>>
>> /**
>> * Sets the Annotation to be used for this. If the given Annotation
>> is not compatible with this class's type, then
>> @@ -41,7 +39,7 @@ public interface PluginVisitor<A extends Annotation> {
>> * @return {@code this}.
>> * @throws NullPointerException if the argument is {@code null}.
>> */
>> - PluginVisitor<A> setAnnotation(Annotation annotation);
>> + PluginVisitor<A, T> setAnnotation(Annotation annotation);
>>
>> /**
>> * Sets the list of aliases to use for this visit. No aliases are
>> required, however.
>> @@ -49,7 +47,7 @@ public interface PluginVisitor<A extends Annotation> {
>> * @param aliases the list of aliases to use.
>> * @return {@code this}.
>> */
>> - PluginVisitor<A> setAliases(String... aliases);
>> + PluginVisitor<A, T> setAliases(String... aliases);
>>
>> /**
>> * Sets the class to convert the plugin value to on this visit. This
>> should correspond with a class obtained from
>> @@ -59,17 +57,7 @@ public interface PluginVisitor<A extends Annotation> {
>> * @return {@code this}.
>> * @throws NullPointerException if the argument is {@code null}.
>> */
>> - PluginVisitor<A> setConversionType(Class<?> conversionType);
>> -
>> - /**
>> - * Sets the StrSubstitutor to use for converting raw strings before
>> type conversion. Generally obtained from a
>> - * {@link org.apache.logging.log4j.core.config.Configuration}.
>> - *
>> - * @param substitutor the StrSubstitutor to use on plugin values.
>> - * @return {@code this}.
>> - * @throws NullPointerException if the argument is {@code null}.
>> - */
>> - PluginVisitor<A> setStrSubstitutor(StrSubstitutor substitutor);
>> + PluginVisitor<A, T> setConversionType(Class<?> conversionType);
>>
>> /**
>> * Sets the Member that this visitor is being used for injection
>> upon. For instance, this could be the Field
>> @@ -79,16 +67,16 @@ public interface PluginVisitor<A extends Annotation> {
>> * @param member the member this visitor is parsing a value for.
>> * @return {@code this}.
>> */
>> - PluginVisitor<A> setMember(Member member);
>> + PluginVisitor<A, T> setMember(Member member);
>>
>> /**
>> * Visits a Node to obtain a value for constructing a Plugin object.
>> *
>> * @param configuration the current Configuration.
>> * @param node the current Node corresponding to the Plugin
>> object being created.
>> - * @param event the current LogEvent that caused this Plugin
>> object to be made (optional).
>> - * @param log the StringBuilder being used to build a debug
>> message.
>> + * @param substitutor the function to perform String substitutions.
>> + * @param log th e StringBuilder being used to build a
>> debug message.
>> * @return the converted value to be used for Plugin creation.
>> */
>> - Object visit(Configuration configuration, Node node, LogEvent event,
>> StringBuilder log);
>> + Object visit(T configuration, Node node, Function<String, String>
>> substitutor, StringBuilder log);
>> }
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
>> similarity index 86%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
>> index 10ee0df..695d387 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
>> @@ -15,14 +15,14 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.visitors;
>> -
>> -import java.lang.annotation.Annotation;
>> +package org.apache.logging.log4j.plugins.visitors;
>>
>> import org.apache.logging.log4j.Logger;
>> -import org.apache.logging.log4j.core.config.plugins.PluginVisitorStrategy;
>> +import org.apache.logging.log4j.plugins.PluginVisitorStrategy;
>> import org.apache.logging.log4j.status.StatusLogger;
>>
>> +import java.lang.annotation.Annotation;
>> +
>> /**
>> * Utility class to locate an appropriate {@link PluginVisitor}
>> implementation for an annotation.
>> */
>> @@ -41,13 +41,13 @@ public final class PluginVisitors {
>> * @param annotation the Plugin annotation class to find a
>> PluginVisitor for.
>> * @return a PluginVisitor instance if one could be created, or
>> {@code null} otherwise.
>> */
>> - public static PluginVisitor<? extends Annotation> findVisitor(final
>> Class<? extends Annotation> annotation) {
>> + public static <T> PluginVisitor<? extends Annotation, T>
>> findVisitor(final Class<? extends Annotation> annotation) {
>> final PluginVisitorStrategy strategy =
>> annotation.getAnnotation(PluginVisitorStrategy.class);
>> if (strategy == null) {
>> return null;
>> }
>> try {
>> - return strategy.value().newInstance();
>> + return (PluginVisitor<? extends Annotation, T>)
>> strategy.value().newInstance();
>> } catch (final Exception e) {
>> LOGGER.error("Error loading PluginVisitor [{}] for annotation
>> [{}].", strategy.value(), annotation, e);
>> return null;
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
>> similarity index 67%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> rename to
>> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
>> index f22ba49..0855b16 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
>> +++
>> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
>> @@ -16,8 +16,9 @@
>> */
>>
>> /**
>> - * Validation annotations.
>> - *
>> - * @since 2.1
>> + * Visitor classes for extracting values from a Configuration or Node
>> corresponding to a plugin annotation.
>> + * Visitor implementations must implement {@link
>> org.apache.logging.log4j.plugins.visitors.PluginVisitor},
>> + * and the corresponding annotation must be annotated with
>> + * {@link org.apache.logging.log4j.plugins.PluginVisitorStrategy}.
>> */
>> -package
>> org.apache.logging.log4j.core.config.plugins.validation.constraints;
>> +package org.apache.logging.log4j.plugins.visitors;
>> diff --git
>> a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>> b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>> similarity index 91%
>> rename from
>> log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>> rename to
>> log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>> index bb9dcb9..5d6951a 100644
>> ---
>> a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>> +++
>> b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
>> @@ -14,4 +14,4 @@
>> # See the license for the specific language governing permissions and
>> # limitations under the license.
>> #
>> -org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor
>> +org.apache.logging.log4j.plugins.processor.PluginProcessor
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
>> similarity index 97%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
>> index f9e757d..6e4b059 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
>> @@ -14,7 +14,7 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.convert;
>> +package org.apache.logging.log4j.plugins.convert;
>>
>> import org.junit.Test;
>>
>> @@ -63,7 +63,7 @@ public class TypeConverterRegistryTest {
>> // TODO: is there a specific converter this should return?
>> }
>>
>> - public static enum Foo {
>> + public enum Foo {
>> I, PITY, THE
>> }
>>
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
>> similarity index 84%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
>> index f4ceb41..48ea7dc 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
>> @@ -15,10 +15,10 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.processor;
>> +package org.apache.logging.log4j.plugins.processor;
>>
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
>> +import org.apache.logging.log4j.plugins.Plugin;
>> +import org.apache.logging.log4j.plugins.PluginAliases;
>>
>> /**
>> * Test plugin class for unit tests.
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
>> similarity index 75%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
>> index 9c37af4..034705c 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
>> @@ -15,17 +15,19 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.processor;
>> +package org.apache.logging.log4j.plugins.processor;
>>
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
>> +import org.apache.logging.log4j.plugins.Plugin;
>> +import org.apache.logging.log4j.plugins.PluginAliases;
>> import org.junit.BeforeClass;
>> import org.junit.Test;
>> import org.junit.runner.RunWith;
>> import org.junit.runners.JUnit4;
>>
>> import java.net.URL;
>> +import java.util.ArrayList;
>> import java.util.Enumeration;
>> +import java.util.List;
>> import java.util.Map;
>>
>> import static org.junit.Assert.*;
>> @@ -33,29 +35,29 @@ import static org.junit.Assert.*;
>> @RunWith(JUnit4.class)
>> public class PluginProcessorTest {
>>
>> - private static final PluginCache pluginCache = new PluginCache();
>> + private static PluginService pluginService;
>>
>> private final Plugin p = FakePlugin.class.getAnnotation(Plugin.class);
>>
>> @BeforeClass
>> public static void setUpClass() throws Exception {
>> - final Enumeration<URL> resources =
>> -
>> PluginProcessor.class.getClassLoader().getResources(PluginProcessor.PLUGIN_CACHE_FILE);
>> - pluginCache.loadCacheFiles(resources);
>> + Class<?> clazz =
>> PluginProcessor.class.getClassLoader().loadClass("org.apache.logging.log4j.plugins.plugins.Log4jPlugins");
>> + assertNotNull("Could not locate plugins class", clazz);
>> + pluginService = (PluginService)
>> clazz.getDeclaredConstructor().newInstance();;
>> }
>>
>> @Test
>> public void testTestCategoryFound() throws Exception {
>> assertNotNull("No plugin annotation on FakePlugin.", p);
>> - final Map<String, PluginEntry> testCategory =
>> pluginCache.getCategory(p.category());
>> - assertNotEquals("No plugins were found.", 0, pluginCache.size());
>> + final Map<String, PluginEntry> testCategory =
>> pluginService.getCategory(p.category());
>> + assertNotEquals("No plugins were found.", 0,
>> pluginService.size());
>> assertNotNull("The category '" + p.category() + "' was not
>> found.", testCategory);
>> assertFalse(testCategory.isEmpty());
>> }
>>
>> @Test
>> public void testFakePluginFoundWithCorrectInformation() throws
>> Exception {
>> - final PluginEntry fake =
>> pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
>> + final PluginEntry fake =
>> pluginService.getCategory(p.category()).get(p.name().toLowerCase());
>> verifyFakePluginEntry(p.name(), fake);
>> }
>>
>> @@ -63,7 +65,7 @@ public class PluginProcessorTest {
>> public void testFakePluginAliasesContainSameInformation() throws
>> Exception {
>> final PluginAliases aliases =
>> FakePlugin.class.getAnnotation(PluginAliases.class);
>> for (final String alias : aliases.value()) {
>> - final PluginEntry fake =
>> pluginCache.getCategory(p.category()).get(alias.toLowerCase());
>> + final PluginEntry fake =
>> pluginService.getCategory(p.category()).get(alias.toLowerCase());
>> verifyFakePluginEntry(alias, fake);
>> }
>> }
>> @@ -81,7 +83,7 @@ public class PluginProcessorTest {
>> @Test
>> public void testNestedPlugin() throws Exception {
>> final Plugin p =
>> FakePlugin.Nested.class.getAnnotation(Plugin.class);
>> - final PluginEntry nested =
>> pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
>> + final PluginEntry nested =
>> pluginService.getCategory(p.category()).get(p.name().toLowerCase());
>> assertNotNull(nested);
>> assertEquals(p.name().toLowerCase(), nested.getKey());
>> assertEquals(FakePlugin.Nested.class.getName(),
>> nested.getClassName());
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
>> similarity index 93%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
>> index 33e0ee1..d0b35d1 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
>> @@ -15,27 +15,21 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.util;
>> +package org.apache.logging.log4j.plugins.util;
>>
>> -import static org.junit.Assert.assertEquals;
>> +import org.apache.logging.log4j.junit.CleanFolders;
>> +import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
>> +import org.junit.Rule;
>> +import org.junit.Test;
>> +import org.junit.rules.RuleChain;
>>
>> import java.io.IOException;
>> -import java.net.Proxy;
>> -import java.net.URL;
>> -import java.net.URLClassLoader;
>> -import java.net.URLConnection;
>> -import java.net.URLStreamHandler;
>> -import java.net.URLStreamHandlerFactory;
>> +import java.net.*;
>> import java.util.Arrays;
>> import java.util.Collections;
>> import java.util.Enumeration;
>>
>> -import
>> org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
>> -import org.apache.logging.log4j.junit.CleanFolders;
>> -import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
>> -import org.junit.Rule;
>> -import org.junit.Test;
>> -import org.junit.rules.RuleChain;
>> +import static org.junit.Assert.assertEquals;
>>
>> /**
>> * Tests the ResolverUtil class for custom protocol like bundleresource,
>> vfs, vfszip.
>> @@ -187,9 +181,9 @@ public class ResolverUtilCustomProtocolTest {
>> final ResolverUtil resolverUtil = new ResolverUtil();
>> resolverUtil
>> .setClassLoader(new SingleURLClassLoader(new
>> URL("vfs:/" + ResolverUtilTest.WORK_DIR + "/resolverutil3/customplugin3/"),
>> cl));
>> - resolverUtil.findInPackage(new PluginTest(), "customplugin3");
>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>> "customplugin3");
>> assertEquals("Class not found in packages", 1,
>> resolverUtil.getClasses().size());
>> - assertEquals("Unexpected class resolved",
>> cl.loadClass("customplugin3.FixedString3Layout"),
>> + assertEquals("Unexpected class resolved",
>> cl.loadClass("customplugin3.FixedString3"),
>> resolverUtil.getClasses().iterator().next());
>> }
>> }
>> @@ -200,9 +194,9 @@ public class ResolverUtilCustomProtocolTest {
>> final ResolverUtil resolverUtil = new ResolverUtil();
>> resolverUtil.setClassLoader(new SingleURLClassLoader(
>> new URL("vfs:/" + ResolverUtilTest.WORK_DIR +
>> "/resolverutil4/customplugin4.jar/customplugin4/"), cl));
>> - resolverUtil.findInPackage(new PluginTest(), "customplugin4");
>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>> "customplugin4");
>> assertEquals("Class not found in packages", 1,
>> resolverUtil.getClasses().size());
>> - assertEquals("Unexpected class resolved",
>> cl.loadClass("customplugin4.FixedString4Layout"),
>> + assertEquals("Unexpected class resolved",
>> cl.loadClass("customplugin4.FixedString4"),
>> resolverUtil.getClasses().iterator().next());
>> }
>> }
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
>> similarity index 82%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
>> index 1c6371b..361fe7b 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
>> @@ -15,33 +15,25 @@
>> * limitations under the license.
>> */
>>
>> -package org.apache.logging.log4j.core.config.plugins.util;
>> +package org.apache.logging.log4j.plugins.util;
>>
>> -import static org.junit.Assert.assertEquals;
>> -import static org.junit.Assert.assertTrue;
>> -
>> -import java.io.File;
>> -import java.io.IOException;
>> -import java.io.UnsupportedEncodingException;
>> -import java.net.MalformedURLException;
>> -import java.net.URI;
>> -import java.net.URISyntaxException;
>> -import java.net.URL;
>> -import java.net.URLClassLoader;
>> -import java.nio.file.FileSystem;
>> -import java.nio.file.FileSystems;
>> -import java.nio.file.Files;
>> -import java.nio.file.Path;
>> -import java.nio.file.StandardCopyOption;
>> -import java.util.HashMap;
>> -import java.util.Map;
>> -
>> -import
>> org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
>> import org.apache.logging.log4j.junit.CleanFolders;
>> import org.junit.Rule;
>> import org.junit.Test;
>> import org.junit.rules.RuleChain;
>>
>> +import javax.tools.*;
>> +import java.io.File;
>> +import java.io.IOException;
>> +import java.io.UnsupportedEncodingException;
>> +import java.net.*;
>> +import java.nio.file.*;
>> +import java.util.*;
>> +
>> +import static org.junit.Assert.assertEquals;
>> +import static org.junit.Assert.assertTrue;
>> +import static org.junit.Assert.assertNotNull;
>> +
>> /**
>> * Tests the ResolverUtil class.
>> */
>> @@ -67,6 +59,7 @@ public class ResolverUtilTest {
>> private void testExtractPathFromJarUrlNotDecodedIfFileExists(final
>> String existingFile)
>> throws MalformedURLException, UnsupportedEncodingException,
>> URISyntaxException {
>> URL url = ResolverUtilTest.class.getResource(existingFile);
>> + assertNotNull("No url returned for " + existingFile, url);
>> if (!url.getProtocol().equals("jar")) {
>> // create fake jar: URL that resolves to existing file
>> url = new URL("jar:" + url.toExternalForm() + "!/some/entry");
>> @@ -152,9 +145,9 @@ public class ResolverUtilTest {
>> try (final URLClassLoader cl = compileAndCreateClassLoader("1")) {
>> final ResolverUtil resolverUtil = new ResolverUtil();
>> resolverUtil.setClassLoader(cl);
>> - resolverUtil.findInPackage(new PluginTest(), "customplugin1");
>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>> "customplugin1");
>> assertEquals("Class not found in packages", 1,
>> resolverUtil.getClasses().size());
>> - assertEquals("Unexpected class resolved",
>> cl.loadClass("customplugin1.FixedString1Layout"),
>> + assertEquals("Unexpected class resolved",
>> cl.loadClass("customplugin1.FixedString1"),
>> resolverUtil.getClasses().iterator().next());
>> }
>> }
>> @@ -164,9 +157,9 @@ public class ResolverUtilTest {
>> try (final URLClassLoader cl =
>> compileJarAndCreateClassLoader("2")) {
>> final ResolverUtil resolverUtil = new ResolverUtil();
>> resolverUtil.setClassLoader(cl);
>> - resolverUtil.findInPackage(new PluginTest(), "customplugin2");
>> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
>> "customplugin2");
>> assertEquals("Class not found in packages", 1,
>> resolverUtil.getClasses().size());
>> - assertEquals("Unexpected class resolved",
>> cl.loadClass("customplugin2.FixedString2Layout"),
>> + assertEquals("Unexpected class resolved",
>> cl.loadClass("customplugin2.FixedString2"),
>> resolverUtil.getClasses().iterator().next());
>> }
>> }
>> @@ -176,7 +169,7 @@ public class ResolverUtilTest {
>> final File jarFile = new File(workDir, "customplugin" + suffix +
>> ".jar");
>> final URI jarURI = jarFile.toURI();
>> createJar(jarURI, workDir, new File(workDir,
>> - "customplugin" + suffix + "/FixedString" + suffix +
>> "Layout.class"));
>> + "customplugin" + suffix + "/FixedString" + suffix +
>> ".class"));
>> return URLClassLoader.newInstance(new URL[] {jarURI.toURL()});
>> }
>>
>> @@ -186,9 +179,9 @@ public class ResolverUtilTest {
>> }
>>
>> static File compile(final String suffix) throws IOException {
>> - final File orig = new
>> File("target/test-classes/customplugin/FixedStringLayout.java.source");
>> + final File orig = new
>> File("target/test-classes/customplugin/FixedString.java.source");
>> final File workDir = new File(WORK_DIR, "resolverutil" + suffix);
>> - final File f = new File(workDir, "customplugin" + suffix +
>> "/FixedString" + suffix + "Layout.java");
>> + final File f = new File(workDir, "customplugin" + suffix +
>> "/FixedString" + suffix + ".java");
>> final File parent = f.getParentFile();
>> if (!parent.exists()) {
>> assertTrue("Create customplugin" + suffix + " folder KO",
>> f.getParentFile().mkdirs());
>> @@ -199,7 +192,7 @@ public class ResolverUtilTest {
>> .replaceAll("customplugin", "customplugin" + suffix);
>> Files.write(f.toPath(), content.getBytes());
>>
>> - PluginManagerPackagesTest.compile(f);
>> + compile(f);
>> return workDir;
>> }
>>
>> @@ -218,4 +211,29 @@ public class ResolverUtilTest {
>> }
>> }
>>
>> + static void compile(final File f) throws IOException {
>> + // set up compiler
>> + final JavaCompiler compiler =
>> ToolProvider.getSystemJavaCompiler();
>> + final DiagnosticCollector<JavaFileObject> diagnostics = new
>> DiagnosticCollector<>();
>> + final List<String> errors = new ArrayList<>();
>> + try (final StandardJavaFileManager fileManager =
>> compiler.getStandardFileManager(diagnostics, null, null)) {
>> + final Iterable<? extends JavaFileObject> compilationUnits =
>> fileManager.getJavaFileObjectsFromFiles(Arrays
>> + .asList(f));
>> +
>> + // compile generated source
>> + // (switch off annotation processing: no need to create
>> Log4j2Plugins.dat)
>> + final List<String> options = Arrays.asList("-proc:none");
>> + compiler.getTask(null, fileManager, diagnostics, options,
>> null, compilationUnits).call();
>> +
>> + // check we don't have any compilation errors
>> + for (final Diagnostic<? extends JavaFileObject> diagnostic :
>> diagnostics.getDiagnostics()) {
>> + if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
>> + errors.add(String.format("Compile error at line %d,
>> column %d: %s%n", diagnostic.getLineNumber(),
>> + diagnostic.getColumnNumber(),
>> diagnostic.getMessage(Locale.getDefault())));
>> + }
>> + }
>> + }
>> + assertTrue(errors.toString(), errors.isEmpty());
>> + }
>> +
>> }
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
>> similarity index 87%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
>> index 5689e29..0e243f2 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
>> @@ -14,10 +14,10 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>>
>> -import
>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>
>> /**
>> *
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
>> similarity index 78%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
>> index 34123c0..626798e 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
>> @@ -14,15 +14,15 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>>
>> -import java.net.InetSocketAddress;
>> +import org.apache.logging.log4j.plugins.PluginAttribute;
>> +import org.apache.logging.log4j.plugins.PluginFactory;
>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
>> +import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
>> +import org.apache.logging.log4j.plugins.Plugin;
>>
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
>> +import java.net.InetSocketAddress;
>>
>> @Plugin(name = "HostAndPort", category = "Test")
>> public class HostAndPort {
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>> similarity index 81%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>> index 3f2b15a..c3fe6c5 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
>> @@ -14,18 +14,18 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>>
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> -import
>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>> +import org.apache.logging.log4j.plugins.Plugin;
>>
>> @Plugin(name = "PluginWithGenericSubclassFoo1Builder", category = "Test")
>> public class PluginWithGenericSubclassFoo1Builder extends
>> AbstractPluginWithGenericBuilder {
>>
>> public static class Builder<B extends Builder<B>> extends
>> AbstractPluginWithGenericBuilder.Builder<B>
>> - implements
>> org.apache.logging.log4j.core.util.Builder<PluginWithGenericSubclassFoo1Builder>
>> {
>> + implements
>> org.apache.logging.log4j.plugins.util.Builder<PluginWithGenericSubclassFoo1Builder>
>> {
>>
>> @PluginBuilderFactory
>> public static <B extends Builder<B>> B newBuilder() {
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
>> similarity index 80%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
>> index 95a4209..9caf453 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
>> @@ -14,15 +14,15 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>>
>> -import java.util.Objects;
>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>> +import org.apache.logging.log4j.plugins.PluginFactory;
>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>> +import org.apache.logging.log4j.plugins.Plugin;
>>
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> -import
>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>> +import java.util.Objects;
>>
>> /**
>> *
>> @@ -51,7 +51,7 @@ public class ValidatingPlugin {
>> return new Builder();
>> }
>>
>> - public static class Builder implements
>> org.apache.logging.log4j.core.util.Builder<ValidatingPlugin> {
>> + public static class Builder implements
>> org.apache.logging.log4j.plugins.util.Builder<ValidatingPlugin> {
>>
>> @PluginBuilderAttribute
>> @Required(message = "The name given by the builder is null")
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
>> similarity index 80%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
>> index 81b9d6f..b0bec53 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
>> @@ -14,15 +14,16 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>>
>> -import java.util.Objects;
>> +import org.apache.logging.log4j.plugins.Plugin;
>> +
>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>> +import org.apache.logging.log4j.plugins.PluginFactory;
>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>>
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> -import
>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>> +import java.util.Objects;
>>
>> /**
>> *
>> @@ -51,7 +52,7 @@ public class ValidatingPluginWithGenericBuilder {
>> return new Builder<B>().asBuilder();
>> }
>>
>> - public static class Builder<B extends Builder<B>> implements
>> org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithGenericBuilder>
>> {
>> + public static class Builder<B extends Builder<B>> implements
>> org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithGenericBuilder>
>> {
>>
>> @PluginBuilderAttribute
>> @Required(message = "The name given by the builder is null")
>> diff --git
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
>> similarity index 80%
>> rename from
>> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
>> rename to
>> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
>> index 74a6477..256181c 100644
>> ---
>> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
>> +++
>> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
>> @@ -14,15 +14,15 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.validation;
>> +package org.apache.logging.log4j.plugins.validation;
>>
>> -import java.util.Objects;
>> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
>> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
>> +import org.apache.logging.log4j.plugins.PluginFactory;
>> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>> +import org.apache.logging.log4j.plugins.Plugin;
>>
>> -import org.apache.logging.log4j.core.config.plugins.Plugin;
>> -import
>> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
>> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>> -import
>> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
>> +import java.util.Objects;
>>
>> /**
>> *
>> @@ -51,7 +51,7 @@ public class ValidatingPluginWithTypedBuilder {
>> return new Builder<>();
>> }
>>
>> - public static class Builder<T> implements
>> org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithTypedBuilder>
>> {
>> + public static class Builder<T> implements
>> org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithTypedBuilder>
>> {
>>
>> @PluginBuilderAttribute
>> @Required(message = "The name given by the builder is null")
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>> b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
>> similarity index 52%
>> rename from
>> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>> rename to
>> log4j-plugins/src/test/resources/customplugin/FixedString.java.source
>> index 15a162c..85a62ec 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
>> +++ b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
>> @@ -14,25 +14,32 @@
>> * See the license for the specific language governing permissions and
>> * limitations under the license.
>> */
>> -package org.apache.logging.log4j.core.config.plugins.convert;
>>
>> -import org.apache.logging.log4j.util.EnglishEnums;
>> +package customplugin;
>>
>> -/**
>> - * Converts a {@link String} into a {@link Enum}. Returns {@code null}
>> for invalid enum names.
>> - *
>> - * @param <E> the enum class to parse.
>> - * @since 2.1 moved from TypeConverters
>> - */
>> -public class EnumConverter<E extends Enum<E>> implements TypeConverter<E>
>> {
>> - private final Class<E> clazz;
>> +import java.util.Collections;
>> +import java.util.Map;
>> +
>> +import org.apache.logging.log4j.plugins.Plugin;
>> +import org.apache.logging.log4j.plugins.PluginAttribute;
>> +import org.apache.logging.log4j.plugins.PluginFactory;
>> +
>> +@Plugin(name = "FixedString", category = "Core", elementType = "plugin",
>> printObject = true)
>> +public class FixedString {
>> +
>> + private String fixedString;
>> +
>> + @PluginFactory
>> + public static FixedString create(
>> + @PluginAttribute("fixedString") final String fixedString) {
>> + return new FixedString(fixedString);
>> + }
>>
>> - public EnumConverter(final Class<E> clazz) {
>> - this.clazz = clazz;
>> + public FixedString(String fixedString) {
>> + this.fixedString = fixedString;
>> }
>>
>> - @Override
>> - public E convert(final String s) {
>> - return EnglishEnums.valueOf(clazz, s);
>> + public Map<String, String> getContentFormat() {
>> + return Collections.emptyMap();
>> }
>> }
>> diff --git
>> a/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
>> b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
>> new file mode 100644
>> index 0000000..b85475a
>> --- /dev/null
>> +++
>> b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
>> @@ -0,0 +1,31 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<!--
>> + 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.
>> +
>> +-->
>> +<Configuration status="OFF" name="XMLConfigTest">
>> +
>> + <Appenders>
>> + <List name="List">
>> + </List>
>> + </Appenders>
>> + <Loggers>
>> + <Root level="trace">
>> + <AppenderRef ref="List"/>
>> + </Root>
>> + </Loggers>
>> +
>> +</Configuration>
>> \ No newline at end of file
>> diff --git a/log4j-plugins/src/test/resources/s p a c e
>> s/log4j+config+with+plus+characters.xml
>> b/log4j-plugins/src/test/resources/s p a c e
>> s/log4j+config+with+plus+characters.xml
>> new file mode 100644
>> index 0000000..b85475a
>> --- /dev/null
>> +++ b/log4j-plugins/src/test/resources/s p a c e
>> s/log4j+config+with+plus+characters.xml
>> @@ -0,0 +1,31 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<!--
>> + 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.
>> +
>> +-->
>> +<Configuration status="OFF" name="XMLConfigTest">
>> +
>> + <Appenders>
>> + <List name="List">
>> + </List>
>> + </Appenders>
>> + <Loggers>
>> + <Root level="trace">
>> + <AppenderRef ref="List"/>
>> + </Root>
>> + </Loggers>
>> +
>> +</Configuration>
>> \ No newline at end of file
>>
>>
Re: [logging-log4j2] 01/02: LOG4J2-2621 - Initial commit
Posted by Gary Gregory <ga...@gmail.com>.
This is weird, note the "}":
.../org/apache/logging/log4j}/util/Assert.java | 0
Gary
On Sun, Jun 2, 2019 at 6:38 PM <rg...@apache.org> wrote:
> This is an automated email from the ASF dual-hosted git repository.
>
> rgoers pushed a commit to branch LOG4J2-2621
> in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
>
> commit b69c2d9e4b79ee7830a69463c6f89de1c50fe84d
> Author: Ralph Goers <rg...@apache.org>
> AuthorDate: Sun Jun 2 13:18:36 2019 -0700
>
> LOG4J2-2621 - Initial commit
> ---
> .../org/apache/logging/log4j}/util/Assert.java | 0
> .../logging/log4j/util/InternalException.java | 56 ++++
> .../org/apache/logging/log4j}/util/NameUtil.java | 0
> .../apache/logging/log4j}/util/ReflectionUtil.java | 6 +-
> .../log4j/junit/AbstractExternalFileCleaner.java | 0
> .../org/apache/logging/log4j/junit/CleanFiles.java | 0
> .../apache/logging/log4j/junit/CleanFolders.java | 0
> .../log4j/junit/URLStreamHandlerFactoryRule.java | 0
> .../org/apache/logging/log4j}/util/AssertTest.java | 2 +-
> .../config/plugins/convert/Base64Converter.java | 79 -----
> ...TypeConverters.java => CoreTypeConverters.java} | 7 +-
> .../ValidatingPluginWithGenericBuilderTest.java | 10 +-
> log4j-plugins-java9/pom.xml | 157 +++++++++
> log4j-plugins-java9/src/assembly/java9.xml | 40 +++
> .../src/main/java/module-info.java | 15 +-
> .../org/apache/logging/log4j/plugins/Dummy.java | 9 +-
> .../logging/log4j/plugins/convert/Dummy.java | 9 +-
> .../log4j/plugins/processor/PluginService.java | 9 +-
> .../apache/logging/log4j/plugins/util/Dummy.java | 9 +-
> .../logging/log4j/plugins/validation/Dummy.java | 9 +-
> .../logging/log4j/plugins/visitors/Dummy.java | 9 +-
> log4j-plugins/pom.xml | 360
> +++++++++++++++++++++
> .../org/apache/logging/log4j/plugins}/Node.java | 6 +-
> .../org/apache/logging/log4j}/plugins/Plugin.java | 6 +-
> .../logging/log4j}/plugins/PluginAliases.java | 4 +-
> .../logging/log4j}/plugins/PluginAttribute.java | 8 +-
> .../log4j}/plugins/PluginBuilderAttribute.java | 8 +-
> .../log4j}/plugins/PluginBuilderFactory.java | 2 +-
> .../logging/log4j}/plugins/PluginElement.java | 6 +-
> .../logging/log4j}/plugins/PluginFactory.java | 2 +-
> .../apache/logging/log4j}/plugins/PluginNode.java | 6 +-
> .../apache/logging/log4j}/plugins/PluginValue.java | 6 +-
> .../log4j}/plugins/PluginVisitorStrategy.java | 8 +-
> .../log4j}/plugins/convert/EnumConverter.java | 2 +-
> .../log4j}/plugins/convert/HexConverter.java | 2 +-
> .../log4j}/plugins/convert/TypeConverter.java | 2 +-
> .../plugins/convert/TypeConverterRegistry.java | 23 +-
> .../log4j}/plugins/convert/TypeConverters.java | 47 +--
> .../log4j/plugins/convert}/package-info.java | 7 +-
> .../logging/log4j/plugins/osgi/Activator.java | 103 ++++++
> .../logging/log4j/plugins/osgi}/package-info.java | 6 +-
> .../logging/log4j/plugins}/package-info.java | 6 +-
> .../log4j}/plugins/processor/PluginCache.java | 30 +-
> .../log4j}/plugins/processor/PluginEntry.java | 14 +-
> .../log4j}/plugins/processor/PluginProcessor.java | 157 +++++++--
> .../log4j/plugins/processor/PluginService.java | 56 ++++
> .../log4j}/plugins/processor/package-info.java | 2 +-
> .../logging/log4j/plugins}/util/Builder.java | 4 +-
> .../logging/log4j}/plugins/util/PluginManager.java | 8 +-
> .../log4j}/plugins/util/PluginRegistry.java | 81 +++--
> .../logging/log4j}/plugins/util/PluginType.java | 6 +-
> .../logging/log4j}/plugins/util/ResolverUtil.java | 29 +-
> .../logging/log4j/plugins/util/TypeUtil.java | 217 +++++++++++++
> .../logging/log4j/plugins/util}/package-info.java | 2 +-
> .../log4j}/plugins/validation/Constraint.java | 9 +-
> .../plugins/validation/ConstraintValidator.java | 2 +-
> .../plugins/validation/ConstraintValidators.java | 8 +-
> .../plugins/validation/constraints/Required.java | 12 +-
> .../plugins/validation/constraints/ValidHost.java | 6 +-
> .../plugins/validation/constraints/ValidPort.java | 12 +-
> .../validation/constraints/package-info.java | 2 +-
> .../log4j}/plugins/validation/package-info.java | 2 +-
> .../validation/validators/RequiredValidator.java | 14 +-
> .../validation/validators/ValidHostValidator.java | 6 +-
> .../validation/validators/ValidPortValidator.java | 8 +-
> .../validation/validators/package-info.java | 2 +-
> .../plugins/visitors/AbstractPluginVisitor.java | 34 +-
> .../plugins/visitors/PluginAttributeVisitor.java | 27 +-
> .../visitors/PluginBuilderAttributeVisitor.java | 23 +-
> .../plugins/visitors/PluginElementVisitor.java | 17 +-
> .../log4j}/plugins/visitors/PluginNodeVisitor.java | 14 +-
> .../plugins/visitors/PluginValueVisitor.java | 18 +-
> .../log4j}/plugins/visitors/PluginVisitor.java | 36 +--
> .../log4j}/plugins/visitors/PluginVisitors.java | 12 +-
> .../log4j/plugins/visitors}/package-info.java | 9 +-
> .../services/javax.annotation.processing.Processor | 2 +-
> .../plugins/convert/TypeConverterRegistryTest.java | 4 +-
> .../log4j}/plugins/processor/FakePlugin.java | 6 +-
> .../plugins/processor/PluginProcessorTest.java | 26 +-
> .../util/ResolverUtilCustomProtocolTest.java | 30 +-
> .../log4j}/plugins/util/ResolverUtilTest.java | 76 +++--
> .../AbstractPluginWithGenericBuilder.java | 6 +-
> .../log4j}/plugins/validation/HostAndPort.java | 14 +-
> .../PluginWithGenericSubclassFoo1Builder.java | 12 +-
> .../plugins/validation/ValidatingPlugin.java | 16 +-
> .../ValidatingPluginWithGenericBuilder.java | 17 +-
> .../ValidatingPluginWithTypedBuilder.java | 16 +-
> .../resources/customplugin/FixedString.java.source | 37 ++-
> .../log4j+config+with+plus+characters.xml | 31 ++
> .../log4j+config+with+plus+characters.xml | 31 ++
> 90 files changed, 1655 insertions(+), 594 deletions(-)
>
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
> similarity index 100%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java
> rename to log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
> diff --git
> a/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
> new file mode 100644
> index 0000000..8c433db
> --- /dev/null
> +++
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
> @@ -0,0 +1,56 @@
> +/*
> + * 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;
> +
> +/**
> + * Exception thrown when an error occurs while logging. In most cases
> exceptions will be handled
> + * within Log4j but certain Appenders may be configured to allow
> exceptions to propagate to the
> + * application. This is a RuntimeException so that the exception may be
> thrown in those cases without
> + * requiring all Logger methods be contained with try/catch blocks.
> + */
> +public class LoggingException extends RuntimeException {
> +
> + private static final long serialVersionUID = 6366395965071580537L;
> +
> + /**
> + * Construct an exception with a message.
> + *
> + * @param message The reason for the exception
> + */
> + public LoggingException(final String message) {
> + super(message);
> + }
> +
> + /**
> + * Construct an exception with a message and underlying cause.
> + *
> + * @param message The reason for the exception
> + * @param cause The underlying cause of the exception
> + */
> + public LoggingException(final String message, final Throwable cause) {
> + super(message, cause);
> + }
> +
> + /**
> + * Construct an exception with an underlying cause.
> + *
> + * @param cause The underlying cause of the exception
> + */
> + public LoggingException(final Throwable cause) {
> + super(cause);
> + }
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
> similarity index 100%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java
> rename to
> log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
> similarity index 98%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
> rename to
> log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
> index ffee439..f00e64a 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
> +++
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
> @@ -193,8 +193,10 @@ public final class ReflectionUtil {
> } catch (final IllegalAccessException e) {
> throw new IllegalStateException(e);
> } catch (final InvocationTargetException e) {
> - Throwables.rethrow(e.getCause());
> - throw new InternalError("Unreachable");
> + if (e.getCause() instanceof RuntimeException) {
> + throw (RuntimeException) e.getCause();
> + }
> + throw new
> }
> }
> }
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
> similarity index 100%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
> rename to
> log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
> similarity index 100%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
> rename to
> log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
> similarity index 100%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
> rename to
> log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
> b/log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
> similarity index 100%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
> rename to
> log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
> b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
> similarity index 99%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
> rename to
> log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
> index 242c41e..7e46036 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
> +++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
> @@ -65,4 +65,4 @@ public class AssertTest {
> assertEquals(isEmpty, Assert.isEmpty(value));
> }
>
> -}
> \ No newline at end of file
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
> deleted file mode 100644
> index f4e421f..0000000
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
> +++ /dev/null
> @@ -1,79 +0,0 @@
> -/*
> - * 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.convert;
> -
> -import java.lang.reflect.InvocationTargetException;
> -import java.lang.reflect.Method;
> -
> -import org.apache.logging.log4j.Logger;
> -import org.apache.logging.log4j.status.StatusLogger;
> -import org.apache.logging.log4j.util.LoaderUtil;
> -
> -/**
> - * @Since 2.9
> - */
> -public class Base64Converter {
> -
> - private static final Logger LOGGER = StatusLogger.getLogger();
> - private static Method method = null;
> - private static Object decoder = null;
> -
> - static {
> - try {
> - // Base64 is available in Java 8 and up.
> - Class<?> clazz = LoaderUtil.loadClass("java.util.Base64");
> - final Method getDecoder = clazz.getMethod("getDecoder",
> (Class[]) null);
> - decoder = getDecoder.invoke(null, (Object[]) null);
> - clazz = decoder.getClass();
> - method = clazz.getMethod("decode", String.class);
> - } catch (final ClassNotFoundException ex) {
> -
> - } catch (final NoSuchMethodException ex) {
> -
> - } catch (final IllegalAccessException ex) {
> -
> - } catch (final InvocationTargetException ex) {
> -
> - }
> - if (method == null) {
> - try {
> - // DatatypeConverter is not in the default module in Java
> 9.
> - final Class<?> clazz =
> LoaderUtil.loadClass("javax.xml.bind.DatatypeConverter");
> - method = clazz.getMethod("parseBase64Binary",
> String.class);
> - } catch (final ClassNotFoundException ex) {
> - LOGGER.error("No Base64 Converter is available");
> - } catch (final NoSuchMethodException ex) {
> -
> - }
> - }
> - }
> -
> - public static byte[] parseBase64Binary(final String encoded) {
> - if (method == null) {
> - LOGGER.error("No base64 converter");
> - } else {
> - try {
> - return (byte[]) method.invoke(decoder, encoded);
> - } catch (final IllegalAccessException ex) {
> - LOGGER.error("Error decoding string - " +
> ex.getMessage());
> - } catch (final InvocationTargetException ex) {
> - LOGGER.error("Error decoding string - " +
> ex.getMessage());
> - }
> - }
> - return new byte[0];
> - }
> -}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
> similarity index 98%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
> copy to
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
> index dc833f0..00e6da7 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
> +++
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
> @@ -30,13 +30,14 @@ import java.nio.file.Path;
> import java.nio.file.Paths;
> import java.security.Provider;
> import java.security.Security;
> +import java.util.Base64;
> import java.util.UUID;
> import java.util.regex.Pattern;
>
> import org.apache.logging.log4j.Level;
> import org.apache.logging.log4j.Logger;
> import org.apache.logging.log4j.core.appender.rolling.action.Duration;
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> +import org.apache.logging.log4j.plugins.Plugin;
> import org.apache.logging.log4j.core.util.CronExpression;
> import org.apache.logging.log4j.status.StatusLogger;
> import org.apache.logging.log4j.util.LoaderUtil;
> @@ -56,6 +57,8 @@ public final class TypeConverters {
> */
> public static final String CATEGORY = "TypeConverter";
>
> + private static final Base64.Decoder decoder = Base64.getDecoder();
> +
> /**
> * Parses a {@link String} into a {@link BigDecimal}.
> */
> @@ -112,7 +115,7 @@ public final class TypeConverters {
> bytes = new byte[0];
> } else if (value.startsWith(PREFIX_BASE64)) {
> final String lexicalXSDBase64Binary =
> value.substring(PREFIX_BASE64.length());
> - bytes =
> Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
> + bytes = decoder.decode(lexicalXSDBase64Binary);
> } else if (value.startsWith(PREFIX_0x)) {
> final String lexicalXSDHexBinary =
> value.substring(PREFIX_0x.length());
> bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
> b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
> index 8ee5abb..27ac5fe 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
> +++
> b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
> @@ -20,12 +20,12 @@ import static org.junit.Assert.assertEquals;
> import static org.junit.Assert.assertNotNull;
> import static org.junit.Assert.assertNull;
>
> -import org.apache.logging.log4j.core.config.Node;
> +import org.apache.logging.log4j.plugins.Node;
> import org.apache.logging.log4j.core.config.NullConfiguration;
> -import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
> -import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.ValidatingPluginWithGenericBuilder;
> +import org.apache.logging.log4j.plugins.util.PluginBuilder;
> +import org.apache.logging.log4j.plugins.util.PluginManager;
> +import org.apache.logging.log4j.plugins.util.PluginType;
> +import
> org.apache.logging.log4j.plugins.validation.ValidatingPluginWithGenericBuilder;
> import org.junit.Before;
> import org.junit.Test;
>
> diff --git a/log4j-plugins-java9/pom.xml b/log4j-plugins-java9/pom.xml
> new file mode 100644
> index 0000000..49f81c6
> --- /dev/null
> +++ b/log4j-plugins-java9/pom.xml
> @@ -0,0 +1,157 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<!--
> + ~ 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.
> + -->
> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
> http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
> ">
> + <modelVersion>4.0.0</modelVersion>
> + <parent>
> + <groupId>org.apache.logging.log4j</groupId>
> + <artifactId>log4j</artifactId>
> + <version>3.0.0-SNAPSHOT</version>
> + <relativePath>../</relativePath>
> + </parent>
> + <artifactId>log4j-plugins-java9</artifactId>
> + <packaging>pom</packaging>
> + <name>Apache Log4j Plugins Module support</name>
> + <description>Apache Log4j Plugin Moduels Support</description>
> + <properties>
> + <log4jParentDir>${basedir}/..</log4jParentDir>
> + <docLabel>Log4j Plugins Documentation</docLabel>
> + <projectDir>/plugins</projectDir>
> + </properties>
> + <dependencies>
> + <dependency>
> + <groupId>org.apache.logging.log4j</groupId>
> + <artifactId>log4j-api</artifactId>
> + </dependency>
> + <dependency>
> + <groupId>junit</groupId>
> + <artifactId>junit</artifactId>
> + <scope>test</scope>
> + </dependency>
> + <dependency>
> + <groupId>org.apache.maven</groupId>
> + <artifactId>maven-core</artifactId>
> + <scope>test</scope>
> + </dependency>
> + </dependencies>
> + <build>
> + <plugins>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-toolchains-plugin</artifactId>
> + <version>1.1</version>
> + <executions>
> + <execution>
> + <goals>
> + <goal>toolchain</goal>
> + </goals>
> + </execution>
> + </executions>
> + <configuration>
> + <toolchains>
> + <jdk>
> + <version>[9, )</version>
> + </jdk>
> + </toolchains>
> + </configuration>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-compiler-plugin</artifactId>
> + <executions>
> + <execution>
> + <id>default-compile</id>
> + <phase>compile</phase>
> + <goals>
> + <goal>compile</goal>
> + </goals>
> + </execution>
> + <execution>
> + <id>default-test-compile</id>
> + <phase>test-compile</phase>
> + <goals>
> + <goal>testCompile</goal>
> + </goals>
> + </execution>
> + </executions>
> + <configuration>
> + <source>9</source>
> + <target>9</target>
> + <release>9</release>
> + <proc>none</proc>
> + <!-- disable errorprone -->
> + <compilerId>javac</compilerId>
> + </configuration>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-surefire-plugin</artifactId>
> + <!-- Do not upgrade until
> https://issues.apache.org/jira/browse/SUREFIRE-720 is fixed -->
> + <version>2.13</version>
> + <executions>
> + <execution>
> + <id>test</id>
> + <phase>test</phase>
> + <goals>
> + <goal>test</goal>
> + </goals>
> + </execution>
> + </executions>
> + <configuration>
> + <systemPropertyVariables>
> + <java.awt.headless>true</java.awt.headless>
> + </systemPropertyVariables>
> + <includes>
> + <include>**/Test*.java</include>
> + <include>**/*Test.java</include>
> + </includes>
> + <excludes>
> + <exclude>**/*FuncTest.java</exclude>
> + </excludes>
> + </configuration>
> + </plugin>
> + <plugin>
> + <artifactId>maven-assembly-plugin</artifactId>
> + <executions>
> + <execution>
> + <id>zip</id>
> + <phase>package</phase>
> + <goals>
> + <goal>single</goal>
> + </goals>
> + <configuration>
> +
> <finalName>log4j-plugins-java9-${project.version}</finalName>
> + <appendAssemblyId>false</appendAssemblyId>
> + <descriptors>
> + <descriptor>src/assembly/java9.xml</descriptor>
> + </descriptors>
> + </configuration>
> + </execution>
> + </executions>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-deploy-plugin</artifactId>
> + <version>${deploy.plugin.version}</version>
> + <configuration>
> + <skip>true</skip>
> + </configuration>
> + </plugin>
> + </plugins>
> + </build>
> +</project>
> +
> diff --git a/log4j-plugins-java9/src/assembly/java9.xml
> b/log4j-plugins-java9/src/assembly/java9.xml
> new file mode 100644
> index 0000000..34649d4
> --- /dev/null
> +++ b/log4j-plugins-java9/src/assembly/java9.xml
> @@ -0,0 +1,40 @@
> +<?xml version='1.0' encoding='UTF-8'?>
> +<!--
> + 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.
> +-->
> +
> +<assembly>
> + <id>src</id>
> + <formats>
> + <format>zip</format>
> + </formats>
> + <baseDirectory>/</baseDirectory>
> + <fileSets>
> + <fileSet>
> + <directory>${project.build.outputDirectory}</directory>
> + <outputDirectory>/classes/META-INF/versions/9</outputDirectory>
> + <includes>
> + <include>module-info.class</include>
> + </includes>
> + <excludes>
> + <exclude>**/Dummy.class</exclude>
> + <exclude>**/PluginService.class</exclude>
> + </excludes>
> + </fileSet>
> + </fileSets>
> +</assembly>
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins-java9/src/main/java/module-info.java
> similarity index 65%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to log4j-plugins-java9/src/main/java/module-info.java
> index f22ba49..9802622 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++ b/log4j-plugins-java9/src/main/java/module-info.java
> @@ -14,10 +14,13 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> +module org.apache.logging.log4j.plugins {
> + exports org.apache.logging.log4j.plugins;
> + exports org.apache.logging.log4j.plugins.convert;
> + exports org.apache.logging.log4j.plugins.processor;
> + exports org.apache.logging.log4j.plugins.util;
> + exports org.apache.logging.log4j.plugins.validation;
> + exports org.apache.logging.log4j.plugins.visitors;
>
> -/**
> - * Validation annotations.
> - *
> - * @since 2.1
> - */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> + uses org.apache.logging.log4j.plugins.processor.PluginService;
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
> similarity index 80%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
> index f22ba49..14a90ed 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
> @@ -14,10 +14,11 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> +package org.apache.logging.log4j.plugins;
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * This is a dummy class and is only here to allow module-info.java to
> compile. It will not
> + * be copied into the log4j-api module.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +public class Dummy {
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
> similarity index 79%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
> index f22ba49..10923e8 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
> @@ -14,10 +14,11 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> +package org.apache.logging.log4j.plugins.convert;
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * This is a dummy class and is only here to allow module-info.java to
> compile. It will not
> + * be copied into the log4j-api module.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +public class Dummy {
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
> similarity index 79%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
> index f22ba49..b93ef59 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
> @@ -14,10 +14,11 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> +package org.apache.logging.log4j.plugins.processor;
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * This is a dummy class and is only here to allow module-info.java to
> compile. It will not
> + * be copied into the log4j-api module.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +public class PluginService {
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
> similarity index 80%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
> index f22ba49..5940b03 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
> @@ -14,10 +14,11 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> +package org.apache.logging.log4j.plugins.util;
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * This is a dummy class and is only here to allow module-info.java to
> compile. It will not
> + * be copied into the log4j-api module.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +public class Dummy {
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
> similarity index 79%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
> index f22ba49..14882b5 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
> @@ -14,10 +14,11 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> +package org.apache.logging.log4j.plugins.validation;
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * This is a dummy class and is only here to allow module-info.java to
> compile. It will not
> + * be copied into the log4j-api module.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +public class Dummy {
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
> similarity index 79%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
> index f22ba49..5596338 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
> @@ -14,10 +14,11 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> +package org.apache.logging.log4j.plugins.visitors;
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * This is a dummy class and is only here to allow module-info.java to
> compile. It will not
> + * be copied into the log4j-api module.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +public class Dummy {
> +}
> diff --git a/log4j-plugins/pom.xml b/log4j-plugins/pom.xml
> new file mode 100644
> index 0000000..3551d51
> --- /dev/null
> +++ b/log4j-plugins/pom.xml
> @@ -0,0 +1,360 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<!--
> + ~ 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.
> + -->
> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
> http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
> ">
> + <modelVersion>4.0.0</modelVersion>
> + <parent>
> + <groupId>org.apache.logging.log4j</groupId>
> + <artifactId>log4j</artifactId>
> + <version>3.0.0-SNAPSHOT</version>
> + <relativePath>../</relativePath>
> + </parent>
> + <artifactId>log4j-plugins</artifactId>
> + <packaging>jar</packaging>
> + <name>Apache Log4j Plugins</name>
> + <description>Log4j Plugin Support</description>
> + <properties>
> + <log4jParentDir>${basedir}/..</log4jParentDir>
> + <docLabel>Plugin Documentation</docLabel>
> + <projectDir>/plugins</projectDir>
> + </properties>
> + <dependencies>
> + <dependency>
> + <groupId>org.apache.logging.log4j</groupId>
> + <artifactId>log4j-api</artifactId>
> + </dependency>
> + <!-- Classes and resources to be shaded into the core jar -->
> + <dependency>
> + <groupId>org.apache.logging.log4j</groupId>
> + <artifactId>log4j-plugins-java9</artifactId>
> + <scope>provided</scope>
> + <type>zip</type>
> + </dependency>
> + <!-- Used for OSGi bundle support -->
> + <dependency>
> + <groupId>org.osgi</groupId>
> + <artifactId>org.osgi.core</artifactId>
> + <scope>provided</scope>
> + </dependency>
> +
> + <!-- TEST DEPENDENCIES -->
> +
> + <!-- Pull in useful test classes from API -->
> + <dependency>
> + <groupId>org.apache.logging.log4j</groupId>
> + <artifactId>log4j-api</artifactId>
> + <type>test-jar</type>
> + <scope>test</scope>
> + </dependency>
> + <dependency>
> + <groupId>junit</groupId>
> + <artifactId>junit</artifactId>
> + <scope>test</scope>
> + </dependency>
> + <dependency>
> + <groupId>org.hamcrest</groupId>
> + <artifactId>hamcrest-all</artifactId>
> + <scope>test</scope>
> + </dependency>
> + </dependencies>
> + <build>
> + <plugins>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-dependency-plugin</artifactId>
> + <version>3.0.2</version>
> + <executions>
> + <execution>
> + <id>unpack-classes</id>
> + <phase>prepare-package</phase>
> + <goals>
> + <goal>unpack</goal>
> + </goals>
> + <configuration>
> + <artifactItems>
> + <artifactItem>
> + <groupId>org.apache.logging.log4j</groupId>
> + <artifactId>log4j-plugins-java9</artifactId>
> + <version>${project.version}</version>
> + <type>zip</type>
> + <overWrite>false</overWrite>
> + </artifactItem>
> + </artifactItems>
> + <includes>**/*.class</includes>
> + <excludes>**/*.java</excludes>
> +
> <outputDirectory>${project.build.directory}</outputDirectory>
> + <overWriteReleases>false</overWriteReleases>
> + <overWriteSnapshots>true</overWriteSnapshots>
> + </configuration>
> + </execution>
> + </executions>
> + </plugin>
> + <plugin>
> + <artifactId>maven-compiler-plugin</artifactId>
> + <executions>
> + <execution>
> + <!-- disable annotation processing for first pass -->
> + <id>generate-plugins</id>
> + <phase>process-classes</phase>
> + <goals>
> + <goal>compile</goal>
> + </goals>
> + <configuration>
> + <excludes>
> + <exclude>module-info.java</exclude>
> + </excludes>
> + </configuration>
> + </execution>
> + <execution>
> + <!-- disable annotation processing for first pass -->
> + <id>generate-test-plugins</id>
> + <phase>generate-test-sources</phase>
> + <goals>
> + <goal>compile</goal>
> + </goals>
> + <configuration>
> + <excludes>
> + <exclude>module-info.java</exclude>
> + </excludes>
> + <proc>only</proc>
> + </configuration>
> + </execution>
> + <execution>
> + <!-- disable annotation processing for first pass -->
> + <id>default-compile</id>
> + <configuration>
> + <excludes>
> + <exclude>module-info.java</exclude>
> + </excludes>
> + <proc>none</proc>
> + </configuration>
> + </execution>
> + </executions>
> + </plugin>
> + <plugin>
> + <artifactId>maven-surefire-plugin</artifactId>
> + <configuration>
> + <excludedGroups>
> + org.apache.logging.log4j.categories.PerformanceTests
> + </excludedGroups>
> + <systemPropertyVariables>
> +
> <org.apache.activemq.SERIALIZABLE_PACKAGES>*</org.apache.activemq.SERIALIZABLE_PACKAGES>
> + </systemPropertyVariables>
> + </configuration>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-failsafe-plugin</artifactId>
> + <configuration>
> + <skipTests>true</skipTests>
> + </configuration>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-jar-plugin</artifactId>
> + <executions>
> + <execution>
> + <id>default-jar</id>
> + <goals>
> + <goal>jar</goal>
> + </goals>
> + <configuration combine.self="override">
> + <archive>
> + <manifestFile>${manifestfile}</manifestFile>
> + <manifestEntries>
> + <Specification-Title>${project.name
> }</Specification-Title>
> +
> <Specification-Version>${project.version}</Specification-Version>
> + <Specification-Vendor>${project.organization.name
> }</Specification-Vendor>
> + <Implementation-Title>${project.name
> }</Implementation-Title>
> +
> <Implementation-Version>${project.version}</Implementation-Version>
> + <Implementation-Vendor>${project.organization.name
> }</Implementation-Vendor>
> +
> <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
> +
> <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
> +
> <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
> +
> <Automatic-Module-Name>org.apache.logging.log4j.plugins</Automatic-Module-Name>
> + <Multi-Release>true</Multi-Release>
> + </manifestEntries>
> + </archive>
> + </configuration>
> + </execution>
> + <execution>
> + <id>default</id>
> + <goals>
> + <goal>test-jar</goal>
> + </goals>
> + <configuration>
> + <archive>
> + <manifestFile>${manifestfile}</manifestFile>
> + <manifestEntries>
> + <Specification-Title>${project.name
> }</Specification-Title>
> +
> <Specification-Version>${project.version}</Specification-Version>
> + <Specification-Vendor>${project.organization.name
> }</Specification-Vendor>
> + <Implementation-Title>${project.name
> }</Implementation-Title>
> +
> <Implementation-Version>${project.version}</Implementation-Version>
> + <Implementation-Vendor>${project.organization.name
> }</Implementation-Vendor>
> +
> <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
> +
> <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
> +
> <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
> + </manifestEntries>
> + </archive>
> + </configuration>
> + </execution>
> + </executions>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.felix</groupId>
> + <artifactId>maven-bundle-plugin</artifactId>
> + <configuration>
> + <instructions>
> +
> <Bundle-SymbolicName>org.apache.logging.log4j.plugins</Bundle-SymbolicName>
> + <!-- TODO: exclude internal classes from export -->
> +
> <Export-Package>org.apache.logging.log4j.plugins.*</Export-Package>
> + <Import-Package>
> + sun.reflect;resolution:=optional,
> + org.apache.logging.log4j.util,
> + *
> + </Import-Package>
> +
> <Bundle-Activator>org.apache.logging.log4j.plugins.osgi.Activator</Bundle-Activator>
> + </instructions>
> + </configuration>
> + </plugin>
> + </plugins>
> + </build>
> + <reporting>
> + <plugins>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-changes-plugin</artifactId>
> + <version>${changes.plugin.version}</version>
> + <reportSets>
> + <reportSet>
> + <reports>
> + <report>changes-report</report>
> + </reports>
> + </reportSet>
> + </reportSets>
> + <configuration>
> +
> <issueLinkTemplate>%URL%/show_bug.cgi?id=%ISSUE%</issueLinkTemplate>
> + <useJql>true</useJql>
> + </configuration>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-checkstyle-plugin</artifactId>
> + <version>${checkstyle.plugin.version}</version>
> + <configuration>
> +
> <!--<propertiesLocation>${vfs.parent.dir}/checkstyle.properties</propertiesLocation>
> -->
> +
> <configLocation>${log4jParentDir}/checkstyle.xml</configLocation>
> +
> <suppressionsLocation>${log4jParentDir}/checkstyle-suppressions.xml</suppressionsLocation>
> + <enableRulesSummary>false</enableRulesSummary>
> + <propertyExpansion>basedir=${basedir}</propertyExpansion>
> +
> <propertyExpansion>licensedir=${log4jParentDir}/checkstyle-header.txt</propertyExpansion>
> + </configuration>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-javadoc-plugin</artifactId>
> + <version>${javadoc.plugin.version}</version>
> + <configuration>
> + <failOnError>false</failOnError>
> + <bottom><![CDATA[<p align="center">Copyright ©
> {inceptionYear}-{currentYear} {organizationName}. All Rights Reserved.<br />
> + Apache Logging, Apache Log4j, Log4j, Apache, the Apache
> feather logo, the Apache Logging project logo,
> + and the Apache Log4j logo are trademarks of The Apache
> Software Foundation.</p>]]></bottom>
> + <!-- module link generation is completely broken in the javadoc
> plugin for a multi-module non-aggregating
> + project -->
> + <additionalparam>${javadoc.opts}</additionalparam>
> + <detectOfflineLinks>false</detectOfflineLinks>
> + <linksource>true</linksource>
> + <links>
> + <link>http://docs.oracle.com/javaee/6/api/</link>
> + <link>http://www.osgi.org/javadoc/r4v43/core/</link>
> + <link>
> https://commons.apache.org/proper/commons-lang/javadocs/api-release/
> </link>
> + </links>
> + <groups>
> + <group>
> + <title>Core API</title>
> + <packages>org.apache.logging.log4j.core</packages>
> + </group>
> + <group>
> + <title>Configuration</title>
> +
> <packages>org.apache.logging.log4j.core.config*:org.apache.logging.log4j.core.selector</packages>
> + </group>
> + <group>
> + <title>Core Plugins</title>
> +
> <packages>org.apache.logging.log4j.core.appender*:org.apache.logging.log4j.core.filter:org.apache.logging.log4j.core.layout:org.apache.logging.log4j.core.lookup:org.apache.logging.log4j.core.pattern:org.apache.logging.log4j.core.script</packages>
> + </group>
> + <group>
> + <title>Tools</title>
> + <packages>org.apache.logging.log4j.core.net
> *:org.apache.logging.log4j.core.tools</packages>
> + </group>
> + <group>
> + <title>Internals</title>
> +
> <packages>org.apache.logging.log4j.core.async:org.apache.logging.log4j.core.impl:org.apache.logging.log4j.core.util*:org.apache.logging.log4j.core.osgi:org.apache.logging.log4j.core.jackson:org.apache.logging.log4j.core.jmx</packages>
> + </group>
> + </groups>
> + </configuration>
> + <reportSets>
> + <reportSet>
> + <id>non-aggregate</id>
> + <reports>
> + <report>javadoc</report>
> + </reports>
> + </reportSet>
> + </reportSets>
> + </plugin>
> + <plugin>
> + <groupId>com.github.spotbugs</groupId>
> + <artifactId>spotbugs-maven-plugin</artifactId>
> + <configuration>
> + <fork>true</fork>
> + <jvmArgs>-Duser.language=en</jvmArgs>
> + <threshold>Normal</threshold>
> + <effort>Default</effort>
> +
> <excludeFilterFile>${log4jParentDir}/spotbugs-exclude-filter.xml</excludeFilterFile>
> + </configuration>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-jxr-plugin</artifactId>
> + <version>${jxr.plugin.version}</version>
> + <reportSets>
> + <reportSet>
> + <id>non-aggregate</id>
> + <reports>
> + <report>jxr</report>
> + </reports>
> + </reportSet>
> + <reportSet>
> + <id>aggregate</id>
> + <reports>
> + <report>aggregate</report>
> + </reports>
> + </reportSet>
> + </reportSets>
> + </plugin>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-pmd-plugin</artifactId>
> + <version>${pmd.plugin.version}</version>
> + <configuration>
> + <targetJdk>${maven.compiler.target}</targetJdk>
> + </configuration>
> + </plugin>
> + </plugins>
> + </reporting>
> +</project>
> +
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
> similarity index 97%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
> index c92c904..22fd9bf 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
> @@ -14,15 +14,15 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config;
> +package org.apache.logging.log4j.plugins;
> +
> +import org.apache.logging.log4j.plugins.util.PluginType;
>
> import java.util.ArrayList;
> import java.util.HashMap;
> import java.util.List;
> import java.util.Map;
>
> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
> -
> /**
> * A Configuration node.
> */
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
> similarity index 97%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
> index 8aaf117..348754f 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
> @@ -14,7 +14,9 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
> +
> +import org.apache.logging.log4j.util.Strings;
>
> import java.lang.annotation.Documented;
> import java.lang.annotation.ElementType;
> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
>
> -import org.apache.logging.log4j.util.Strings;
> -
> /**
> * Annotation that identifies a Class as a Plugin.
> */
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
> similarity index 87%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
> index 7be3dea..4dce103 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
> @@ -14,7 +14,7 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
>
> import java.lang.annotation.Documented;
> import java.lang.annotation.ElementType;
> @@ -23,7 +23,7 @@ import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
>
> /**
> - * Identifies a list of aliases for a {@link Plugin}, {@link
> PluginAttribute}, or {@link PluginBuilderAttribute}.
> + * Identifies a list of aliases for a Plugin, PluginAttribute, or
> PluginBuilderAttribute.
> */
> @Documented
> @Retention(RetentionPolicy.RUNTIME)
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
> similarity index 96%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
> index bd88220..b9d4684 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
> @@ -14,7 +14,10 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
> +
> +import org.apache.logging.log4j.plugins.visitors.PluginAttributeVisitor;
> +import org.apache.logging.log4j.util.Strings;
>
> import java.lang.annotation.Documented;
> import java.lang.annotation.ElementType;
> @@ -22,9 +25,6 @@ import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
>
> -import
> org.apache.logging.log4j.core.config.plugins.visitors.PluginAttributeVisitor;
> -import org.apache.logging.log4j.util.Strings;
> -
> /**
> * Identifies a Plugin Attribute and its default value. Note that only
> one of the defaultFoo attributes will be
> * used based on the type this annotation is attached to. Thus, for
> primitive types, the default<i>Type</i>
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
> similarity index 92%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
> index 675d78f..c7fce2f 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
> @@ -15,7 +15,10 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
> +
> +import
> org.apache.logging.log4j.plugins.visitors.PluginBuilderAttributeVisitor;
> +import org.apache.logging.log4j.util.Strings;
>
> import java.lang.annotation.Documented;
> import java.lang.annotation.ElementType;
> @@ -23,9 +26,6 @@ import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
>
> -import
> org.apache.logging.log4j.core.config.plugins.visitors.PluginBuilderAttributeVisitor;
> -import org.apache.logging.log4j.util.Strings;
> -
> /**
> * Marks a field as a Plugin Attribute.
> */
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
> similarity index 95%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
> index 4e69262..035b025 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
> @@ -15,7 +15,7 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
>
> import java.lang.annotation.Documented;
> import java.lang.annotation.ElementType;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
> similarity index 91%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
> index 7ea358b..6cfb6fa 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
> @@ -14,7 +14,9 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
> +
> +import org.apache.logging.log4j.plugins.visitors.PluginElementVisitor;
>
> import java.lang.annotation.Documented;
> import java.lang.annotation.ElementType;
> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
>
> -import
> org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor;
> -
> /**
> * Identifies a parameter as a Plugin and corresponds with an XML element
> (or equivalent) in configuration files.
> */
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
> similarity index 96%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
> index 1c04106..b071510 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
> @@ -14,7 +14,7 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
>
> import java.lang.annotation.Documented;
> import java.lang.annotation.ElementType;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
> similarity index 90%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
> index d60f1b5..b172268 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
> @@ -14,7 +14,9 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
> +
> +import org.apache.logging.log4j.plugins.visitors.PluginNodeVisitor;
>
> import java.lang.annotation.Documented;
> import java.lang.annotation.ElementType;
> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
>
> -import
> org.apache.logging.log4j.core.config.plugins.visitors.PluginNodeVisitor;
> -
> /**
> * Identifies a Plugin configuration Node.
> */
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
> similarity index 91%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
> index 9c20cc2..31e5a23 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
> @@ -14,7 +14,9 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
> +
> +import org.apache.logging.log4j.plugins.visitors.PluginValueVisitor;
>
> import java.lang.annotation.Documented;
> import java.lang.annotation.ElementType;
> @@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
>
> -import
> org.apache.logging.log4j.core.config.plugins.visitors.PluginValueVisitor;
> -
> /**
> * Identifies a parameter as a value. These correspond with property
> values generally, but are meant as values to be
> * used as a placeholder value somewhere.
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
> similarity index 89%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
> index 65fcb76..093cc50 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
> @@ -15,7 +15,9 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins;
> +package org.apache.logging.log4j.plugins;
> +
> +import org.apache.logging.log4j.plugins.visitors.PluginVisitor;
>
> import java.lang.annotation.Annotation;
> import java.lang.annotation.Documented;
> @@ -24,8 +26,6 @@ import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
>
> -import
> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor;
> -
> /**
> * Meta-annotation to denote the class name to use that implements
> * {@link
> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor} for
> the annotated annotation.
> @@ -40,5 +40,5 @@ public @interface PluginVisitorStrategy {
> * for the given annotation. The generic type in {@code
> PluginVisitor} should match the annotation this annotation
> * is applied to.
> */
> - Class<? extends PluginVisitor<? extends Annotation>> value();
> + Class<? extends PluginVisitor<? extends Annotation, ?>> value();
> }
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
> similarity index 95%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
> copy to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
> index 15a162c..fd8012a 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
> @@ -14,7 +14,7 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.convert;
> +package org.apache.logging.log4j.plugins.convert;
>
> import org.apache.logging.log4j.util.EnglishEnums;
>
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
> similarity index 95%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
> index e629657..f9037b3 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
> @@ -14,7 +14,7 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.convert;
> +package org.apache.logging.log4j.plugins.convert;
>
> /**
> * Converts Strings to hex. This is used in place of
> java.xml.bind.DataTypeConverter which is not available by
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
> similarity index 95%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
> index e67e213..aaa5b4d 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
> @@ -15,7 +15,7 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.convert;
> +package org.apache.logging.log4j.plugins.convert;
>
> /**
> * Interface for doing automatic String conversion to a specific type.
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
> similarity index 92%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
> index 5088f15..fb5b27e 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
> @@ -14,7 +14,14 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.convert;
> +package org.apache.logging.log4j.plugins.convert;
> +
> +import org.apache.logging.log4j.Logger;
> +import org.apache.logging.log4j.plugins.util.PluginManager;
> +import org.apache.logging.log4j.plugins.util.PluginType;
> +import org.apache.logging.log4j.plugins.util.TypeUtil;
> +import org.apache.logging.log4j.util.ReflectionUtil;
> +import org.apache.logging.log4j.status.StatusLogger;
>
> import java.lang.reflect.ParameterizedType;
> import java.lang.reflect.Type;
> @@ -25,13 +32,6 @@ import java.util.UnknownFormatConversionException;
> import java.util.concurrent.ConcurrentHashMap;
> import java.util.concurrent.ConcurrentMap;
>
> -import org.apache.logging.log4j.Logger;
> -import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
> -import org.apache.logging.log4j.core.util.ReflectionUtil;
> -import org.apache.logging.log4j.core.util.TypeUtil;
> -import org.apache.logging.log4j.status.StatusLogger;
> -
> /**
> * Registry for {@link TypeConverter} plugins.
> *
> @@ -152,7 +152,12 @@ public class TypeConverterRegistry {
> }
>
> private void registerTypeAlias(final Type knownType, final Type
> aliasType) {
> - registry.putIfAbsent(aliasType, registry.get(knownType));
> + TypeConverter<?> converter = registry.get(knownType);
> + if (converter != null) {
> + registry.putIfAbsent(aliasType, converter);
> + } else {
> + LOGGER.error("Cannot locate converter for {}", knownType);
> + }
> }
>
> }
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
> similarity index 92%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
> index dc833f0..7a71b4a 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
> @@ -15,32 +15,27 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.convert;
> +package org.apache.logging.log4j.plugins.convert;
> +
> +import org.apache.logging.log4j.Level;
> +import org.apache.logging.log4j.Logger;
> +import org.apache.logging.log4j.plugins.Plugin;
> +import org.apache.logging.log4j.status.StatusLogger;
> +import org.apache.logging.log4j.util.LoaderUtil;
>
> import java.io.File;
> import java.math.BigDecimal;
> import java.math.BigInteger;
> -import java.net.InetAddress;
> -import java.net.MalformedURLException;
> -import java.net.URI;
> -import java.net.URISyntaxException;
> -import java.net.URL;
> +import java.net.*;
> import java.nio.charset.Charset;
> import java.nio.file.Path;
> import java.nio.file.Paths;
> import java.security.Provider;
> import java.security.Security;
> +import java.util.Base64;
> import java.util.UUID;
> import java.util.regex.Pattern;
>
> -import org.apache.logging.log4j.Level;
> -import org.apache.logging.log4j.Logger;
> -import org.apache.logging.log4j.core.appender.rolling.action.Duration;
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import org.apache.logging.log4j.core.util.CronExpression;
> -import org.apache.logging.log4j.status.StatusLogger;
> -import org.apache.logging.log4j.util.LoaderUtil;
> -
> /**
> * Collection of basic TypeConverter implementations. May be used to
> register additional TypeConverters or find
> * registered TypeConverters.
> @@ -56,6 +51,8 @@ public final class TypeConverters {
> */
> public static final String CATEGORY = "TypeConverter";
>
> + private static final Base64.Decoder decoder = Base64.getDecoder();
> +
> /**
> * Parses a {@link String} into a {@link BigDecimal}.
> */
> @@ -112,7 +109,7 @@ public final class TypeConverters {
> bytes = new byte[0];
> } else if (value.startsWith(PREFIX_BASE64)) {
> final String lexicalXSDBase64Binary =
> value.substring(PREFIX_BASE64.length());
> - bytes =
> Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
> + bytes = decoder.decode(lexicalXSDBase64Binary);
> } else if (value.startsWith(PREFIX_0x)) {
> final String lexicalXSDHexBinary =
> value.substring(PREFIX_0x.length());
> bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
> @@ -203,14 +200,6 @@ public final class TypeConverters {
> }
> }
>
> - @Plugin(name = "CronExpression", category = CATEGORY)
> - public static class CronExpressionConverter implements
> TypeConverter<CronExpression> {
> - @Override
> - public CronExpression convert(final String s) throws Exception {
> - return new CronExpression(s);
> - }
> - }
> -
> /**
> * Converts a {@link String} into a {@link Double}.
> */
> @@ -223,18 +212,6 @@ public final class TypeConverters {
> }
>
> /**
> - * Converts a {@link String} into a {@link Duration}.
> - * @since 2.5
> - */
> - @Plugin(name = "Duration", category = CATEGORY)
> - public static class DurationConverter implements
> TypeConverter<Duration> {
> - @Override
> - public Duration convert(final String s) {
> - return Duration.parse(s);
> - }
> - }
> -
> - /**
> * Converts a {@link String} into a {@link File}.
> */
> @Plugin(name = "File", category = CATEGORY)
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
> similarity index 80%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
> index f22ba49..958beb4 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
> @@ -16,8 +16,7 @@
> */
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * TypeConverter plugins for converter strings into various types. These
> plugins are used for parsing plugin
> + * attributes in plugin factory methods.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +package org.apache.logging.log4j.plugins.convert;
> diff --git
> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
> new file mode 100644
> index 0000000..518bee7
> --- /dev/null
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
> @@ -0,0 +1,103 @@
> +/*
> + * 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.plugins.osgi;
> +
> +import org.apache.logging.log4j.LogManager;
> +import org.apache.logging.log4j.Logger;
> +import org.apache.logging.log4j.plugins.processor.PluginService;
> +import org.apache.logging.log4j.plugins.util.PluginRegistry;
> +import org.apache.logging.log4j.spi.Provider;
> +import org.apache.logging.log4j.status.StatusLogger;
> +import org.apache.logging.log4j.util.PropertiesUtil;
> +import org.osgi.framework.*;
> +import org.osgi.framework.wiring.BundleWiring;
> +
> +import java.util.Hashtable;
> +import java.util.concurrent.atomic.AtomicReference;
> +
> +/**
> + * OSGi BundleActivator.
> + */
> +public final class Activator implements BundleActivator,
> SynchronousBundleListener {
> +
> + private static final Logger LOGGER = StatusLogger.getLogger();
> +
> + private final AtomicReference<BundleContext> contextRef = new
> AtomicReference<>();
> +
> + ServiceRegistration provideRegistration = null;
> +
> + @Override
> + public void start(final BundleContext context) throws Exception {
> + final PluginService pluginService = new Log4jProvider();
> + final Hashtable<String, String> props = new Hashtable<>();
> + props.put("APIVersion", "3.0");
> + provideRegistration =
> context.registerService(pluginService.class.getName(), provider, props);
> + if (this.contextRef.compareAndSet(null, context)) {
> + context.addBundleListener(this);
> + // done after the BundleListener as to not miss any new
> bundle installs in the interim
> + scanInstalledBundlesForPlugins(context);
> + }
> + }
> +
> + private static void scanInstalledBundlesForPlugins(final
> BundleContext context) {
> + final Bundle[] bundles = context.getBundles();
> + for (final Bundle bundle : bundles) {
> + // TODO: bundle state can change during this
> + scanBundleForPlugins(bundle);
> + }
> + }
> +
> + private static void scanBundleForPlugins(final Bundle bundle) {
> + final long bundleId = bundle.getBundleId();
> + // LOG4J2-920: don't scan system bundle for plugins
> + if (bundle.getState() == Bundle.ACTIVE && bundleId != 0) {
> + LOGGER.trace("Scanning bundle [{}, id=%d] for plugins.",
> bundle.getSymbolicName(), bundleId);
> + PluginRegistry.getInstance().loadFromBundle(bundleId,
> + bundle.adapt(BundleWiring.class).getClassLoader());
> + }
> + }
> +
> + private static void stopBundlePlugins(final Bundle bundle) {
> + LOGGER.trace("Stopping bundle [{}] plugins.",
> bundle.getSymbolicName());
> + // TODO: plugin lifecycle code
> +
> PluginRegistry.getInstance().clearBundlePlugins(bundle.getBundleId());
> + }
> +
> + @Override
> + public void stop(final BundleContext context) throws Exception {
> + provideRegistration.unregister();
> + this.contextRef.compareAndSet(context, null);
> + }
> +
> + @Override
> + public void bundleChanged(final BundleEvent event) {
> + switch (event.getType()) {
> + // FIXME: STARTING instead of STARTED?
> + case BundleEvent.STARTED:
> + scanBundleForPlugins(event.getBundle());
> + break;
> +
> + case BundleEvent.STOPPING:
> + stopBundlePlugins(event.getBundle());
> + break;
> +
> + default:
> + break;
> + }
> + }
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
> similarity index 87%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
> index f22ba49..37dadd4 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
> @@ -16,8 +16,6 @@
> */
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * Collection of OSGi-specific classes for bundles.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +package org.apache.logging.log4j.plugins.osgi;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
> similarity index 87%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
> index f22ba49..b161185 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
> @@ -16,8 +16,6 @@
> */
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * Annotations for Log4j 2 plugins.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +package org.apache.logging.log4j.plugins;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
> similarity index 71%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
> index 2fd4160..784dece 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
> @@ -15,7 +15,7 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.processor;
> +package org.apache.logging.log4j.plugins.processor;
>
> import java.io.BufferedInputStream;
> import java.io.BufferedOutputStream;
> @@ -60,34 +60,6 @@ public class PluginCache {
> }
>
> /**
> - * 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) 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());
> - }
> - }
> - }
> - }
> -
> - /**
> * Loads and merges all the Log4j plugin cache files specified.
> Usually, this is obtained via a ClassLoader.
> *
> * @param resources URLs to all the desired plugin cache files to
> load.
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
> similarity index 85%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
> index dd43601..bd452d3 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
> @@ -15,7 +15,7 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.processor;
> +package org.apache.logging.log4j.plugins.processor;
>
> import java.io.Serializable;
>
> @@ -32,6 +32,18 @@ public class PluginEntry implements Serializable {
> private boolean defer;
> private transient String category;
>
> + public PluginEntry() {
> + }
> +
> + public PluginEntry(String key, String className, String name, boolean
> printable, boolean defer, String category) {
> + this.key = key;
> + this.className = className;
> + this.name = name;
> + this.printable = printable;
> + this.defer = defer;
> + this.category = category;
> + }
> +
> public String getKey() {
> return key;
> }
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
> similarity index 54%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
> index 2f3b53f..975d2ab 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
> @@ -15,38 +15,47 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.processor;
> +package org.apache.logging.log4j.plugins.processor;
> +
> +import org.apache.logging.log4j.LoggingException;
> +import org.apache.logging.log4j.plugins.Plugin;
> +import org.apache.logging.log4j.plugins.PluginAliases;
> +import org.apache.logging.log4j.util.Strings;
>
> -import java.io.IOException;
> -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;
> import javax.annotation.processing.AbstractProcessor;
> +import javax.annotation.processing.Messager;
> import javax.annotation.processing.RoundEnvironment;
> import javax.annotation.processing.SupportedAnnotationTypes;
> import javax.lang.model.SourceVersion;
> import javax.lang.model.element.Element;
> import javax.lang.model.element.ElementVisitor;
> +import javax.lang.model.element.Name;
> import javax.lang.model.element.TypeElement;
> import javax.lang.model.util.Elements;
> import javax.lang.model.util.SimpleElementVisitor7;
> import javax.tools.Diagnostic.Kind;
> import javax.tools.FileObject;
> +import javax.tools.JavaFileObject;
> import javax.tools.StandardLocation;
> +import java.io.BufferedWriter;
> +import java.io.IOException;
> +import java.io.OutputStreamWriter;
> +import java.io.PrintWriter;
> +import java.util.ArrayList;
> +import java.util.Collection;
> +import java.util.Collections;
> +import java.util.List;
> +import java.util.Locale;
> +import java.util.Map;
> +import java.util.Objects;
> +import java.util.Set;
>
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
> -import org.apache.logging.log4j.util.Strings;
> +import static java.nio.charset.StandardCharsets.UTF_8;
>
> /**
> * Annotation processor for pre-scanning Log4j 2 plugins.
> */
>
> -@SupportedAnnotationTypes("org.apache.logging.log4j.core.config.plugins.*")
> +@SupportedAnnotationTypes({"org.apache.logging.log4j.plugins.*",
> "org.apache.logging.log4j.core.config.plugins.*"})
> public class PluginProcessor extends AbstractProcessor {
>
> // TODO: this could be made more abstract to allow for compile-time
> and run-time plugin processing
> @@ -57,8 +66,8 @@ public class PluginProcessor extends AbstractProcessor {
> */
> public static final String PLUGIN_CACHE_FILE =
>
> "META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat";
> -
> - private final PluginCache pluginCache = new PluginCache();
> + private static final String SERVICE_FILE_NAME =
> +
> "META-INF/services/org.apache.logging.log4j.plugins.processor.PluginService";
>
> @Override
> public SourceVersion getSupportedSourceVersion() {
> @@ -67,16 +76,21 @@ public class PluginProcessor extends AbstractProcessor
> {
>
> @Override
> public boolean process(final Set<? extends TypeElement> annotations,
> final RoundEnvironment roundEnv) {
> - System.out.println("Processing annotations");
> + Map<String, String> options = processingEnv.getOptions();
> + String packageName = options.get("pluginPackage");
> + Messager messager = processingEnv.getMessager();
> + messager.printMessage(Kind.NOTE, "Processing Log4j annotations");
> try {
> final Set<? extends Element> elements =
> roundEnv.getElementsAnnotatedWith(Plugin.class);
> if (elements.isEmpty()) {
> - System.out.println("No elements to process");
> + messager.printMessage(Kind.NOTE, "No elements to
> process");
> return false;
> }
> - collectPlugins(elements);
> - writeCacheFile(elements.toArray(new
> Element[elements.size()]));
> - System.out.println("Annotations processed");
> + List<PluginEntry> list = new ArrayList<>();
> + packageName = collectPlugins(packageName, elements, list);
> + writeClassFile(packageName, list);
> + writeServiceFile(packageName);
> + messager.printMessage(Kind.NOTE, "Annotations processed");
> return true;
> } catch (final IOException e) {
> e.printStackTrace();
> @@ -93,7 +107,8 @@ public class PluginProcessor extends AbstractProcessor {
> processingEnv.getMessager().printMessage(Kind.ERROR, message);
> }
>
> - private void collectPlugins(final Iterable<? extends Element>
> elements) {
> + private String collectPlugins(String packageName, final Iterable<?
> extends Element> elements, List<PluginEntry> list) {
> + boolean calculatePackage = packageName == null;
> final Elements elementUtils = processingEnv.getElementUtils();
> final ElementVisitor<PluginEntry, Plugin> pluginVisitor = new
> PluginElementVisitor(elementUtils);
> final ElementVisitor<Collection<PluginEntry>, Plugin>
> pluginAliasesVisitor = new PluginAliasesElementVisitor(
> @@ -104,23 +119,93 @@ public class PluginProcessor extends
> AbstractProcessor {
> continue;
> }
> final PluginEntry entry = element.accept(pluginVisitor,
> plugin);
> - final Map<String, PluginEntry> category =
> pluginCache.getCategory(entry.getCategory());
> - category.put(entry.getKey(), entry);
> + list.add(entry);
> + if (calculatePackage) {
> + packageName = calculatePackage(elementUtils, element,
> packageName);
> + }
> final Collection<PluginEntry> entries =
> element.accept(pluginAliasesVisitor, plugin);
> for (final PluginEntry pluginEntry : entries) {
> - category.put(pluginEntry.getKey(), pluginEntry);
> + list.add(pluginEntry);
> }
> }
> + return packageName;
> }
>
> - private void writeCacheFile(final Element... elements) throws
> IOException {
> + private String calculatePackage(Elements elements, Element element,
> String packageName) {
> + Name name = elements.getPackageOf(element).getQualifiedName();
> + if (name == null) {
> + return null;
> + }
> + String pkgName = name.toString();
> + if (packageName == null) {
> + return pkgName;
> + }
> + if (pkgName.length() == packageName.length()) {
> + return packageName;
> + }
> + if (pkgName.length() < packageName.length() &&
> packageName.startsWith(pkgName)) {
> + return pkgName;
> + }
> +
> + return commonPrefix(pkgName, packageName);
> + }
> +
> + private void writeServiceFile(String pkgName) 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);
> + SERVICE_FILE_NAME);
> + try (final PrintWriter writer = new PrintWriter(new
> BufferedWriter(new OutputStreamWriter(fileObject.openOutputStream(),
> UTF_8)))) {
> + writer.println(createFqcn(pkgName));
> + }
> + }
> +
> + private void writeClassFile(String pkg, List<PluginEntry> list) {
> + String fqcn = createFqcn(pkg);
> + try (final PrintWriter writer = createSourceFile(fqcn)) {
> + writer.println("package " + pkg + ".plugins;");
> + writer.println("");
> + writer.println("import
> org.apache.logging.log4j.plugins.processor.PluginEntry;");
> + writer.println("import
> org.apache.logging.log4j.plugins.processor.PluginService;");
> + writer.println("");
> + writer.println("public class Log4jPlugins extends
> PluginService {");
> + writer.println("");
> + writer.println(" private static PluginEntry[] entries =
> new PluginEntry[] {");
> + StringBuilder sb = new StringBuilder();
> + int max = list.size() - 1;
> + for (int i = 0; i < list.size(); ++i) {
> + PluginEntry entry = list.get(i);
> + sb.append(" ").append("new PluginEntry(\"");
> + sb.append(entry.getKey()).append("\", \"");
> + sb.append(entry.getClassName()).append("\", \"");
> + sb.append(entry.getName()).append("\", ");
> + sb.append(entry.isPrintable()).append(", ");
> + sb.append(entry.isDefer()).append(", \"");
> + sb.append(entry.getCategory()).append("\")");
> + if (i < max) {
> + sb.append(",");
> + }
> + writer.println(sb.toString());
> + sb.setLength(0);
> + }
> + writer.println(" };");
> + writer.println(" @Override");
> + writer.println(" public PluginEntry[] getEntries() {
> return entries;}");
> + writer.println("}");
> }
> }
>
> + private PrintWriter createSourceFile(String fqcn) {
> + try {
> + JavaFileObject sourceFile =
> processingEnv.getFiler().createSourceFile(fqcn);
> + return new PrintWriter(sourceFile.openWriter());
> + } catch (IOException e) {
> + throw new LoggingException("Unable to create Plugin Service
> Class " + fqcn, e);
> + }
> + }
> +
> + private String createFqcn(String packageName) {
> + return packageName + ".plugins.Log4jPlugins";
> + }
> +
> /**
> * ElementVisitor to scan the Plugin annotation.
> */
> @@ -146,6 +231,20 @@ public class PluginProcessor extends
> AbstractProcessor {
> }
> }
>
> + private String commonPrefix(String str1, String str2) {
> + int minLength = str1.length() < str2.length() ? str1.length() :
> str2.length();
> + for (int i = 0; i < minLength; i++) {
> + if (str1.charAt(i) != str2.charAt(i)) {
> + if (i > 1 && str1.charAt(i-1) == '.') {
> + return str1.substring(0, i-1);
> + } else {
> + return str1.substring(0, i);
> + }
> + }
> + }
> + return str1.substring(0, minLength);
> + }
> +
> /**
> * ElementVisitor to scan the PluginAliases annotation.
> */
> diff --git
> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
> new file mode 100644
> index 0000000..5042456
> --- /dev/null
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
> @@ -0,0 +1,56 @@
> +/*
> + * 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.plugins.processor;
> +
> +import java.util.Collections;
> +import java.util.LinkedHashMap;
> +import java.util.Map;
> +
> +/**
> + * Class Description goes here.
> + */
> +public abstract class PluginService {
> +
> + private final Map<String, Map<String, PluginEntry>> categories = new
> LinkedHashMap<>();
> +
> + public PluginService() {
> + PluginEntry[] entries = getEntries();
> + for (PluginEntry entry : entries) {
> + String category = entry.getCategory().toLowerCase();
> + if (!categories.containsKey(category)) {
> + categories.put(category, new LinkedHashMap<>());
> + }
> + Map<String, PluginEntry> map = categories.get(category);
> + map.put(entry.getKey(), entry);
> + }
> + }
> +
> + public abstract PluginEntry[] getEntries();
> +
> + public Map<String, Map<String, PluginEntry>> getCategories() {
> + return Collections.unmodifiableMap(categories);
> + }
> +
> + public Map<String, PluginEntry> getCategory(String category) {
> + return
> Collections.unmodifiableMap(categories.get(category.toLowerCase()));
> + }
> +
> + public long size() {
> + return categories.size();
> + }
> +
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
> similarity index 94%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
> copy to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
> index 4f6ddda..2c296f9 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
> @@ -19,4 +19,4 @@
> * Java annotation processor for pre-scanning Log4j 2 plugins. This is
> provided as an alternative to using the
> * executable {@link
> org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in
> your build process.
> */
> -package org.apache.logging.log4j.core.config.plugins.processor;
> +package org.apache.logging.log4j.plugins.processor;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
> similarity index 93%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
> index 0935ce8..ec8a07f 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
> @@ -15,7 +15,7 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.util;
> +package org.apache.logging.log4j.plugins.util;
>
> /**
> * A type of builder that can be used to configure and create a instances
> using a Java DSL instead of
> @@ -25,7 +25,7 @@ package org.apache.logging.log4j.core.util;
> * <p>
> * When creating <em>plugin</em> builders, it is customary to create
> the builder class as a public static inner class
> * called {@code Builder}. For instance, the builder class for
> - * {@link org.apache.logging.log4j.core.layout.PatternLayout
> PatternLayout} would be
> + * org.apache.logging.log4j.core.layout.PatternLayout PatternLayout
> would be
> * {@code PatternLayout.Builder}.
> * </p>
> *
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
> similarity index 96%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
> index 6f38d0e..b6f02f5 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
> @@ -15,17 +15,13 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.util;
> +package org.apache.logging.log4j.plugins.util;
>
> import org.apache.logging.log4j.Logger;
> import org.apache.logging.log4j.status.StatusLogger;
> import org.apache.logging.log4j.util.Strings;
>
> -import java.util.Collection;
> -import java.util.HashMap;
> -import java.util.LinkedHashMap;
> -import java.util.List;
> -import java.util.Map;
> +import java.util.*;
> import java.util.concurrent.CopyOnWriteArrayList;
>
> /**
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
> similarity index 81%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
> index 99fa610..9e8c6e2 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
> @@ -15,32 +15,28 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.util;
> +package org.apache.logging.log4j.plugins.util;
> +
> +import org.apache.logging.log4j.Logger;
> +import org.apache.logging.log4j.plugins.Plugin;
> +import org.apache.logging.log4j.plugins.PluginAliases;
> +import org.apache.logging.log4j.plugins.processor.PluginCache;
> +import org.apache.logging.log4j.plugins.processor.PluginEntry;
> +import org.apache.logging.log4j.plugins.processor.PluginProcessor;
> +import org.apache.logging.log4j.plugins.processor.PluginService;
> +import org.apache.logging.log4j.status.StatusLogger;
> +import org.apache.logging.log4j.util.LoaderUtil;
> +import org.apache.logging.log4j.util.Strings;
>
> import java.io.IOException;
> import java.net.URI;
> import java.net.URL;
> import java.text.DecimalFormat;
> -import java.util.ArrayList;
> -import java.util.Collections;
> -import java.util.Enumeration;
> -import java.util.HashMap;
> -import java.util.List;
> -import java.util.Map;
> +import java.util.*;
> import java.util.concurrent.ConcurrentHashMap;
> import java.util.concurrent.ConcurrentMap;
> import java.util.concurrent.atomic.AtomicReference;
>
> -import org.apache.logging.log4j.Logger;
> -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;
> -import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
> -import
> org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor;
> -import org.apache.logging.log4j.core.util.Loader;
> -import org.apache.logging.log4j.status.StatusLogger;
> -import org.apache.logging.log4j.util.Strings;
> -
> /**
> * Registry singleton for PluginType maps partitioned by source type and
> then by category names.
> */
> @@ -116,7 +112,8 @@ public class PluginRegistry {
> // already loaded
> return existing;
> }
> - final Map<String, List<PluginType<?>>> newPluginsByCategory =
> decodeCacheFiles(Loader.getClassLoader());
> + final Map<String, List<PluginType<?>>> newPluginsByCategory =
> decodeCacheFiles(LoaderUtil.getClassLoader());
> + loadPlugins(newPluginsByCategory);
>
> // Note multiple threads could be calling this method
> concurrently. Both will do the work,
> // but only one will be allowed to store the result in the
> AtomicReference.
> @@ -144,6 +141,7 @@ public class PluginRegistry {
> return existing;
> }
> final Map<String, List<PluginType<?>>> newPluginsByCategory =
> decodeCacheFiles(loader);
> + loadPlugins(loader, newPluginsByCategory);
>
> // Note multiple threads could be calling this method
> concurrently. Both will do the work,
> // but only one will be allowed to store the result in the outer
> map.
> @@ -155,6 +153,51 @@ public class PluginRegistry {
> return newPluginsByCategory;
> }
>
> + /**
> + * @since 3.0
> + */
> + public void loadPlugins(Map<String, List<PluginType<?>>> map) {
> + for (ClassLoader classLoader : LoaderUtil.getClassLoaders()) {
> + try {
> + loadPlugins(classLoader, map);
> + } catch (Throwable ex) {
> + LOGGER.debug("Unable to retrieve provider from
> ClassLoader {}", classLoader, ex);
> + }
> + }
> + }
> +
> + /**
> + * @since 3.0
> + */
> + public void loadPlugins(ClassLoader classLoader, Map<String,
> List<PluginType<?>>> map) {
> + final long startTime = System.nanoTime();
> + final ServiceLoader<PluginService> serviceLoader =
> ServiceLoader.load(PluginService.class, classLoader);
> + int pluginCount = 0;
> + for (final PluginService pluginService : serviceLoader) {
> + PluginEntry[] entries = pluginService.getEntries();
> + for (PluginEntry entry : entries) {
> + try {
> + final Class<?> clazz =
> classLoader.loadClass(entry.getClassName());
> + final PluginType<?> type = new PluginType(entry,
> clazz, entry.getName());
> + String category = entry.getCategory().toLowerCase();
> + if (!map.containsKey(category)) {
> + map.put(category, new ArrayList<>());
> + }
> + List<PluginType<?>> list = map.get(category);
> + list.add(type);
> + ++pluginCount;
> + } catch (final ClassNotFoundException e) {
> + LOGGER.info("Plugin [{}] could not be loaded due to
> missing classes.", entry.getClassName(), e);
> + }
> + }
> + }
> + final long endTime = System.nanoTime();
> + final DecimalFormat numFormat = new DecimalFormat("#0.000000");
> + final double seconds = (endTime - startTime) * 1e-9;
> + LOGGER.debug("Took {} seconds to load {} plugins from {}",
> + numFormat.format(seconds), pluginCount, classLoader);
> + }
> +
> private Map<String, List<PluginType<?>>> decodeCacheFiles(final
> ClassLoader loader) {
> final long startTime = System.nanoTime();
> final PluginCache cache = new PluginCache();
> @@ -214,7 +257,7 @@ public class PluginRegistry {
>
> final long startTime = System.nanoTime();
> final ResolverUtil resolver = new ResolverUtil();
> - final ClassLoader classLoader = Loader.getClassLoader();
> + final ClassLoader classLoader = LoaderUtil.getClassLoader();
> if (classLoader != null) {
> resolver.setClassLoader(classLoader);
> }
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
> similarity index 92%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
> index cc6bc66..c213f64 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
> @@ -14,16 +14,16 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.util;
> +package org.apache.logging.log4j.plugins.util;
>
>
> -import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
> +import org.apache.logging.log4j.plugins.processor.PluginEntry;
>
> /**
> * Plugin Descriptor. This is a memento object for Plugin annotations
> paired to their annotated classes.
> *
> * @param <T> The plug-in class, which can be any kind of class.
> - * @see org.apache.logging.log4j.core.config.plugins.Plugin
> + * @see org.apache.logging.log4j.plugins.Plugin
> */
> public class PluginType<T> {
>
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
> similarity index 97%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
> index 73b5fc0..a57356c 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
> @@ -14,33 +14,24 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.util;
> +package org.apache.logging.log4j.plugins.util;
>
> -import java.io.File;
> -import java.io.FileInputStream;
> -import java.io.IOException;
> -import java.io.InputStream;
> -import java.io.UnsupportedEncodingException;
> +import org.apache.logging.log4j.Logger;
> +import org.apache.logging.log4j.util.LoaderUtil;
> +import org.apache.logging.log4j.status.StatusLogger;
> +import org.osgi.framework.FrameworkUtil;
> +import org.osgi.framework.wiring.BundleWiring;
> +
> +import java.io.*;
> import java.net.URI;
> import java.net.URISyntaxException;
> import java.net.URL;
> import java.net.URLDecoder;
> import java.nio.charset.StandardCharsets;
> -import java.util.Arrays;
> -import java.util.Collection;
> -import java.util.Enumeration;
> -import java.util.HashSet;
> -import java.util.List;
> -import java.util.Set;
> +import java.util.*;
> import java.util.jar.JarEntry;
> import java.util.jar.JarInputStream;
>
> -import org.apache.logging.log4j.Logger;
> -import org.apache.logging.log4j.core.util.Loader;
> -import org.apache.logging.log4j.status.StatusLogger;
> -import org.osgi.framework.FrameworkUtil;
> -import org.osgi.framework.wiring.BundleWiring;
> -
> /**
> * <p>
> * ResolverUtil is used to locate classes that are available in the/a
> class path and meet arbitrary conditions. The two
> @@ -126,7 +117,7 @@ public class ResolverUtil {
> * @return the ClassLoader that will be used to scan for classes
> */
> public ClassLoader getClassLoader() {
> - return classloader != null ? classloader : (classloader =
> Loader.getClassLoader(ResolverUtil.class, null));
> + return classloader != null ? classloader : (classloader =
> LoaderUtil.getClassLoader(ResolverUtil.class, null));
> }
>
> /**
> diff --git
> a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
> new file mode 100644
> index 0000000..e2bb462
> --- /dev/null
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
> @@ -0,0 +1,217 @@
> +/*
> + * 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.plugins.util;
> +
> +import java.lang.reflect.*;
> +import java.util.ArrayList;
> +import java.util.List;
> +import java.util.Objects;
> +
> +/**
> + * Utility class for working with Java {@link Type}s and derivatives.
> This class is adapted heavily from the
> + * <a href="http://projects.spring.io/spring-framework/">Spring
> Framework</a>, specifically the
> + * <a href="
> http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/TypeUtils.html
> ">TypeUtils</a>
> + * class.
> + *
> + * @see Type
> + * @see GenericArrayType
> + * @see ParameterizedType
> + * @see WildcardType
> + * @see Class
> + * @since 2.1
> + */
> +public final class TypeUtil {
> +
> + private TypeUtil() {
> + }
> +
> + /**
> + * Gets all declared fields for the given class (including
> superclasses).
> + *
> + * @param cls the class to examine
> + * @return all declared fields for the given class (including
> superclasses).
> + * @see Class#getDeclaredFields()
> + */
> + public static List<Field> getAllDeclaredFields(Class<?> cls) {
> + final List<Field> fields = new ArrayList<>();
> + while (cls != null) {
> + for (final Field field : cls.getDeclaredFields()) {
> + fields.add(field);
> + }
> + cls = cls.getSuperclass();
> + }
> + return fields;
> + }
> + /**
> + * Indicates if two {@link Type}s are assignment compatible.
> + *
> + * @param lhs the left hand side to check assignability to
> + * @param rhs the right hand side to check assignability from
> + * @return {@code true} if it is legal to assign a variable of type
> {@code rhs} to a variable of type {@code lhs}
> + * @see Class#isAssignableFrom(Class)
> + */
> + public static boolean isAssignable(final Type lhs, final Type rhs) {
> + Objects.requireNonNull(lhs, "No left hand side type provided");
> + Objects.requireNonNull(rhs, "No right hand side type provided");
> + if (lhs.equals(rhs)) {
> + return true;
> + }
> + if (Object.class.equals(lhs)) {
> + // everything is assignable to Object
> + return true;
> + }
> + // raw type on left
> + if (lhs instanceof Class<?>) {
> + final Class<?> lhsClass = (Class<?>) lhs;
> + if (rhs instanceof Class<?>) {
> + // no generics involved
> + final Class<?> rhsClass = (Class<?>) rhs;
> + return lhsClass.isAssignableFrom(rhsClass);
> + }
> + if (rhs instanceof ParameterizedType) {
> + // check to see if the parameterized type has the same
> raw type as the lhs; this is legal
> + final Type rhsRawType = ((ParameterizedType)
> rhs).getRawType();
> + if (rhsRawType instanceof Class<?>) {
> + return lhsClass.isAssignableFrom((Class<?>)
> rhsRawType);
> + }
> + }
> + if (lhsClass.isArray() && rhs instanceof GenericArrayType) {
> + // check for compatible array component types
> + return isAssignable(lhsClass.getComponentType(),
> ((GenericArrayType) rhs).getGenericComponentType());
> + }
> + }
> + // parameterized type on left
> + if (lhs instanceof ParameterizedType) {
> + final ParameterizedType lhsType = (ParameterizedType) lhs;
> + if (rhs instanceof Class<?>) {
> + final Type lhsRawType = lhsType.getRawType();
> + if (lhsRawType instanceof Class<?>) {
> + return ((Class<?>)
> lhsRawType).isAssignableFrom((Class<?>) rhs);
> + }
> + } else if (rhs instanceof ParameterizedType) {
> + final ParameterizedType rhsType = (ParameterizedType) rhs;
> + return isParameterizedAssignable(lhsType, rhsType);
> + }
> + }
> + // generic array type on left
> + if (lhs instanceof GenericArrayType) {
> + final Type lhsComponentType = ((GenericArrayType)
> lhs).getGenericComponentType();
> + if (rhs instanceof Class<?>) {
> + // raw type on right
> + final Class<?> rhsClass = (Class<?>) rhs;
> + if (rhsClass.isArray()) {
> + return isAssignable(lhsComponentType,
> rhsClass.getComponentType());
> + }
> + } else if (rhs instanceof GenericArrayType) {
> + return isAssignable(lhsComponentType, ((GenericArrayType)
> rhs).getGenericComponentType());
> + }
> + }
> + // wildcard type on left
> + if (lhs instanceof WildcardType) {
> + return isWildcardAssignable((WildcardType) lhs, rhs);
> + }
> + // strange...
> + return false;
> + }
> +
> + private static boolean isParameterizedAssignable(final
> ParameterizedType lhs, final ParameterizedType rhs) {
> + if (lhs.equals(rhs)) {
> + // that was easy
> + return true;
> + }
> + final Type[] lhsTypeArguments = lhs.getActualTypeArguments();
> + final Type[] rhsTypeArguments = rhs.getActualTypeArguments();
> + final int size = lhsTypeArguments.length;
> + if (rhsTypeArguments.length != size) {
> + // clearly incompatible types
> + return false;
> + }
> + for (int i = 0; i < size; i++) {
> + // verify all type arguments are assignable
> + final Type lhsArgument = lhsTypeArguments[i];
> + final Type rhsArgument = rhsTypeArguments[i];
> + if (!lhsArgument.equals(rhsArgument) &&
> + !(lhsArgument instanceof WildcardType &&
> + isWildcardAssignable((WildcardType) lhsArgument,
> rhsArgument))) {
> + return false;
> + }
> + }
> + return true;
> + }
> +
> + private static boolean isWildcardAssignable(final WildcardType lhs,
> final Type rhs) {
> + final Type[] lhsUpperBounds = getEffectiveUpperBounds(lhs);
> + final Type[] lhsLowerBounds = getEffectiveLowerBounds(lhs);
> + if (rhs instanceof WildcardType) {
> + // oh boy, this scenario requires checking a lot of
> assignability!
> + final WildcardType rhsType = (WildcardType) rhs;
> + final Type[] rhsUpperBounds =
> getEffectiveUpperBounds(rhsType);
> + final Type[] rhsLowerBounds =
> getEffectiveLowerBounds(rhsType);
> + for (final Type lhsUpperBound : lhsUpperBounds) {
> + for (final Type rhsUpperBound : rhsUpperBounds) {
> + if (!isBoundAssignable(lhsUpperBound, rhsUpperBound))
> {
> + return false;
> + }
> + }
> + for (final Type rhsLowerBound : rhsLowerBounds) {
> + if (!isBoundAssignable(lhsUpperBound, rhsLowerBound))
> {
> + return false;
> + }
> + }
> + }
> + for (final Type lhsLowerBound : lhsLowerBounds) {
> + for (final Type rhsUpperBound : rhsUpperBounds) {
> + if (!isBoundAssignable(rhsUpperBound, lhsLowerBound))
> {
> + return false;
> + }
> + }
> + for (final Type rhsLowerBound : rhsLowerBounds) {
> + if (!isBoundAssignable(rhsLowerBound, lhsLowerBound))
> {
> + return false;
> + }
> + }
> + }
> + } else {
> + // phew, far less bounds to check
> + for (final Type lhsUpperBound : lhsUpperBounds) {
> + if (!isBoundAssignable(lhsUpperBound, rhs)) {
> + return false;
> + }
> + }
> + for (final Type lhsLowerBound : lhsLowerBounds) {
> + if (!isBoundAssignable(lhsLowerBound, rhs)) {
> + return false;
> + }
> + }
> + }
> + return true;
> + }
> +
> + private static Type[] getEffectiveUpperBounds(final WildcardType
> type) {
> + final Type[] upperBounds = type.getUpperBounds();
> + return upperBounds.length == 0 ? new Type[]{Object.class} :
> upperBounds;
> + }
> +
> + private static Type[] getEffectiveLowerBounds(final WildcardType
> type) {
> + final Type[] lowerBounds = type.getLowerBounds();
> + return lowerBounds.length == 0 ? new Type[]{null} : lowerBounds;
> + }
> +
> + private static boolean isBoundAssignable(final Type lhs, final Type
> rhs) {
> + return (rhs == null) || ((lhs != null) && isAssignable(lhs, rhs));
> + }
> +}
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
> similarity index 94%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
> index 4f6ddda..fae7580 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
> @@ -19,4 +19,4 @@
> * Java annotation processor for pre-scanning Log4j 2 plugins. This is
> provided as an alternative to using the
> * executable {@link
> org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in
> your build process.
> */
> -package org.apache.logging.log4j.core.config.plugins.processor;
> +package org.apache.logging.log4j.plugins.util;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
> similarity index 81%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
> index 0ac2223..4586315 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
> @@ -14,14 +14,9 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
>
> -import java.lang.annotation.Annotation;
> -import java.lang.annotation.Documented;
> -import java.lang.annotation.ElementType;
> -import java.lang.annotation.Retention;
> -import java.lang.annotation.RetentionPolicy;
> -import java.lang.annotation.Target;
> +import java.lang.annotation.*;
>
> /**
> * Meta annotation to mark an annotation as a validation constraint. This
> annotation must specify a
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
> similarity index 96%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
> index 1d8c0c5..2f638a7 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
> @@ -14,7 +14,7 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
>
> import java.lang.annotation.Annotation;
>
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
> similarity index 93%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
> index 374c8ec..6236bb6 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
> @@ -14,7 +14,9 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
> +
> +import org.apache.logging.log4j.util.ReflectionUtil;
>
> import java.lang.annotation.Annotation;
> import java.lang.reflect.ParameterizedType;
> @@ -22,8 +24,6 @@ import java.lang.reflect.Type;
> import java.util.ArrayList;
> import java.util.Collection;
>
> -import org.apache.logging.log4j.core.util.ReflectionUtil;
> -
> /**
> * Utility class to locate an appropriate {@link ConstraintValidator}
> implementation for an annotation.
> *
> @@ -36,7 +36,7 @@ public final class ConstraintValidators {
>
> /**
> * Finds all relevant {@link ConstraintValidator} objects from an
> array of annotations. All validators will be
> - * {@link
> ConstraintValidator#initialize(java.lang.annotation.Annotation)
> initialized} before being returned.
> + * {@link ConstraintValidator#initialize(Annotation) initialized}
> before being returned.
> *
> * @param annotations the annotations to find constraint validators
> for
> * @return a collection of ConstraintValidators for the given
> annotations
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
> similarity index 73%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
> index e6f3c56..9b8a75d 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
> @@ -15,16 +15,12 @@
> * limitations under the license.
> */
>
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +package org.apache.logging.log4j.plugins.validation.constraints;
>
> -import java.lang.annotation.Documented;
> -import java.lang.annotation.ElementType;
> -import java.lang.annotation.Retention;
> -import java.lang.annotation.RetentionPolicy;
> -import java.lang.annotation.Target;
> +import org.apache.logging.log4j.plugins.validation.Constraint;
> +import
> org.apache.logging.log4j.plugins.validation.validators.RequiredValidator;
>
> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.validators.RequiredValidator;
> +import java.lang.annotation.*;
>
> /**
> * Marks a plugin builder field or plugin factory parameter as required.
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
> similarity index 84%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
> index c652d40..14dd9a8 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
> @@ -14,10 +14,10 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +package org.apache.logging.log4j.plugins.validation.constraints;
>
> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.validators.ValidHostValidator;
> +import org.apache.logging.log4j.plugins.validation.Constraint;
> +import
> org.apache.logging.log4j.plugins.validation.validators.ValidHostValidator;
>
> import java.lang.annotation.*;
> import java.net.InetAddress;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
> similarity index 74%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
> index a7c68b1..c4aba16 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
> @@ -14,16 +14,12 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +package org.apache.logging.log4j.plugins.validation.constraints;
>
> -import java.lang.annotation.Documented;
> -import java.lang.annotation.ElementType;
> -import java.lang.annotation.Retention;
> -import java.lang.annotation.RetentionPolicy;
> -import java.lang.annotation.Target;
> +import org.apache.logging.log4j.plugins.validation.Constraint;
> +import
> org.apache.logging.log4j.plugins.validation.validators.ValidPortValidator;
>
> -import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.validators.ValidPortValidator;
> +import java.lang.annotation.*;
>
> /**
> * Indicates that a plugin attribute must be a valid port number. A valid
> port number is an integer between 0 and
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
> similarity index 91%
> copy from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> copy to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
> index f22ba49..298cd5a 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
> @@ -20,4 +20,4 @@
> *
> * @since 2.1
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +package org.apache.logging.log4j.plugins.validation.constraints;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
> similarity index 93%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
> index 171b25a..15955cb 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
> @@ -20,4 +20,4 @@
> *
> * @since 2.1
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
> similarity index 86%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
> index 98c0a71..9df6d3b 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
> @@ -14,17 +14,17 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.validators;
> -
> -import java.util.Collection;
> -import java.util.Map;
> +package org.apache.logging.log4j.plugins.validation.validators;
>
> import org.apache.logging.log4j.Logger;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
> -import org.apache.logging.log4j.core.util.Assert;
> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
> +import org.apache.logging.log4j.util.Assert;
> import org.apache.logging.log4j.status.StatusLogger;
>
> +import java.util.Collection;
> +import java.util.Map;
> +
> /**
> * Validator that checks an object for emptiness. Emptiness is defined
> here as:
> * <ul>
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
> similarity index 89%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
> index 6c01753..41abbfd 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
> @@ -14,11 +14,11 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.validators;
> +package org.apache.logging.log4j.plugins.validation.validators;
>
> import org.apache.logging.log4j.Logger;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
> +import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
> import org.apache.logging.log4j.status.StatusLogger;
>
> import java.net.InetAddress;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
> similarity index 85%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
> index a59742c..27e97f0 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
> @@ -14,12 +14,12 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.validators;
> +package org.apache.logging.log4j.plugins.validation.validators;
>
> import org.apache.logging.log4j.Logger;
> -import
> org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
> +import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
> +import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
> +import org.apache.logging.log4j.plugins.convert.TypeConverters;
> import org.apache.logging.log4j.status.StatusLogger;
>
> /**
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
> similarity index 92%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
> index a8ac560..cfe2041 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
> @@ -20,4 +20,4 @@
> *
> * @since 2.1
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.validators;
> +package org.apache.logging.log4j.plugins.validation.validators;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
> similarity index 84%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
> index 560cbe3..b98dc09 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
> @@ -15,18 +15,18 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.visitors;
> +package org.apache.logging.log4j.plugins.visitors;
> +
> +import org.apache.logging.log4j.Logger;
> +import org.apache.logging.log4j.plugins.convert.TypeConverters;
> +import org.apache.logging.log4j.status.StatusLogger;
> +import org.apache.logging.log4j.util.Strings;
>
> import java.lang.annotation.Annotation;
> import java.lang.reflect.Member;
> import java.util.Map;
> import java.util.Objects;
> -
> -import org.apache.logging.log4j.Logger;
> -import
> org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
> -import org.apache.logging.log4j.core.lookup.StrSubstitutor;
> -import org.apache.logging.log4j.status.StatusLogger;
> -import org.apache.logging.log4j.util.Strings;
> +import java.util.function.Function;
>
> /**
> * Base class for PluginVisitor implementations. Provides convenience
> methods as well as all method implementations
> @@ -34,7 +34,7 @@ import org.apache.logging.log4j.util.Strings;
> *
> * @param <A> the Plugin annotation type.
> */
> -public abstract class AbstractPluginVisitor<A extends Annotation>
> implements PluginVisitor<A> {
> +public abstract class AbstractPluginVisitor<A extends Annotation, T>
> implements PluginVisitor<A, T> {
>
> /** Status logger. */
> protected static final Logger LOGGER = StatusLogger.getLogger();
> @@ -58,10 +58,6 @@ public abstract class AbstractPluginVisitor<A extends
> Annotation> implements Plu
> /**
> *
> */
> - protected StrSubstitutor substitutor;
> - /**
> - *
> - */
> protected Member member;
>
> /**
> @@ -75,7 +71,7 @@ public abstract class AbstractPluginVisitor<A extends
> Annotation> implements Plu
>
> @SuppressWarnings("unchecked")
> @Override
> - public PluginVisitor<A> setAnnotation(final Annotation anAnnotation) {
> + public PluginVisitor<A, T> setAnnotation(final Annotation
> anAnnotation) {
> final Annotation a = Objects.requireNonNull(anAnnotation, "No
> annotation was provided");
> if (this.clazz.isInstance(a)) {
> this.annotation = (A) a;
> @@ -84,25 +80,19 @@ public abstract class AbstractPluginVisitor<A extends
> Annotation> implements Plu
> }
>
> @Override
> - public PluginVisitor<A> setAliases(final String... someAliases) {
> + public PluginVisitor<A, T> setAliases(final String... someAliases) {
> this.aliases = someAliases;
> return this;
> }
>
> @Override
> - public PluginVisitor<A> setConversionType(final Class<?>
> aConversionType) {
> + public PluginVisitor<A, T> setConversionType(final Class<?>
> aConversionType) {
> this.conversionType = Objects.requireNonNull(aConversionType, "No
> conversion type class was provided");
> return this;
> }
>
> @Override
> - public PluginVisitor<A> setStrSubstitutor(final StrSubstitutor
> aSubstitutor) {
> - this.substitutor = Objects.requireNonNull(aSubstitutor, "No
> StrSubstitutor was provided");
> - return this;
> - }
> -
> - @Override
> - public PluginVisitor<A> setMember(final Member aMember) {
> + public PluginVisitor<A, T> setMember(final Member aMember) {
> this.member = aMember;
> return this;
> }
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
> similarity index 80%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
> index f4da42b..fbd28b9 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
> @@ -15,40 +15,39 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.visitors;
> +package org.apache.logging.log4j.plugins.visitors;
>
> -import java.util.Map;
> -
> -import org.apache.logging.log4j.core.LogEvent;
> -import org.apache.logging.log4j.core.config.Configuration;
> -import org.apache.logging.log4j.core.config.Node;
> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
> -import org.apache.logging.log4j.core.util.NameUtil;
> +import org.apache.logging.log4j.plugins.Node;
> +import org.apache.logging.log4j.plugins.PluginAttribute;
> +import org.apache.logging.log4j.util.NameUtil;
> import org.apache.logging.log4j.util.StringBuilders;
>
> +import java.util.Map;
> +import java.util.function.Function;
> +
> /**
> * PluginVisitor implementation for {@link PluginAttribute}.
> */
> -public class PluginAttributeVisitor extends
> AbstractPluginVisitor<PluginAttribute> {
> +public class PluginAttributeVisitor extends
> AbstractPluginVisitor<PluginAttribute, Object> {
> public PluginAttributeVisitor() {
> super(PluginAttribute.class);
> }
>
> @Override
> - public Object visit(final Configuration configuration, final Node
> node, final LogEvent event,
> + public Object visit(final Object unused, final Node node, final
> Function<String, String> substitutor,
> final StringBuilder log) {
> final String name = this.annotation.value();
> final Map<String, String> attributes = node.getAttributes();
> final String rawValue = removeAttributeValue(attributes, name,
> this.aliases);
> - final String replacedValue = this.substitutor.replace(event,
> rawValue);
> - final Object defaultValue = findDefaultValue(event);
> + final String replacedValue = substitutor.apply(rawValue);
> + final Object defaultValue = findDefaultValue(substitutor);
> final Object value = convert(replacedValue, defaultValue);
> final Object debugValue = this.annotation.sensitive() ?
> NameUtil.md5(value + this.getClass().getName()) : value;
> StringBuilders.appendKeyDqValue(log, name, debugValue);
> return value;
> }
>
> - private Object findDefaultValue(final LogEvent event) {
> + private Object findDefaultValue(Function<String, String> substitutor)
> {
> if (this.conversionType == int.class || this.conversionType ==
> Integer.class) {
> return this.annotation.defaultInt();
> }
> @@ -76,6 +75,6 @@ public class PluginAttributeVisitor extends
> AbstractPluginVisitor<PluginAttribut
> if (this.conversionType == Class.class) {
> return this.annotation.defaultClass();
> }
> - return this.substitutor.replace(event,
> this.annotation.defaultString());
> + return substitutor.apply(this.annotation.defaultString());
> }
> }
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
> similarity index 74%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
> index e951456..398ff1c 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
> @@ -15,38 +15,37 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.visitors;
> +package org.apache.logging.log4j.plugins.visitors;
>
> -import java.util.Map;
> -
> -import org.apache.logging.log4j.core.LogEvent;
> -import org.apache.logging.log4j.core.config.Configuration;
> -import org.apache.logging.log4j.core.config.Node;
> -import
> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
> -import org.apache.logging.log4j.core.util.NameUtil;
> +import org.apache.logging.log4j.plugins.Node;
> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
> +import org.apache.logging.log4j.util.NameUtil;
> import org.apache.logging.log4j.util.StringBuilders;
>
> +import java.util.Map;
> +import java.util.function.Function;
> +
> /**
> * PluginVisitor for PluginBuilderAttribute. If {@code null} is returned
> for the
> - * {@link #visit(org.apache.logging.log4j.core.config.Configuration,
> org.apache.logging.log4j.core.config.Node,
> org.apache.logging.log4j.core.LogEvent, StringBuilder)}
> + * {@link #visit(org.apache.logging.log4j.core.config.Configuration,
> org.apache.logging.log4j.plugins.Node,
> org.apache.logging.log4j.core.LogEvent, StringBuilder)}
> * method, then the default value of the field should remain untouched.
> *
> * @see org.apache.logging.log4j.core.config.plugins.util.PluginBuilder
> */
> -public class PluginBuilderAttributeVisitor extends
> AbstractPluginVisitor<PluginBuilderAttribute> {
> +public class PluginBuilderAttributeVisitor extends
> AbstractPluginVisitor<PluginBuilderAttribute, Object> {
>
> public PluginBuilderAttributeVisitor() {
> super(PluginBuilderAttribute.class);
> }
>
> @Override
> - public Object visit(final Configuration configuration, final Node
> node, final LogEvent event,
> + public Object visit(final Object unused, final Node node, final
> Function<String, String> substitutor,
> final StringBuilder log) {
> final String overridden = this.annotation.value();
> final String name = overridden.isEmpty() ? this.member.getName()
> : overridden;
> final Map<String, String> attributes = node.getAttributes();
> final String rawValue = removeAttributeValue(attributes, name,
> this.aliases);
> - final String replacedValue = this.substitutor.replace(event,
> rawValue);
> + final String replacedValue = substitutor.apply(rawValue);
> final Object value = convert(replacedValue, null);
> final Object debugValue = this.annotation.sensitive() ?
> NameUtil.md5(value + this.getClass().getName()) : value;
> StringBuilders.appendKeyDqValue(log, name, debugValue);
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
> similarity index 90%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
> index 2e6e6ef..f8197f1 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
> @@ -15,30 +15,29 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.visitors;
> +package org.apache.logging.log4j.plugins.visitors;
> +
> +import org.apache.logging.log4j.plugins.Node;
> +import org.apache.logging.log4j.plugins.PluginElement;
> +import org.apache.logging.log4j.plugins.util.PluginType;
>
> import java.lang.reflect.Array;
> import java.util.ArrayList;
> import java.util.Arrays;
> import java.util.Collection;
> import java.util.List;
> -
> -import org.apache.logging.log4j.core.LogEvent;
> -import org.apache.logging.log4j.core.config.Configuration;
> -import org.apache.logging.log4j.core.config.Node;
> -import org.apache.logging.log4j.core.config.plugins.PluginElement;
> -import org.apache.logging.log4j.core.config.plugins.util.PluginType;
> +import java.util.function.Function;
>
> /**
> * PluginVisitor implementation for {@link PluginElement}. Supports
> arrays as well as singular values.
> */
> -public class PluginElementVisitor extends
> AbstractPluginVisitor<PluginElement> {
> +public class PluginElementVisitor extends
> AbstractPluginVisitor<PluginElement, Object> {
> public PluginElementVisitor() {
> super(PluginElement.class);
> }
>
> @Override
> - public Object visit(final Configuration configuration, final Node
> node, final LogEvent event,
> + public Object visit(final Object unused, final Node node, final
> Function<String, String> substitutor,
> final StringBuilder log) {
> final String name = this.annotation.value();
> if (this.conversionType.isArray()) {
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
> similarity index 77%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
> index 7f15392..9438b39 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
> @@ -15,23 +15,23 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.visitors;
> +package org.apache.logging.log4j.plugins.visitors;
>
> -import org.apache.logging.log4j.core.LogEvent;
> -import org.apache.logging.log4j.core.config.Configuration;
> -import org.apache.logging.log4j.core.config.Node;
> -import org.apache.logging.log4j.core.config.plugins.PluginNode;
> +import org.apache.logging.log4j.plugins.Node;
> +import org.apache.logging.log4j.plugins.PluginNode;
> +
> +import java.util.function.Function;
>
> /**
> * PluginVisitor implementation for {@link PluginNode}.
> */
> -public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode> {
> +public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode,
> Object> {
> public PluginNodeVisitor() {
> super(PluginNode.class);
> }
>
> @Override
> - public Object visit(final Configuration configuration, final Node
> node, final LogEvent event,
> + public Object visit(final Object unused, final Node node, final
> Function<String, String> substitutor,
> final StringBuilder log) {
> if (this.conversionType.isInstance(node)) {
> log.append("Node=").append(node.getName());
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
> similarity index 79%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
> index 8544570..2f68f04 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
> @@ -15,26 +15,26 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.visitors;
> +package org.apache.logging.log4j.plugins.visitors;
>
> -import org.apache.logging.log4j.core.LogEvent;
> -import org.apache.logging.log4j.core.config.Configuration;
> -import org.apache.logging.log4j.core.config.Node;
> -import org.apache.logging.log4j.core.config.plugins.PluginValue;
> +import org.apache.logging.log4j.plugins.Node;
> +import org.apache.logging.log4j.plugins.PluginValue;
> import org.apache.logging.log4j.util.StringBuilders;
> import org.apache.logging.log4j.util.Strings;
>
> +import java.util.function.Function;
> +
> /**
> * PluginVisitor implementation for {@link PluginValue}.
> */
> -public class PluginValueVisitor extends
> AbstractPluginVisitor<PluginValue> {
> +public class PluginValueVisitor extends
> AbstractPluginVisitor<PluginValue, Object> {
> public PluginValueVisitor() {
> super(PluginValue.class);
> }
>
> @Override
> - public Object visit(final Configuration configuration, final Node
> node, final LogEvent event,
> - final StringBuilder log) {
> + public Object visit(final Object unused, final Node node, final
> Function<String, String> substitutor,
> + final StringBuilder log) {
> final String name = this.annotation.value();
> final String elementValue = node.getValue();
> final String attributeValue = node.getAttributes().get("value");
> @@ -49,7 +49,7 @@ public class PluginValueVisitor extends
> AbstractPluginVisitor<PluginValue> {
> } else {
> rawValue = removeAttributeValue(node.getAttributes(),
> "value");
> }
> - final String value = this.substitutor.replace(event, rawValue);
> + final String value = substitutor.apply(rawValue);
> StringBuilders.appendKeyDqValue(log, name, value);
> return value;
> }
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
> similarity index 68%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
> index 34e2b78..fb7aca4 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
> @@ -15,15 +15,13 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.visitors;
> +package org.apache.logging.log4j.plugins.visitors;
> +
> +import org.apache.logging.log4j.plugins.Node;
>
> import java.lang.annotation.Annotation;
> import java.lang.reflect.Member;
> -
> -import org.apache.logging.log4j.core.LogEvent;
> -import org.apache.logging.log4j.core.config.Configuration;
> -import org.apache.logging.log4j.core.config.Node;
> -import org.apache.logging.log4j.core.lookup.StrSubstitutor;
> +import java.util.function.Function;
>
> /**
> * Visitor strategy for parsing data from a {@link Node}, doing any
> relevant type conversion, and returning a
> @@ -31,7 +29,7 @@ import
> org.apache.logging.log4j.core.lookup.StrSubstitutor;
> *
> * @param <A> the Annotation type.
> */
> -public interface PluginVisitor<A extends Annotation> {
> +public interface PluginVisitor<A extends Annotation, T> {
>
> /**
> * Sets the Annotation to be used for this. If the given Annotation
> is not compatible with this class's type, then
> @@ -41,7 +39,7 @@ public interface PluginVisitor<A extends Annotation> {
> * @return {@code this}.
> * @throws NullPointerException if the argument is {@code null}.
> */
> - PluginVisitor<A> setAnnotation(Annotation annotation);
> + PluginVisitor<A, T> setAnnotation(Annotation annotation);
>
> /**
> * Sets the list of aliases to use for this visit. No aliases are
> required, however.
> @@ -49,7 +47,7 @@ public interface PluginVisitor<A extends Annotation> {
> * @param aliases the list of aliases to use.
> * @return {@code this}.
> */
> - PluginVisitor<A> setAliases(String... aliases);
> + PluginVisitor<A, T> setAliases(String... aliases);
>
> /**
> * Sets the class to convert the plugin value to on this visit. This
> should correspond with a class obtained from
> @@ -59,17 +57,7 @@ public interface PluginVisitor<A extends Annotation> {
> * @return {@code this}.
> * @throws NullPointerException if the argument is {@code null}.
> */
> - PluginVisitor<A> setConversionType(Class<?> conversionType);
> -
> - /**
> - * Sets the StrSubstitutor to use for converting raw strings before
> type conversion. Generally obtained from a
> - * {@link org.apache.logging.log4j.core.config.Configuration}.
> - *
> - * @param substitutor the StrSubstitutor to use on plugin values.
> - * @return {@code this}.
> - * @throws NullPointerException if the argument is {@code null}.
> - */
> - PluginVisitor<A> setStrSubstitutor(StrSubstitutor substitutor);
> + PluginVisitor<A, T> setConversionType(Class<?> conversionType);
>
> /**
> * Sets the Member that this visitor is being used for injection
> upon. For instance, this could be the Field
> @@ -79,16 +67,16 @@ public interface PluginVisitor<A extends Annotation> {
> * @param member the member this visitor is parsing a value for.
> * @return {@code this}.
> */
> - PluginVisitor<A> setMember(Member member);
> + PluginVisitor<A, T> setMember(Member member);
>
> /**
> * Visits a Node to obtain a value for constructing a Plugin object.
> *
> * @param configuration the current Configuration.
> * @param node the current Node corresponding to the Plugin
> object being created.
> - * @param event the current LogEvent that caused this Plugin
> object to be made (optional).
> - * @param log the StringBuilder being used to build a debug
> message.
> + * @param substitutor the function to perform String substitutions.
> + * @param log th e StringBuilder being used to build a
> debug message.
> * @return the converted value to be used for Plugin creation.
> */
> - Object visit(Configuration configuration, Node node, LogEvent event,
> StringBuilder log);
> + Object visit(T configuration, Node node, Function<String, String>
> substitutor, StringBuilder log);
> }
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
> similarity index 86%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
> index 10ee0df..695d387 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
> @@ -15,14 +15,14 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.visitors;
> -
> -import java.lang.annotation.Annotation;
> +package org.apache.logging.log4j.plugins.visitors;
>
> import org.apache.logging.log4j.Logger;
> -import org.apache.logging.log4j.core.config.plugins.PluginVisitorStrategy;
> +import org.apache.logging.log4j.plugins.PluginVisitorStrategy;
> import org.apache.logging.log4j.status.StatusLogger;
>
> +import java.lang.annotation.Annotation;
> +
> /**
> * Utility class to locate an appropriate {@link PluginVisitor}
> implementation for an annotation.
> */
> @@ -41,13 +41,13 @@ public final class PluginVisitors {
> * @param annotation the Plugin annotation class to find a
> PluginVisitor for.
> * @return a PluginVisitor instance if one could be created, or
> {@code null} otherwise.
> */
> - public static PluginVisitor<? extends Annotation> findVisitor(final
> Class<? extends Annotation> annotation) {
> + public static <T> PluginVisitor<? extends Annotation, T>
> findVisitor(final Class<? extends Annotation> annotation) {
> final PluginVisitorStrategy strategy =
> annotation.getAnnotation(PluginVisitorStrategy.class);
> if (strategy == null) {
> return null;
> }
> try {
> - return strategy.value().newInstance();
> + return (PluginVisitor<? extends Annotation, T>)
> strategy.value().newInstance();
> } catch (final Exception e) {
> LOGGER.error("Error loading PluginVisitor [{}] for annotation
> [{}].", strategy.value(), annotation, e);
> return null;
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
> similarity index 67%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> rename to
> log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
> index f22ba49..0855b16 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
> +++
> b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
> @@ -16,8 +16,9 @@
> */
>
> /**
> - * Validation annotations.
> - *
> - * @since 2.1
> + * Visitor classes for extracting values from a Configuration or Node
> corresponding to a plugin annotation.
> + * Visitor implementations must implement {@link
> org.apache.logging.log4j.plugins.visitors.PluginVisitor},
> + * and the corresponding annotation must be annotated with
> + * {@link org.apache.logging.log4j.plugins.PluginVisitorStrategy}.
> */
> -package
> org.apache.logging.log4j.core.config.plugins.validation.constraints;
> +package org.apache.logging.log4j.plugins.visitors;
> diff --git
> a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
> b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
> similarity index 91%
> rename from
> log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
> rename to
> log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
> index bb9dcb9..5d6951a 100644
> ---
> a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
> +++
> b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
> @@ -14,4 +14,4 @@
> # See the license for the specific language governing permissions and
> # limitations under the license.
> #
> -org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor
> +org.apache.logging.log4j.plugins.processor.PluginProcessor
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
> similarity index 97%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
> index f9e757d..6e4b059 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
> @@ -14,7 +14,7 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.convert;
> +package org.apache.logging.log4j.plugins.convert;
>
> import org.junit.Test;
>
> @@ -63,7 +63,7 @@ public class TypeConverterRegistryTest {
> // TODO: is there a specific converter this should return?
> }
>
> - public static enum Foo {
> + public enum Foo {
> I, PITY, THE
> }
>
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
> similarity index 84%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
> index f4ceb41..48ea7dc 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
> @@ -15,10 +15,10 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.processor;
> +package org.apache.logging.log4j.plugins.processor;
>
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
> +import org.apache.logging.log4j.plugins.Plugin;
> +import org.apache.logging.log4j.plugins.PluginAliases;
>
> /**
> * Test plugin class for unit tests.
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
> similarity index 75%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
> index 9c37af4..034705c 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
> @@ -15,17 +15,19 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.processor;
> +package org.apache.logging.log4j.plugins.processor;
>
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import org.apache.logging.log4j.core.config.plugins.PluginAliases;
> +import org.apache.logging.log4j.plugins.Plugin;
> +import org.apache.logging.log4j.plugins.PluginAliases;
> import org.junit.BeforeClass;
> import org.junit.Test;
> import org.junit.runner.RunWith;
> import org.junit.runners.JUnit4;
>
> import java.net.URL;
> +import java.util.ArrayList;
> import java.util.Enumeration;
> +import java.util.List;
> import java.util.Map;
>
> import static org.junit.Assert.*;
> @@ -33,29 +35,29 @@ import static org.junit.Assert.*;
> @RunWith(JUnit4.class)
> public class PluginProcessorTest {
>
> - private static final PluginCache pluginCache = new PluginCache();
> + private static PluginService pluginService;
>
> private final Plugin p = FakePlugin.class.getAnnotation(Plugin.class);
>
> @BeforeClass
> public static void setUpClass() throws Exception {
> - final Enumeration<URL> resources =
> -
> PluginProcessor.class.getClassLoader().getResources(PluginProcessor.PLUGIN_CACHE_FILE);
> - pluginCache.loadCacheFiles(resources);
> + Class<?> clazz =
> PluginProcessor.class.getClassLoader().loadClass("org.apache.logging.log4j.plugins.plugins.Log4jPlugins");
> + assertNotNull("Could not locate plugins class", clazz);
> + pluginService = (PluginService)
> clazz.getDeclaredConstructor().newInstance();;
> }
>
> @Test
> public void testTestCategoryFound() throws Exception {
> assertNotNull("No plugin annotation on FakePlugin.", p);
> - final Map<String, PluginEntry> testCategory =
> pluginCache.getCategory(p.category());
> - assertNotEquals("No plugins were found.", 0, pluginCache.size());
> + final Map<String, PluginEntry> testCategory =
> pluginService.getCategory(p.category());
> + assertNotEquals("No plugins were found.", 0,
> pluginService.size());
> assertNotNull("The category '" + p.category() + "' was not
> found.", testCategory);
> assertFalse(testCategory.isEmpty());
> }
>
> @Test
> public void testFakePluginFoundWithCorrectInformation() throws
> Exception {
> - final PluginEntry fake =
> pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
> + final PluginEntry fake =
> pluginService.getCategory(p.category()).get(p.name().toLowerCase());
> verifyFakePluginEntry(p.name(), fake);
> }
>
> @@ -63,7 +65,7 @@ public class PluginProcessorTest {
> public void testFakePluginAliasesContainSameInformation() throws
> Exception {
> final PluginAliases aliases =
> FakePlugin.class.getAnnotation(PluginAliases.class);
> for (final String alias : aliases.value()) {
> - final PluginEntry fake =
> pluginCache.getCategory(p.category()).get(alias.toLowerCase());
> + final PluginEntry fake =
> pluginService.getCategory(p.category()).get(alias.toLowerCase());
> verifyFakePluginEntry(alias, fake);
> }
> }
> @@ -81,7 +83,7 @@ public class PluginProcessorTest {
> @Test
> public void testNestedPlugin() throws Exception {
> final Plugin p =
> FakePlugin.Nested.class.getAnnotation(Plugin.class);
> - final PluginEntry nested =
> pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
> + final PluginEntry nested =
> pluginService.getCategory(p.category()).get(p.name().toLowerCase());
> assertNotNull(nested);
> assertEquals(p.name().toLowerCase(), nested.getKey());
> assertEquals(FakePlugin.Nested.class.getName(),
> nested.getClassName());
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
> similarity index 93%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
> index 33e0ee1..d0b35d1 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
> @@ -15,27 +15,21 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.util;
> +package org.apache.logging.log4j.plugins.util;
>
> -import static org.junit.Assert.assertEquals;
> +import org.apache.logging.log4j.junit.CleanFolders;
> +import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
> +import org.junit.Rule;
> +import org.junit.Test;
> +import org.junit.rules.RuleChain;
>
> import java.io.IOException;
> -import java.net.Proxy;
> -import java.net.URL;
> -import java.net.URLClassLoader;
> -import java.net.URLConnection;
> -import java.net.URLStreamHandler;
> -import java.net.URLStreamHandlerFactory;
> +import java.net.*;
> import java.util.Arrays;
> import java.util.Collections;
> import java.util.Enumeration;
>
> -import
> org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
> -import org.apache.logging.log4j.junit.CleanFolders;
> -import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
> -import org.junit.Rule;
> -import org.junit.Test;
> -import org.junit.rules.RuleChain;
> +import static org.junit.Assert.assertEquals;
>
> /**
> * Tests the ResolverUtil class for custom protocol like bundleresource,
> vfs, vfszip.
> @@ -187,9 +181,9 @@ public class ResolverUtilCustomProtocolTest {
> final ResolverUtil resolverUtil = new ResolverUtil();
> resolverUtil
> .setClassLoader(new SingleURLClassLoader(new
> URL("vfs:/" + ResolverUtilTest.WORK_DIR + "/resolverutil3/customplugin3/"),
> cl));
> - resolverUtil.findInPackage(new PluginTest(), "customplugin3");
> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
> "customplugin3");
> assertEquals("Class not found in packages", 1,
> resolverUtil.getClasses().size());
> - assertEquals("Unexpected class resolved",
> cl.loadClass("customplugin3.FixedString3Layout"),
> + assertEquals("Unexpected class resolved",
> cl.loadClass("customplugin3.FixedString3"),
> resolverUtil.getClasses().iterator().next());
> }
> }
> @@ -200,9 +194,9 @@ public class ResolverUtilCustomProtocolTest {
> final ResolverUtil resolverUtil = new ResolverUtil();
> resolverUtil.setClassLoader(new SingleURLClassLoader(
> new URL("vfs:/" + ResolverUtilTest.WORK_DIR +
> "/resolverutil4/customplugin4.jar/customplugin4/"), cl));
> - resolverUtil.findInPackage(new PluginTest(), "customplugin4");
> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
> "customplugin4");
> assertEquals("Class not found in packages", 1,
> resolverUtil.getClasses().size());
> - assertEquals("Unexpected class resolved",
> cl.loadClass("customplugin4.FixedString4Layout"),
> + assertEquals("Unexpected class resolved",
> cl.loadClass("customplugin4.FixedString4"),
> resolverUtil.getClasses().iterator().next());
> }
> }
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
> similarity index 82%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
> index 1c6371b..361fe7b 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
> @@ -15,33 +15,25 @@
> * limitations under the license.
> */
>
> -package org.apache.logging.log4j.core.config.plugins.util;
> +package org.apache.logging.log4j.plugins.util;
>
> -import static org.junit.Assert.assertEquals;
> -import static org.junit.Assert.assertTrue;
> -
> -import java.io.File;
> -import java.io.IOException;
> -import java.io.UnsupportedEncodingException;
> -import java.net.MalformedURLException;
> -import java.net.URI;
> -import java.net.URISyntaxException;
> -import java.net.URL;
> -import java.net.URLClassLoader;
> -import java.nio.file.FileSystem;
> -import java.nio.file.FileSystems;
> -import java.nio.file.Files;
> -import java.nio.file.Path;
> -import java.nio.file.StandardCopyOption;
> -import java.util.HashMap;
> -import java.util.Map;
> -
> -import
> org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
> import org.apache.logging.log4j.junit.CleanFolders;
> import org.junit.Rule;
> import org.junit.Test;
> import org.junit.rules.RuleChain;
>
> +import javax.tools.*;
> +import java.io.File;
> +import java.io.IOException;
> +import java.io.UnsupportedEncodingException;
> +import java.net.*;
> +import java.nio.file.*;
> +import java.util.*;
> +
> +import static org.junit.Assert.assertEquals;
> +import static org.junit.Assert.assertTrue;
> +import static org.junit.Assert.assertNotNull;
> +
> /**
> * Tests the ResolverUtil class.
> */
> @@ -67,6 +59,7 @@ public class ResolverUtilTest {
> private void testExtractPathFromJarUrlNotDecodedIfFileExists(final
> String existingFile)
> throws MalformedURLException, UnsupportedEncodingException,
> URISyntaxException {
> URL url = ResolverUtilTest.class.getResource(existingFile);
> + assertNotNull("No url returned for " + existingFile, url);
> if (!url.getProtocol().equals("jar")) {
> // create fake jar: URL that resolves to existing file
> url = new URL("jar:" + url.toExternalForm() + "!/some/entry");
> @@ -152,9 +145,9 @@ public class ResolverUtilTest {
> try (final URLClassLoader cl = compileAndCreateClassLoader("1")) {
> final ResolverUtil resolverUtil = new ResolverUtil();
> resolverUtil.setClassLoader(cl);
> - resolverUtil.findInPackage(new PluginTest(), "customplugin1");
> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
> "customplugin1");
> assertEquals("Class not found in packages", 1,
> resolverUtil.getClasses().size());
> - assertEquals("Unexpected class resolved",
> cl.loadClass("customplugin1.FixedString1Layout"),
> + assertEquals("Unexpected class resolved",
> cl.loadClass("customplugin1.FixedString1"),
> resolverUtil.getClasses().iterator().next());
> }
> }
> @@ -164,9 +157,9 @@ public class ResolverUtilTest {
> try (final URLClassLoader cl =
> compileJarAndCreateClassLoader("2")) {
> final ResolverUtil resolverUtil = new ResolverUtil();
> resolverUtil.setClassLoader(cl);
> - resolverUtil.findInPackage(new PluginTest(), "customplugin2");
> + resolverUtil.findInPackage(new PluginRegistry.PluginTest(),
> "customplugin2");
> assertEquals("Class not found in packages", 1,
> resolverUtil.getClasses().size());
> - assertEquals("Unexpected class resolved",
> cl.loadClass("customplugin2.FixedString2Layout"),
> + assertEquals("Unexpected class resolved",
> cl.loadClass("customplugin2.FixedString2"),
> resolverUtil.getClasses().iterator().next());
> }
> }
> @@ -176,7 +169,7 @@ public class ResolverUtilTest {
> final File jarFile = new File(workDir, "customplugin" + suffix +
> ".jar");
> final URI jarURI = jarFile.toURI();
> createJar(jarURI, workDir, new File(workDir,
> - "customplugin" + suffix + "/FixedString" + suffix +
> "Layout.class"));
> + "customplugin" + suffix + "/FixedString" + suffix +
> ".class"));
> return URLClassLoader.newInstance(new URL[] {jarURI.toURL()});
> }
>
> @@ -186,9 +179,9 @@ public class ResolverUtilTest {
> }
>
> static File compile(final String suffix) throws IOException {
> - final File orig = new
> File("target/test-classes/customplugin/FixedStringLayout.java.source");
> + final File orig = new
> File("target/test-classes/customplugin/FixedString.java.source");
> final File workDir = new File(WORK_DIR, "resolverutil" + suffix);
> - final File f = new File(workDir, "customplugin" + suffix +
> "/FixedString" + suffix + "Layout.java");
> + final File f = new File(workDir, "customplugin" + suffix +
> "/FixedString" + suffix + ".java");
> final File parent = f.getParentFile();
> if (!parent.exists()) {
> assertTrue("Create customplugin" + suffix + " folder KO",
> f.getParentFile().mkdirs());
> @@ -199,7 +192,7 @@ public class ResolverUtilTest {
> .replaceAll("customplugin", "customplugin" + suffix);
> Files.write(f.toPath(), content.getBytes());
>
> - PluginManagerPackagesTest.compile(f);
> + compile(f);
> return workDir;
> }
>
> @@ -218,4 +211,29 @@ public class ResolverUtilTest {
> }
> }
>
> + static void compile(final File f) throws IOException {
> + // set up compiler
> + final JavaCompiler compiler =
> ToolProvider.getSystemJavaCompiler();
> + final DiagnosticCollector<JavaFileObject> diagnostics = new
> DiagnosticCollector<>();
> + final List<String> errors = new ArrayList<>();
> + try (final StandardJavaFileManager fileManager =
> compiler.getStandardFileManager(diagnostics, null, null)) {
> + final Iterable<? extends JavaFileObject> compilationUnits =
> fileManager.getJavaFileObjectsFromFiles(Arrays
> + .asList(f));
> +
> + // compile generated source
> + // (switch off annotation processing: no need to create
> Log4j2Plugins.dat)
> + final List<String> options = Arrays.asList("-proc:none");
> + compiler.getTask(null, fileManager, diagnostics, options,
> null, compilationUnits).call();
> +
> + // check we don't have any compilation errors
> + for (final Diagnostic<? extends JavaFileObject> diagnostic :
> diagnostics.getDiagnostics()) {
> + if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
> + errors.add(String.format("Compile error at line %d,
> column %d: %s%n", diagnostic.getLineNumber(),
> + diagnostic.getColumnNumber(),
> diagnostic.getMessage(Locale.getDefault())));
> + }
> + }
> + }
> + assertTrue(errors.toString(), errors.isEmpty());
> + }
> +
> }
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
> similarity index 87%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
> index 5689e29..0e243f2 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
> @@ -14,10 +14,10 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
>
> -import
> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>
> /**
> *
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
> similarity index 78%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
> index 34123c0..626798e 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
> @@ -14,15 +14,15 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
>
> -import java.net.InetSocketAddress;
> +import org.apache.logging.log4j.plugins.PluginAttribute;
> +import org.apache.logging.log4j.plugins.PluginFactory;
> +import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
> +import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
> +import org.apache.logging.log4j.plugins.Plugin;
>
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
> +import java.net.InetSocketAddress;
>
> @Plugin(name = "HostAndPort", category = "Test")
> public class HostAndPort {
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
> similarity index 81%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
> index 3f2b15a..c3fe6c5 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
> @@ -14,18 +14,18 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
>
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import
> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
> +import org.apache.logging.log4j.plugins.Plugin;
>
> @Plugin(name = "PluginWithGenericSubclassFoo1Builder", category = "Test")
> public class PluginWithGenericSubclassFoo1Builder extends
> AbstractPluginWithGenericBuilder {
>
> public static class Builder<B extends Builder<B>> extends
> AbstractPluginWithGenericBuilder.Builder<B>
> - implements
> org.apache.logging.log4j.core.util.Builder<PluginWithGenericSubclassFoo1Builder>
> {
> + implements
> org.apache.logging.log4j.plugins.util.Builder<PluginWithGenericSubclassFoo1Builder>
> {
>
> @PluginBuilderFactory
> public static <B extends Builder<B>> B newBuilder() {
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
> similarity index 80%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
> index 95a4209..9caf453 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
> @@ -14,15 +14,15 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
>
> -import java.util.Objects;
> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
> +import org.apache.logging.log4j.plugins.PluginFactory;
> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
> +import org.apache.logging.log4j.plugins.Plugin;
>
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import
> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
> +import java.util.Objects;
>
> /**
> *
> @@ -51,7 +51,7 @@ public class ValidatingPlugin {
> return new Builder();
> }
>
> - public static class Builder implements
> org.apache.logging.log4j.core.util.Builder<ValidatingPlugin> {
> + public static class Builder implements
> org.apache.logging.log4j.plugins.util.Builder<ValidatingPlugin> {
>
> @PluginBuilderAttribute
> @Required(message = "The name given by the builder is null")
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
> similarity index 80%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
> index 81b9d6f..b0bec53 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
> @@ -14,15 +14,16 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
>
> -import java.util.Objects;
> +import org.apache.logging.log4j.plugins.Plugin;
> +
> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
> +import org.apache.logging.log4j.plugins.PluginFactory;
> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
>
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import
> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
> +import java.util.Objects;
>
> /**
> *
> @@ -51,7 +52,7 @@ public class ValidatingPluginWithGenericBuilder {
> return new Builder<B>().asBuilder();
> }
>
> - public static class Builder<B extends Builder<B>> implements
> org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithGenericBuilder>
> {
> + public static class Builder<B extends Builder<B>> implements
> org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithGenericBuilder>
> {
>
> @PluginBuilderAttribute
> @Required(message = "The name given by the builder is null")
> diff --git
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
> similarity index 80%
> rename from
> log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
> rename to
> log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
> index 74a6477..256181c 100644
> ---
> a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
> +++
> b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
> @@ -14,15 +14,15 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.validation;
> +package org.apache.logging.log4j.plugins.validation;
>
> -import java.util.Objects;
> +import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
> +import org.apache.logging.log4j.plugins.PluginBuilderFactory;
> +import org.apache.logging.log4j.plugins.PluginFactory;
> +import org.apache.logging.log4j.plugins.validation.constraints.Required;
> +import org.apache.logging.log4j.plugins.Plugin;
>
> -import org.apache.logging.log4j.core.config.plugins.Plugin;
> -import
> org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
> -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
> -import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> -import
> org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
> +import java.util.Objects;
>
> /**
> *
> @@ -51,7 +51,7 @@ public class ValidatingPluginWithTypedBuilder {
> return new Builder<>();
> }
>
> - public static class Builder<T> implements
> org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithTypedBuilder>
> {
> + public static class Builder<T> implements
> org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithTypedBuilder>
> {
>
> @PluginBuilderAttribute
> @Required(message = "The name given by the builder is null")
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
> b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
> similarity index 52%
> rename from
> log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
> rename to
> log4j-plugins/src/test/resources/customplugin/FixedString.java.source
> index 15a162c..85a62ec 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
> +++ b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
> @@ -14,25 +14,32 @@
> * See the license for the specific language governing permissions and
> * limitations under the license.
> */
> -package org.apache.logging.log4j.core.config.plugins.convert;
>
> -import org.apache.logging.log4j.util.EnglishEnums;
> +package customplugin;
>
> -/**
> - * Converts a {@link String} into a {@link Enum}. Returns {@code null}
> for invalid enum names.
> - *
> - * @param <E> the enum class to parse.
> - * @since 2.1 moved from TypeConverters
> - */
> -public class EnumConverter<E extends Enum<E>> implements TypeConverter<E>
> {
> - private final Class<E> clazz;
> +import java.util.Collections;
> +import java.util.Map;
> +
> +import org.apache.logging.log4j.plugins.Plugin;
> +import org.apache.logging.log4j.plugins.PluginAttribute;
> +import org.apache.logging.log4j.plugins.PluginFactory;
> +
> +@Plugin(name = "FixedString", category = "Core", elementType = "plugin",
> printObject = true)
> +public class FixedString {
> +
> + private String fixedString;
> +
> + @PluginFactory
> + public static FixedString create(
> + @PluginAttribute("fixedString") final String fixedString) {
> + return new FixedString(fixedString);
> + }
>
> - public EnumConverter(final Class<E> clazz) {
> - this.clazz = clazz;
> + public FixedString(String fixedString) {
> + this.fixedString = fixedString;
> }
>
> - @Override
> - public E convert(final String s) {
> - return EnglishEnums.valueOf(clazz, s);
> + public Map<String, String> getContentFormat() {
> + return Collections.emptyMap();
> }
> }
> diff --git
> a/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
> b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
> new file mode 100644
> index 0000000..b85475a
> --- /dev/null
> +++
> b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
> @@ -0,0 +1,31 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<!--
> + 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.
> +
> +-->
> +<Configuration status="OFF" name="XMLConfigTest">
> +
> + <Appenders>
> + <List name="List">
> + </List>
> + </Appenders>
> + <Loggers>
> + <Root level="trace">
> + <AppenderRef ref="List"/>
> + </Root>
> + </Loggers>
> +
> +</Configuration>
> \ No newline at end of file
> diff --git a/log4j-plugins/src/test/resources/s p a c e
> s/log4j+config+with+plus+characters.xml
> b/log4j-plugins/src/test/resources/s p a c e
> s/log4j+config+with+plus+characters.xml
> new file mode 100644
> index 0000000..b85475a
> --- /dev/null
> +++ b/log4j-plugins/src/test/resources/s p a c e
> s/log4j+config+with+plus+characters.xml
> @@ -0,0 +1,31 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<!--
> + 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.
> +
> +-->
> +<Configuration status="OFF" name="XMLConfigTest">
> +
> + <Appenders>
> + <List name="List">
> + </List>
> + </Appenders>
> + <Loggers>
> + <Root level="trace">
> + <AppenderRef ref="List"/>
> + </Root>
> + </Loggers>
> +
> +</Configuration>
> \ No newline at end of file
>
>
[logging-log4j2] 01/02: LOG4J2-2621 - Initial commit
Posted by rg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rgoers pushed a commit to branch LOG4J2-2621
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit b69c2d9e4b79ee7830a69463c6f89de1c50fe84d
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Sun Jun 2 13:18:36 2019 -0700
LOG4J2-2621 - Initial commit
---
.../org/apache/logging/log4j}/util/Assert.java | 0
.../logging/log4j/util/InternalException.java | 56 ++++
.../org/apache/logging/log4j}/util/NameUtil.java | 0
.../apache/logging/log4j}/util/ReflectionUtil.java | 6 +-
.../log4j/junit/AbstractExternalFileCleaner.java | 0
.../org/apache/logging/log4j/junit/CleanFiles.java | 0
.../apache/logging/log4j/junit/CleanFolders.java | 0
.../log4j/junit/URLStreamHandlerFactoryRule.java | 0
.../org/apache/logging/log4j}/util/AssertTest.java | 2 +-
.../config/plugins/convert/Base64Converter.java | 79 -----
...TypeConverters.java => CoreTypeConverters.java} | 7 +-
.../ValidatingPluginWithGenericBuilderTest.java | 10 +-
log4j-plugins-java9/pom.xml | 157 +++++++++
log4j-plugins-java9/src/assembly/java9.xml | 40 +++
.../src/main/java/module-info.java | 15 +-
.../org/apache/logging/log4j/plugins/Dummy.java | 9 +-
.../logging/log4j/plugins/convert/Dummy.java | 9 +-
.../log4j/plugins/processor/PluginService.java | 9 +-
.../apache/logging/log4j/plugins/util/Dummy.java | 9 +-
.../logging/log4j/plugins/validation/Dummy.java | 9 +-
.../logging/log4j/plugins/visitors/Dummy.java | 9 +-
log4j-plugins/pom.xml | 360 +++++++++++++++++++++
.../org/apache/logging/log4j/plugins}/Node.java | 6 +-
.../org/apache/logging/log4j}/plugins/Plugin.java | 6 +-
.../logging/log4j}/plugins/PluginAliases.java | 4 +-
.../logging/log4j}/plugins/PluginAttribute.java | 8 +-
.../log4j}/plugins/PluginBuilderAttribute.java | 8 +-
.../log4j}/plugins/PluginBuilderFactory.java | 2 +-
.../logging/log4j}/plugins/PluginElement.java | 6 +-
.../logging/log4j}/plugins/PluginFactory.java | 2 +-
.../apache/logging/log4j}/plugins/PluginNode.java | 6 +-
.../apache/logging/log4j}/plugins/PluginValue.java | 6 +-
.../log4j}/plugins/PluginVisitorStrategy.java | 8 +-
.../log4j}/plugins/convert/EnumConverter.java | 2 +-
.../log4j}/plugins/convert/HexConverter.java | 2 +-
.../log4j}/plugins/convert/TypeConverter.java | 2 +-
.../plugins/convert/TypeConverterRegistry.java | 23 +-
.../log4j}/plugins/convert/TypeConverters.java | 47 +--
.../log4j/plugins/convert}/package-info.java | 7 +-
.../logging/log4j/plugins/osgi/Activator.java | 103 ++++++
.../logging/log4j/plugins/osgi}/package-info.java | 6 +-
.../logging/log4j/plugins}/package-info.java | 6 +-
.../log4j}/plugins/processor/PluginCache.java | 30 +-
.../log4j}/plugins/processor/PluginEntry.java | 14 +-
.../log4j}/plugins/processor/PluginProcessor.java | 157 +++++++--
.../log4j/plugins/processor/PluginService.java | 56 ++++
.../log4j}/plugins/processor/package-info.java | 2 +-
.../logging/log4j/plugins}/util/Builder.java | 4 +-
.../logging/log4j}/plugins/util/PluginManager.java | 8 +-
.../log4j}/plugins/util/PluginRegistry.java | 81 +++--
.../logging/log4j}/plugins/util/PluginType.java | 6 +-
.../logging/log4j}/plugins/util/ResolverUtil.java | 29 +-
.../logging/log4j/plugins/util/TypeUtil.java | 217 +++++++++++++
.../logging/log4j/plugins/util}/package-info.java | 2 +-
.../log4j}/plugins/validation/Constraint.java | 9 +-
.../plugins/validation/ConstraintValidator.java | 2 +-
.../plugins/validation/ConstraintValidators.java | 8 +-
.../plugins/validation/constraints/Required.java | 12 +-
.../plugins/validation/constraints/ValidHost.java | 6 +-
.../plugins/validation/constraints/ValidPort.java | 12 +-
.../validation/constraints/package-info.java | 2 +-
.../log4j}/plugins/validation/package-info.java | 2 +-
.../validation/validators/RequiredValidator.java | 14 +-
.../validation/validators/ValidHostValidator.java | 6 +-
.../validation/validators/ValidPortValidator.java | 8 +-
.../validation/validators/package-info.java | 2 +-
.../plugins/visitors/AbstractPluginVisitor.java | 34 +-
.../plugins/visitors/PluginAttributeVisitor.java | 27 +-
.../visitors/PluginBuilderAttributeVisitor.java | 23 +-
.../plugins/visitors/PluginElementVisitor.java | 17 +-
.../log4j}/plugins/visitors/PluginNodeVisitor.java | 14 +-
.../plugins/visitors/PluginValueVisitor.java | 18 +-
.../log4j}/plugins/visitors/PluginVisitor.java | 36 +--
.../log4j}/plugins/visitors/PluginVisitors.java | 12 +-
.../log4j/plugins/visitors}/package-info.java | 9 +-
.../services/javax.annotation.processing.Processor | 2 +-
.../plugins/convert/TypeConverterRegistryTest.java | 4 +-
.../log4j}/plugins/processor/FakePlugin.java | 6 +-
.../plugins/processor/PluginProcessorTest.java | 26 +-
.../util/ResolverUtilCustomProtocolTest.java | 30 +-
.../log4j}/plugins/util/ResolverUtilTest.java | 76 +++--
.../AbstractPluginWithGenericBuilder.java | 6 +-
.../log4j}/plugins/validation/HostAndPort.java | 14 +-
.../PluginWithGenericSubclassFoo1Builder.java | 12 +-
.../plugins/validation/ValidatingPlugin.java | 16 +-
.../ValidatingPluginWithGenericBuilder.java | 17 +-
.../ValidatingPluginWithTypedBuilder.java | 16 +-
.../resources/customplugin/FixedString.java.source | 37 ++-
.../log4j+config+with+plus+characters.xml | 31 ++
.../log4j+config+with+plus+characters.xml | 31 ++
90 files changed, 1655 insertions(+), 594 deletions(-)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
similarity index 100%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/util/Assert.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
new file mode 100644
index 0000000..8c433db
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
@@ -0,0 +1,56 @@
+/*
+ * 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;
+
+/**
+ * Exception thrown when an error occurs while logging. In most cases exceptions will be handled
+ * within Log4j but certain Appenders may be configured to allow exceptions to propagate to the
+ * application. This is a RuntimeException so that the exception may be thrown in those cases without
+ * requiring all Logger methods be contained with try/catch blocks.
+ */
+public class LoggingException extends RuntimeException {
+
+ private static final long serialVersionUID = 6366395965071580537L;
+
+ /**
+ * Construct an exception with a message.
+ *
+ * @param message The reason for the exception
+ */
+ public LoggingException(final String message) {
+ super(message);
+ }
+
+ /**
+ * Construct an exception with a message and underlying cause.
+ *
+ * @param message The reason for the exception
+ * @param cause The underlying cause of the exception
+ */
+ public LoggingException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * Construct an exception with an underlying cause.
+ *
+ * @param cause The underlying cause of the exception
+ */
+ public LoggingException(final Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
similarity index 100%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/util/NameUtil.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
similarity index 98%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
index ffee439..f00e64a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/ReflectionUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
@@ -193,8 +193,10 @@ public final class ReflectionUtil {
} catch (final IllegalAccessException e) {
throw new IllegalStateException(e);
} catch (final InvocationTargetException e) {
- Throwables.rethrow(e.getCause());
- throw new InternalError("Unreachable");
+ if (e.getCause() instanceof RuntimeException) {
+ throw (RuntimeException) e.getCause();
+ }
+ throw new
}
}
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java b/log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
rename to log4j-api/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
rename to log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java b/log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
rename to log4j-api/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java b/log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
similarity index 100%
rename from log4j-core/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
rename to log4j-api/src/test/java/org/apache/logging/log4j/junit/URLStreamHandlerFactoryRule.java
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
similarity index 99%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
rename to log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
index 242c41e..7e46036 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/AssertTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
@@ -65,4 +65,4 @@ public class AssertTest {
assertEquals(isEmpty, Assert.isEmpty(value));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
deleted file mode 100644
index f4e421f..0000000
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/Base64Converter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.convert;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
-
-/**
- * @Since 2.9
- */
-public class Base64Converter {
-
- private static final Logger LOGGER = StatusLogger.getLogger();
- private static Method method = null;
- private static Object decoder = null;
-
- static {
- try {
- // Base64 is available in Java 8 and up.
- Class<?> clazz = LoaderUtil.loadClass("java.util.Base64");
- final Method getDecoder = clazz.getMethod("getDecoder", (Class[]) null);
- decoder = getDecoder.invoke(null, (Object[]) null);
- clazz = decoder.getClass();
- method = clazz.getMethod("decode", String.class);
- } catch (final ClassNotFoundException ex) {
-
- } catch (final NoSuchMethodException ex) {
-
- } catch (final IllegalAccessException ex) {
-
- } catch (final InvocationTargetException ex) {
-
- }
- if (method == null) {
- try {
- // DatatypeConverter is not in the default module in Java 9.
- final Class<?> clazz = LoaderUtil.loadClass("javax.xml.bind.DatatypeConverter");
- method = clazz.getMethod("parseBase64Binary", String.class);
- } catch (final ClassNotFoundException ex) {
- LOGGER.error("No Base64 Converter is available");
- } catch (final NoSuchMethodException ex) {
-
- }
- }
- }
-
- public static byte[] parseBase64Binary(final String encoded) {
- if (method == null) {
- LOGGER.error("No base64 converter");
- } else {
- try {
- return (byte[]) method.invoke(decoder, encoded);
- } catch (final IllegalAccessException ex) {
- LOGGER.error("Error decoding string - " + ex.getMessage());
- } catch (final InvocationTargetException ex) {
- LOGGER.error("Error decoding string - " + ex.getMessage());
- }
- }
- return new byte[0];
- }
-}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
similarity index 98%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
copy to log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
index dc833f0..00e6da7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
@@ -30,13 +30,14 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.Provider;
import java.security.Security;
+import java.util.Base64;
import java.util.UUID;
import java.util.regex.Pattern;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.appender.rolling.action.Duration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.CronExpression;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.LoaderUtil;
@@ -56,6 +57,8 @@ public final class TypeConverters {
*/
public static final String CATEGORY = "TypeConverter";
+ private static final Base64.Decoder decoder = Base64.getDecoder();
+
/**
* Parses a {@link String} into a {@link BigDecimal}.
*/
@@ -112,7 +115,7 @@ public final class TypeConverters {
bytes = new byte[0];
} else if (value.startsWith(PREFIX_BASE64)) {
final String lexicalXSDBase64Binary = value.substring(PREFIX_BASE64.length());
- bytes = Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
+ bytes = decoder.decode(lexicalXSDBase64Binary);
} else if (value.startsWith(PREFIX_0x)) {
final String lexicalXSDHexBinary = value.substring(PREFIX_0x.length());
bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
index 8ee5abb..27ac5fe 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
@@ -20,12 +20,12 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.NullConfiguration;
-import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.config.plugins.validation.ValidatingPluginWithGenericBuilder;
+import org.apache.logging.log4j.plugins.util.PluginBuilder;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.validation.ValidatingPluginWithGenericBuilder;
import org.junit.Before;
import org.junit.Test;
diff --git a/log4j-plugins-java9/pom.xml b/log4j-plugins-java9/pom.xml
new file mode 100644
index 0000000..49f81c6
--- /dev/null
+++ b/log4j-plugins-java9/pom.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ <relativePath>../</relativePath>
+ </parent>
+ <artifactId>log4j-plugins-java9</artifactId>
+ <packaging>pom</packaging>
+ <name>Apache Log4j Plugins Module support</name>
+ <description>Apache Log4j Plugin Moduels Support</description>
+ <properties>
+ <log4jParentDir>${basedir}/..</log4jParentDir>
+ <docLabel>Log4j Plugins Documentation</docLabel>
+ <projectDir>/plugins</projectDir>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-toolchains-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>toolchain</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <toolchains>
+ <jdk>
+ <version>[9, )</version>
+ </jdk>
+ </toolchains>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>default-compile</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>default-test-compile</id>
+ <phase>test-compile</phase>
+ <goals>
+ <goal>testCompile</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <source>9</source>
+ <target>9</target>
+ <release>9</release>
+ <proc>none</proc>
+ <!-- disable errorprone -->
+ <compilerId>javac</compilerId>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <!-- Do not upgrade until https://issues.apache.org/jira/browse/SUREFIRE-720 is fixed -->
+ <version>2.13</version>
+ <executions>
+ <execution>
+ <id>test</id>
+ <phase>test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <systemPropertyVariables>
+ <java.awt.headless>true</java.awt.headless>
+ </systemPropertyVariables>
+ <includes>
+ <include>**/Test*.java</include>
+ <include>**/*Test.java</include>
+ </includes>
+ <excludes>
+ <exclude>**/*FuncTest.java</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>zip</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <finalName>log4j-plugins-java9-${project.version}</finalName>
+ <appendAssemblyId>false</appendAssemblyId>
+ <descriptors>
+ <descriptor>src/assembly/java9.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>${deploy.plugin.version}</version>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
diff --git a/log4j-plugins-java9/src/assembly/java9.xml b/log4j-plugins-java9/src/assembly/java9.xml
new file mode 100644
index 0000000..34649d4
--- /dev/null
+++ b/log4j-plugins-java9/src/assembly/java9.xml
@@ -0,0 +1,40 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+ 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.
+-->
+
+<assembly>
+ <id>src</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+ <baseDirectory>/</baseDirectory>
+ <fileSets>
+ <fileSet>
+ <directory>${project.build.outputDirectory}</directory>
+ <outputDirectory>/classes/META-INF/versions/9</outputDirectory>
+ <includes>
+ <include>module-info.class</include>
+ </includes>
+ <excludes>
+ <exclude>**/Dummy.class</exclude>
+ <exclude>**/PluginService.class</exclude>
+ </excludes>
+ </fileSet>
+ </fileSets>
+</assembly>
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins-java9/src/main/java/module-info.java
similarity index 65%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins-java9/src/main/java/module-info.java
index f22ba49..9802622 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins-java9/src/main/java/module-info.java
@@ -14,10 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
+module org.apache.logging.log4j.plugins {
+ exports org.apache.logging.log4j.plugins;
+ exports org.apache.logging.log4j.plugins.convert;
+ exports org.apache.logging.log4j.plugins.processor;
+ exports org.apache.logging.log4j.plugins.util;
+ exports org.apache.logging.log4j.plugins.validation;
+ exports org.apache.logging.log4j.plugins.visitors;
-/**
- * Validation annotations.
- *
- * @since 2.1
- */
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+ uses org.apache.logging.log4j.plugins.processor.PluginService;
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
similarity index 80%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
index f22ba49..14a90ed 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/Dummy.java
@@ -14,10 +14,11 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
+package org.apache.logging.log4j.plugins;
/**
- * Validation annotations.
- *
- * @since 2.1
+ * This is a dummy class and is only here to allow module-info.java to compile. It will not
+ * be copied into the log4j-api module.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+public class Dummy {
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
similarity index 79%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
index f22ba49..10923e8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/convert/Dummy.java
@@ -14,10 +14,11 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
+package org.apache.logging.log4j.plugins.convert;
/**
- * Validation annotations.
- *
- * @since 2.1
+ * This is a dummy class and is only here to allow module-info.java to compile. It will not
+ * be copied into the log4j-api module.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+public class Dummy {
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
similarity index 79%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
index f22ba49..b93ef59 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
@@ -14,10 +14,11 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
+package org.apache.logging.log4j.plugins.processor;
/**
- * Validation annotations.
- *
- * @since 2.1
+ * This is a dummy class and is only here to allow module-info.java to compile. It will not
+ * be copied into the log4j-api module.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+public class PluginService {
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
similarity index 80%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
index f22ba49..5940b03 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/util/Dummy.java
@@ -14,10 +14,11 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
+package org.apache.logging.log4j.plugins.util;
/**
- * Validation annotations.
- *
- * @since 2.1
+ * This is a dummy class and is only here to allow module-info.java to compile. It will not
+ * be copied into the log4j-api module.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+public class Dummy {
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
similarity index 79%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
index f22ba49..14882b5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/validation/Dummy.java
@@ -14,10 +14,11 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
+package org.apache.logging.log4j.plugins.validation;
/**
- * Validation annotations.
- *
- * @since 2.1
+ * This is a dummy class and is only here to allow module-info.java to compile. It will not
+ * be copied into the log4j-api module.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+public class Dummy {
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
similarity index 79%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
index f22ba49..5596338 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins-java9/src/main/java/org/apache/logging/log4j/plugins/visitors/Dummy.java
@@ -14,10 +14,11 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
+package org.apache.logging.log4j.plugins.visitors;
/**
- * Validation annotations.
- *
- * @since 2.1
+ * This is a dummy class and is only here to allow module-info.java to compile. It will not
+ * be copied into the log4j-api module.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+public class Dummy {
+}
diff --git a/log4j-plugins/pom.xml b/log4j-plugins/pom.xml
new file mode 100644
index 0000000..3551d51
--- /dev/null
+++ b/log4j-plugins/pom.xml
@@ -0,0 +1,360 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ <relativePath>../</relativePath>
+ </parent>
+ <artifactId>log4j-plugins</artifactId>
+ <packaging>jar</packaging>
+ <name>Apache Log4j Plugins</name>
+ <description>Log4j Plugin Support</description>
+ <properties>
+ <log4jParentDir>${basedir}/..</log4jParentDir>
+ <docLabel>Plugin Documentation</docLabel>
+ <projectDir>/plugins</projectDir>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-api</artifactId>
+ </dependency>
+ <!-- Classes and resources to be shaded into the core jar -->
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-plugins-java9</artifactId>
+ <scope>provided</scope>
+ <type>zip</type>
+ </dependency>
+ <!-- Used for OSGi bundle support -->
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- TEST DEPENDENCIES -->
+
+ <!-- Pull in useful test classes from API -->
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-api</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-all</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>3.0.2</version>
+ <executions>
+ <execution>
+ <id>unpack-classes</id>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-plugins-java9</artifactId>
+ <version>${project.version}</version>
+ <type>zip</type>
+ <overWrite>false</overWrite>
+ </artifactItem>
+ </artifactItems>
+ <includes>**/*.class</includes>
+ <excludes>**/*.java</excludes>
+ <outputDirectory>${project.build.directory}</outputDirectory>
+ <overWriteReleases>false</overWriteReleases>
+ <overWriteSnapshots>true</overWriteSnapshots>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <executions>
+ <execution>
+ <!-- disable annotation processing for first pass -->
+ <id>generate-plugins</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ <configuration>
+ <excludes>
+ <exclude>module-info.java</exclude>
+ </excludes>
+ </configuration>
+ </execution>
+ <execution>
+ <!-- disable annotation processing for first pass -->
+ <id>generate-test-plugins</id>
+ <phase>generate-test-sources</phase>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ <configuration>
+ <excludes>
+ <exclude>module-info.java</exclude>
+ </excludes>
+ <proc>only</proc>
+ </configuration>
+ </execution>
+ <execution>
+ <!-- disable annotation processing for first pass -->
+ <id>default-compile</id>
+ <configuration>
+ <excludes>
+ <exclude>module-info.java</exclude>
+ </excludes>
+ <proc>none</proc>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludedGroups>
+ org.apache.logging.log4j.categories.PerformanceTests
+ </excludedGroups>
+ <systemPropertyVariables>
+ <org.apache.activemq.SERIALIZABLE_PACKAGES>*</org.apache.activemq.SERIALIZABLE_PACKAGES>
+ </systemPropertyVariables>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <configuration>
+ <skipTests>true</skipTests>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>default-jar</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ <configuration combine.self="override">
+ <archive>
+ <manifestFile>${manifestfile}</manifestFile>
+ <manifestEntries>
+ <Specification-Title>${project.name}</Specification-Title>
+ <Specification-Version>${project.version}</Specification-Version>
+ <Specification-Vendor>${project.organization.name}</Specification-Vendor>
+ <Implementation-Title>${project.name}</Implementation-Title>
+ <Implementation-Version>${project.version}</Implementation-Version>
+ <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
+ <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
+ <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
+ <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
+ <Automatic-Module-Name>org.apache.logging.log4j.plugins</Automatic-Module-Name>
+ <Multi-Release>true</Multi-Release>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </execution>
+ <execution>
+ <id>default</id>
+ <goals>
+ <goal>test-jar</goal>
+ </goals>
+ <configuration>
+ <archive>
+ <manifestFile>${manifestfile}</manifestFile>
+ <manifestEntries>
+ <Specification-Title>${project.name}</Specification-Title>
+ <Specification-Version>${project.version}</Specification-Version>
+ <Specification-Vendor>${project.organization.name}</Specification-Vendor>
+ <Implementation-Title>${project.name}</Implementation-Title>
+ <Implementation-Version>${project.version}</Implementation-Version>
+ <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
+ <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
+ <X-Compile-Source-JDK>${maven.compiler.source}</X-Compile-Source-JDK>
+ <X-Compile-Target-JDK>${maven.compiler.target}</X-Compile-Target-JDK>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>org.apache.logging.log4j.plugins</Bundle-SymbolicName>
+ <!-- TODO: exclude internal classes from export -->
+ <Export-Package>org.apache.logging.log4j.plugins.*</Export-Package>
+ <Import-Package>
+ sun.reflect;resolution:=optional,
+ org.apache.logging.log4j.util,
+ *
+ </Import-Package>
+ <Bundle-Activator>org.apache.logging.log4j.plugins.osgi.Activator</Bundle-Activator>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-changes-plugin</artifactId>
+ <version>${changes.plugin.version}</version>
+ <reportSets>
+ <reportSet>
+ <reports>
+ <report>changes-report</report>
+ </reports>
+ </reportSet>
+ </reportSets>
+ <configuration>
+ <issueLinkTemplate>%URL%/show_bug.cgi?id=%ISSUE%</issueLinkTemplate>
+ <useJql>true</useJql>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <version>${checkstyle.plugin.version}</version>
+ <configuration>
+ <!--<propertiesLocation>${vfs.parent.dir}/checkstyle.properties</propertiesLocation> -->
+ <configLocation>${log4jParentDir}/checkstyle.xml</configLocation>
+ <suppressionsLocation>${log4jParentDir}/checkstyle-suppressions.xml</suppressionsLocation>
+ <enableRulesSummary>false</enableRulesSummary>
+ <propertyExpansion>basedir=${basedir}</propertyExpansion>
+ <propertyExpansion>licensedir=${log4jParentDir}/checkstyle-header.txt</propertyExpansion>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>${javadoc.plugin.version}</version>
+ <configuration>
+ <failOnError>false</failOnError>
+ <bottom><![CDATA[<p align="center">Copyright © {inceptionYear}-{currentYear} {organizationName}. All Rights Reserved.<br />
+ Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather logo, the Apache Logging project logo,
+ and the Apache Log4j logo are trademarks of The Apache Software Foundation.</p>]]></bottom>
+ <!-- module link generation is completely broken in the javadoc plugin for a multi-module non-aggregating
+ project -->
+ <additionalparam>${javadoc.opts}</additionalparam>
+ <detectOfflineLinks>false</detectOfflineLinks>
+ <linksource>true</linksource>
+ <links>
+ <link>http://docs.oracle.com/javaee/6/api/</link>
+ <link>http://www.osgi.org/javadoc/r4v43/core/</link>
+ <link>https://commons.apache.org/proper/commons-lang/javadocs/api-release/</link>
+ </links>
+ <groups>
+ <group>
+ <title>Core API</title>
+ <packages>org.apache.logging.log4j.core</packages>
+ </group>
+ <group>
+ <title>Configuration</title>
+ <packages>org.apache.logging.log4j.core.config*:org.apache.logging.log4j.core.selector</packages>
+ </group>
+ <group>
+ <title>Core Plugins</title>
+ <packages>org.apache.logging.log4j.core.appender*:org.apache.logging.log4j.core.filter:org.apache.logging.log4j.core.layout:org.apache.logging.log4j.core.lookup:org.apache.logging.log4j.core.pattern:org.apache.logging.log4j.core.script</packages>
+ </group>
+ <group>
+ <title>Tools</title>
+ <packages>org.apache.logging.log4j.core.net*:org.apache.logging.log4j.core.tools</packages>
+ </group>
+ <group>
+ <title>Internals</title>
+ <packages>org.apache.logging.log4j.core.async:org.apache.logging.log4j.core.impl:org.apache.logging.log4j.core.util*:org.apache.logging.log4j.core.osgi:org.apache.logging.log4j.core.jackson:org.apache.logging.log4j.core.jmx</packages>
+ </group>
+ </groups>
+ </configuration>
+ <reportSets>
+ <reportSet>
+ <id>non-aggregate</id>
+ <reports>
+ <report>javadoc</report>
+ </reports>
+ </reportSet>
+ </reportSets>
+ </plugin>
+ <plugin>
+ <groupId>com.github.spotbugs</groupId>
+ <artifactId>spotbugs-maven-plugin</artifactId>
+ <configuration>
+ <fork>true</fork>
+ <jvmArgs>-Duser.language=en</jvmArgs>
+ <threshold>Normal</threshold>
+ <effort>Default</effort>
+ <excludeFilterFile>${log4jParentDir}/spotbugs-exclude-filter.xml</excludeFilterFile>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jxr-plugin</artifactId>
+ <version>${jxr.plugin.version}</version>
+ <reportSets>
+ <reportSet>
+ <id>non-aggregate</id>
+ <reports>
+ <report>jxr</report>
+ </reports>
+ </reportSet>
+ <reportSet>
+ <id>aggregate</id>
+ <reports>
+ <report>aggregate</report>
+ </reports>
+ </reportSet>
+ </reportSets>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-pmd-plugin</artifactId>
+ <version>${pmd.plugin.version}</version>
+ <configuration>
+ <targetJdk>${maven.compiler.target}</targetJdk>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+</project>
+
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
index c92c904..22fd9bf 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Node.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
@@ -14,15 +14,15 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config;
+package org.apache.logging.log4j.plugins;
+
+import org.apache.logging.log4j.plugins.util.PluginType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-
/**
* A Configuration node.
*/
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
index 8aaf117..348754f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/Plugin.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Plugin.java
@@ -14,7 +14,9 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
+
+import org.apache.logging.log4j.util.Strings;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import org.apache.logging.log4j.util.Strings;
-
/**
* Annotation that identifies a Class as a Plugin.
*/
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
similarity index 87%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
index 7be3dea..4dce103 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAliases.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -23,7 +23,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- * Identifies a list of aliases for a {@link Plugin}, {@link PluginAttribute}, or {@link PluginBuilderAttribute}.
+ * Identifies a list of aliases for a Plugin, PluginAttribute, or PluginBuilderAttribute.
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
similarity index 96%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
index bd88220..b9d4684 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginAttribute.java
@@ -14,7 +14,10 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
+
+import org.apache.logging.log4j.plugins.visitors.PluginAttributeVisitor;
+import org.apache.logging.log4j.util.Strings;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -22,9 +25,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import org.apache.logging.log4j.core.config.plugins.visitors.PluginAttributeVisitor;
-import org.apache.logging.log4j.util.Strings;
-
/**
* Identifies a Plugin Attribute and its default value. Note that only one of the defaultFoo attributes will be
* used based on the type this annotation is attached to. Thus, for primitive types, the default<i>Type</i>
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
similarity index 92%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
index 675d78f..c7fce2f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderAttribute.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderAttribute.java
@@ -15,7 +15,10 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
+
+import org.apache.logging.log4j.plugins.visitors.PluginBuilderAttributeVisitor;
+import org.apache.logging.log4j.util.Strings;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -23,9 +26,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import org.apache.logging.log4j.core.config.plugins.visitors.PluginBuilderAttributeVisitor;
-import org.apache.logging.log4j.util.Strings;
-
/**
* Marks a field as a Plugin Attribute.
*/
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
similarity index 95%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
index 4e69262..035b025 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginBuilderFactory.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginBuilderFactory.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
similarity index 91%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
index 7ea358b..6cfb6fa 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginElement.java
@@ -14,7 +14,9 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
+
+import org.apache.logging.log4j.plugins.visitors.PluginElementVisitor;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor;
-
/**
* Identifies a parameter as a Plugin and corresponds with an XML element (or equivalent) in configuration files.
*/
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
similarity index 96%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
index 1c04106..b071510 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginFactory.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginFactory.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
similarity index 90%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
index d60f1b5..b172268 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginNode.java
@@ -14,7 +14,9 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
+
+import org.apache.logging.log4j.plugins.visitors.PluginNodeVisitor;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import org.apache.logging.log4j.core.config.plugins.visitors.PluginNodeVisitor;
-
/**
* Identifies a Plugin configuration Node.
*/
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
similarity index 91%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
index 9c20cc2..31e5a23 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginValue.java
@@ -14,7 +14,9 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
+
+import org.apache.logging.log4j.plugins.visitors.PluginValueVisitor;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -22,8 +24,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import org.apache.logging.log4j.core.config.plugins.visitors.PluginValueVisitor;
-
/**
* Identifies a parameter as a value. These correspond with property values generally, but are meant as values to be
* used as a placeholder value somewhere.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
similarity index 89%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
index 65fcb76..093cc50 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/PluginVisitorStrategy.java
@@ -15,7 +15,9 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins;
+package org.apache.logging.log4j.plugins;
+
+import org.apache.logging.log4j.plugins.visitors.PluginVisitor;
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
@@ -24,8 +26,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor;
-
/**
* Meta-annotation to denote the class name to use that implements
* {@link org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor} for the annotated annotation.
@@ -40,5 +40,5 @@ public @interface PluginVisitorStrategy {
* for the given annotation. The generic type in {@code PluginVisitor} should match the annotation this annotation
* is applied to.
*/
- Class<? extends PluginVisitor<? extends Annotation>> value();
+ Class<? extends PluginVisitor<? extends Annotation, ?>> value();
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
similarity index 95%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
copy to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
index 15a162c..fd8012a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.convert;
+package org.apache.logging.log4j.plugins.convert;
import org.apache.logging.log4j.util.EnglishEnums;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
similarity index 95%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
index e629657..f9037b3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/HexConverter.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/HexConverter.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.convert;
+package org.apache.logging.log4j.plugins.convert;
/**
* Converts Strings to hex. This is used in place of java.xml.bind.DataTypeConverter which is not available by
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
similarity index 95%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
index e67e213..aaa5b4d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.convert;
+package org.apache.logging.log4j.plugins.convert;
/**
* Interface for doing automatic String conversion to a specific type.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
similarity index 92%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
index 5088f15..fb5b27e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistry.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistry.java
@@ -14,7 +14,14 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.convert;
+package org.apache.logging.log4j.plugins.convert;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.util.TypeUtil;
+import org.apache.logging.log4j.util.ReflectionUtil;
+import org.apache.logging.log4j.status.StatusLogger;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@@ -25,13 +32,6 @@ import java.util.UnknownFormatConversionException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.util.ReflectionUtil;
-import org.apache.logging.log4j.core.util.TypeUtil;
-import org.apache.logging.log4j.status.StatusLogger;
-
/**
* Registry for {@link TypeConverter} plugins.
*
@@ -152,7 +152,12 @@ public class TypeConverterRegistry {
}
private void registerTypeAlias(final Type knownType, final Type aliasType) {
- registry.putIfAbsent(aliasType, registry.get(knownType));
+ TypeConverter<?> converter = registry.get(knownType);
+ if (converter != null) {
+ registry.putIfAbsent(aliasType, converter);
+ } else {
+ LOGGER.error("Cannot locate converter for {}", knownType);
+ }
}
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
similarity index 92%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
index dc833f0..7a71b4a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverters.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverters.java
@@ -15,32 +15,27 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.convert;
+package org.apache.logging.log4j.plugins.convert;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.LoaderUtil;
import java.io.File;
import java.math.BigDecimal;
import java.math.BigInteger;
-import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
+import java.net.*;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.Provider;
import java.security.Security;
+import java.util.Base64;
import java.util.UUID;
import java.util.regex.Pattern;
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.appender.rolling.action.Duration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.util.CronExpression;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
-
/**
* Collection of basic TypeConverter implementations. May be used to register additional TypeConverters or find
* registered TypeConverters.
@@ -56,6 +51,8 @@ public final class TypeConverters {
*/
public static final String CATEGORY = "TypeConverter";
+ private static final Base64.Decoder decoder = Base64.getDecoder();
+
/**
* Parses a {@link String} into a {@link BigDecimal}.
*/
@@ -112,7 +109,7 @@ public final class TypeConverters {
bytes = new byte[0];
} else if (value.startsWith(PREFIX_BASE64)) {
final String lexicalXSDBase64Binary = value.substring(PREFIX_BASE64.length());
- bytes = Base64Converter.parseBase64Binary(lexicalXSDBase64Binary);
+ bytes = decoder.decode(lexicalXSDBase64Binary);
} else if (value.startsWith(PREFIX_0x)) {
final String lexicalXSDHexBinary = value.substring(PREFIX_0x.length());
bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
@@ -203,14 +200,6 @@ public final class TypeConverters {
}
}
- @Plugin(name = "CronExpression", category = CATEGORY)
- public static class CronExpressionConverter implements TypeConverter<CronExpression> {
- @Override
- public CronExpression convert(final String s) throws Exception {
- return new CronExpression(s);
- }
- }
-
/**
* Converts a {@link String} into a {@link Double}.
*/
@@ -223,18 +212,6 @@ public final class TypeConverters {
}
/**
- * Converts a {@link String} into a {@link Duration}.
- * @since 2.5
- */
- @Plugin(name = "Duration", category = CATEGORY)
- public static class DurationConverter implements TypeConverter<Duration> {
- @Override
- public Duration convert(final String s) {
- return Duration.parse(s);
- }
- }
-
- /**
* Converts a {@link String} into a {@link File}.
*/
@Plugin(name = "File", category = CATEGORY)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
similarity index 80%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
index f22ba49..958beb4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/package-info.java
@@ -16,8 +16,7 @@
*/
/**
- * Validation annotations.
- *
- * @since 2.1
+ * TypeConverter plugins for converter strings into various types. These plugins are used for parsing plugin
+ * attributes in plugin factory methods.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+package org.apache.logging.log4j.plugins.convert;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
new file mode 100644
index 0000000..518bee7
--- /dev/null
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/Activator.java
@@ -0,0 +1,103 @@
+/*
+ * 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.plugins.osgi;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.plugins.processor.PluginService;
+import org.apache.logging.log4j.plugins.util.PluginRegistry;
+import org.apache.logging.log4j.spi.Provider;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.PropertiesUtil;
+import org.osgi.framework.*;
+import org.osgi.framework.wiring.BundleWiring;
+
+import java.util.Hashtable;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * OSGi BundleActivator.
+ */
+public final class Activator implements BundleActivator, SynchronousBundleListener {
+
+ private static final Logger LOGGER = StatusLogger.getLogger();
+
+ private final AtomicReference<BundleContext> contextRef = new AtomicReference<>();
+
+ ServiceRegistration provideRegistration = null;
+
+ @Override
+ public void start(final BundleContext context) throws Exception {
+ final PluginService pluginService = new Log4jProvider();
+ final Hashtable<String, String> props = new Hashtable<>();
+ props.put("APIVersion", "3.0");
+ provideRegistration = context.registerService(pluginService.class.getName(), provider, props);
+ if (this.contextRef.compareAndSet(null, context)) {
+ context.addBundleListener(this);
+ // done after the BundleListener as to not miss any new bundle installs in the interim
+ scanInstalledBundlesForPlugins(context);
+ }
+ }
+
+ private static void scanInstalledBundlesForPlugins(final BundleContext context) {
+ final Bundle[] bundles = context.getBundles();
+ for (final Bundle bundle : bundles) {
+ // TODO: bundle state can change during this
+ scanBundleForPlugins(bundle);
+ }
+ }
+
+ private static void scanBundleForPlugins(final Bundle bundle) {
+ final long bundleId = bundle.getBundleId();
+ // LOG4J2-920: don't scan system bundle for plugins
+ if (bundle.getState() == Bundle.ACTIVE && bundleId != 0) {
+ LOGGER.trace("Scanning bundle [{}, id=%d] for plugins.", bundle.getSymbolicName(), bundleId);
+ PluginRegistry.getInstance().loadFromBundle(bundleId,
+ bundle.adapt(BundleWiring.class).getClassLoader());
+ }
+ }
+
+ private static void stopBundlePlugins(final Bundle bundle) {
+ LOGGER.trace("Stopping bundle [{}] plugins.", bundle.getSymbolicName());
+ // TODO: plugin lifecycle code
+ PluginRegistry.getInstance().clearBundlePlugins(bundle.getBundleId());
+ }
+
+ @Override
+ public void stop(final BundleContext context) throws Exception {
+ provideRegistration.unregister();
+ this.contextRef.compareAndSet(context, null);
+ }
+
+ @Override
+ public void bundleChanged(final BundleEvent event) {
+ switch (event.getType()) {
+ // FIXME: STARTING instead of STARTED?
+ case BundleEvent.STARTED:
+ scanBundleForPlugins(event.getBundle());
+ break;
+
+ case BundleEvent.STOPPING:
+ stopBundlePlugins(event.getBundle());
+ break;
+
+ default:
+ break;
+ }
+ }
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
similarity index 87%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
index f22ba49..37dadd4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/osgi/package-info.java
@@ -16,8 +16,6 @@
*/
/**
- * Validation annotations.
- *
- * @since 2.1
+ * Collection of OSGi-specific classes for bundles.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+package org.apache.logging.log4j.plugins.osgi;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
similarity index 87%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
index f22ba49..b161185 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/package-info.java
@@ -16,8 +16,6 @@
*/
/**
- * Validation annotations.
- *
- * @since 2.1
+ * Annotations for Log4j 2 plugins.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+package org.apache.logging.log4j.plugins;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
similarity index 71%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
index 2fd4160..784dece 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginCache.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.processor;
+package org.apache.logging.log4j.plugins.processor;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@@ -60,34 +60,6 @@ public class PluginCache {
}
/**
- * 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) 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());
- }
- }
- }
- }
-
- /**
* Loads and merges all the Log4j plugin cache files specified. Usually, this is obtained via a ClassLoader.
*
* @param resources URLs to all the desired plugin cache files to load.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
similarity index 85%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
index dd43601..bd452d3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginEntry.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginEntry.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.processor;
+package org.apache.logging.log4j.plugins.processor;
import java.io.Serializable;
@@ -32,6 +32,18 @@ public class PluginEntry implements Serializable {
private boolean defer;
private transient String category;
+ public PluginEntry() {
+ }
+
+ public PluginEntry(String key, String className, String name, boolean printable, boolean defer, String category) {
+ this.key = key;
+ this.className = className;
+ this.name = name;
+ this.printable = printable;
+ this.defer = defer;
+ this.category = category;
+ }
+
public String getKey() {
return key;
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
similarity index 54%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
index 2f3b53f..975d2ab 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginProcessor.java
@@ -15,38 +15,47 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.processor;
+package org.apache.logging.log4j.plugins.processor;
+
+import org.apache.logging.log4j.LoggingException;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.util.Strings;
-import java.io.IOException;
-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;
import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.Messager;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementVisitor;
+import javax.lang.model.element.Name;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import javax.lang.model.util.SimpleElementVisitor7;
import javax.tools.Diagnostic.Kind;
import javax.tools.FileObject;
+import javax.tools.JavaFileObject;
import javax.tools.StandardLocation;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAliases;
-import org.apache.logging.log4j.util.Strings;
+import static java.nio.charset.StandardCharsets.UTF_8;
/**
* Annotation processor for pre-scanning Log4j 2 plugins.
*/
-@SupportedAnnotationTypes("org.apache.logging.log4j.core.config.plugins.*")
+@SupportedAnnotationTypes({"org.apache.logging.log4j.plugins.*", "org.apache.logging.log4j.core.config.plugins.*"})
public class PluginProcessor extends AbstractProcessor {
// TODO: this could be made more abstract to allow for compile-time and run-time plugin processing
@@ -57,8 +66,8 @@ public class PluginProcessor extends AbstractProcessor {
*/
public static final String PLUGIN_CACHE_FILE =
"META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat";
-
- private final PluginCache pluginCache = new PluginCache();
+ private static final String SERVICE_FILE_NAME =
+ "META-INF/services/org.apache.logging.log4j.plugins.processor.PluginService";
@Override
public SourceVersion getSupportedSourceVersion() {
@@ -67,16 +76,21 @@ public class PluginProcessor extends AbstractProcessor {
@Override
public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
- System.out.println("Processing annotations");
+ Map<String, String> options = processingEnv.getOptions();
+ String packageName = options.get("pluginPackage");
+ Messager messager = processingEnv.getMessager();
+ messager.printMessage(Kind.NOTE, "Processing Log4j annotations");
try {
final Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(Plugin.class);
if (elements.isEmpty()) {
- System.out.println("No elements to process");
+ messager.printMessage(Kind.NOTE, "No elements to process");
return false;
}
- collectPlugins(elements);
- writeCacheFile(elements.toArray(new Element[elements.size()]));
- System.out.println("Annotations processed");
+ List<PluginEntry> list = new ArrayList<>();
+ packageName = collectPlugins(packageName, elements, list);
+ writeClassFile(packageName, list);
+ writeServiceFile(packageName);
+ messager.printMessage(Kind.NOTE, "Annotations processed");
return true;
} catch (final IOException e) {
e.printStackTrace();
@@ -93,7 +107,8 @@ public class PluginProcessor extends AbstractProcessor {
processingEnv.getMessager().printMessage(Kind.ERROR, message);
}
- private void collectPlugins(final Iterable<? extends Element> elements) {
+ private String collectPlugins(String packageName, final Iterable<? extends Element> elements, List<PluginEntry> list) {
+ boolean calculatePackage = packageName == null;
final Elements elementUtils = processingEnv.getElementUtils();
final ElementVisitor<PluginEntry, Plugin> pluginVisitor = new PluginElementVisitor(elementUtils);
final ElementVisitor<Collection<PluginEntry>, Plugin> pluginAliasesVisitor = new PluginAliasesElementVisitor(
@@ -104,23 +119,93 @@ public class PluginProcessor extends AbstractProcessor {
continue;
}
final PluginEntry entry = element.accept(pluginVisitor, plugin);
- final Map<String, PluginEntry> category = pluginCache.getCategory(entry.getCategory());
- category.put(entry.getKey(), entry);
+ list.add(entry);
+ if (calculatePackage) {
+ packageName = calculatePackage(elementUtils, element, packageName);
+ }
final Collection<PluginEntry> entries = element.accept(pluginAliasesVisitor, plugin);
for (final PluginEntry pluginEntry : entries) {
- category.put(pluginEntry.getKey(), pluginEntry);
+ list.add(pluginEntry);
}
}
+ return packageName;
}
- private void writeCacheFile(final Element... elements) throws IOException {
+ private String calculatePackage(Elements elements, Element element, String packageName) {
+ Name name = elements.getPackageOf(element).getQualifiedName();
+ if (name == null) {
+ return null;
+ }
+ String pkgName = name.toString();
+ if (packageName == null) {
+ return pkgName;
+ }
+ if (pkgName.length() == packageName.length()) {
+ return packageName;
+ }
+ if (pkgName.length() < packageName.length() && packageName.startsWith(pkgName)) {
+ return pkgName;
+ }
+
+ return commonPrefix(pkgName, packageName);
+ }
+
+ private void writeServiceFile(String pkgName) 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);
+ SERVICE_FILE_NAME);
+ try (final PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(fileObject.openOutputStream(), UTF_8)))) {
+ writer.println(createFqcn(pkgName));
+ }
+ }
+
+ private void writeClassFile(String pkg, List<PluginEntry> list) {
+ String fqcn = createFqcn(pkg);
+ try (final PrintWriter writer = createSourceFile(fqcn)) {
+ writer.println("package " + pkg + ".plugins;");
+ writer.println("");
+ writer.println("import org.apache.logging.log4j.plugins.processor.PluginEntry;");
+ writer.println("import org.apache.logging.log4j.plugins.processor.PluginService;");
+ writer.println("");
+ writer.println("public class Log4jPlugins extends PluginService {");
+ writer.println("");
+ writer.println(" private static PluginEntry[] entries = new PluginEntry[] {");
+ StringBuilder sb = new StringBuilder();
+ int max = list.size() - 1;
+ for (int i = 0; i < list.size(); ++i) {
+ PluginEntry entry = list.get(i);
+ sb.append(" ").append("new PluginEntry(\"");
+ sb.append(entry.getKey()).append("\", \"");
+ sb.append(entry.getClassName()).append("\", \"");
+ sb.append(entry.getName()).append("\", ");
+ sb.append(entry.isPrintable()).append(", ");
+ sb.append(entry.isDefer()).append(", \"");
+ sb.append(entry.getCategory()).append("\")");
+ if (i < max) {
+ sb.append(",");
+ }
+ writer.println(sb.toString());
+ sb.setLength(0);
+ }
+ writer.println(" };");
+ writer.println(" @Override");
+ writer.println(" public PluginEntry[] getEntries() { return entries;}");
+ writer.println("}");
}
}
+ private PrintWriter createSourceFile(String fqcn) {
+ try {
+ JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(fqcn);
+ return new PrintWriter(sourceFile.openWriter());
+ } catch (IOException e) {
+ throw new LoggingException("Unable to create Plugin Service Class " + fqcn, e);
+ }
+ }
+
+ private String createFqcn(String packageName) {
+ return packageName + ".plugins.Log4jPlugins";
+ }
+
/**
* ElementVisitor to scan the Plugin annotation.
*/
@@ -146,6 +231,20 @@ public class PluginProcessor extends AbstractProcessor {
}
}
+ private String commonPrefix(String str1, String str2) {
+ int minLength = str1.length() < str2.length() ? str1.length() : str2.length();
+ for (int i = 0; i < minLength; i++) {
+ if (str1.charAt(i) != str2.charAt(i)) {
+ if (i > 1 && str1.charAt(i-1) == '.') {
+ return str1.substring(0, i-1);
+ } else {
+ return str1.substring(0, i);
+ }
+ }
+ }
+ return str1.substring(0, minLength);
+ }
+
/**
* ElementVisitor to scan the PluginAliases annotation.
*/
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
new file mode 100644
index 0000000..5042456
--- /dev/null
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/PluginService.java
@@ -0,0 +1,56 @@
+/*
+ * 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.plugins.processor;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Class Description goes here.
+ */
+public abstract class PluginService {
+
+ private final Map<String, Map<String, PluginEntry>> categories = new LinkedHashMap<>();
+
+ public PluginService() {
+ PluginEntry[] entries = getEntries();
+ for (PluginEntry entry : entries) {
+ String category = entry.getCategory().toLowerCase();
+ if (!categories.containsKey(category)) {
+ categories.put(category, new LinkedHashMap<>());
+ }
+ Map<String, PluginEntry> map = categories.get(category);
+ map.put(entry.getKey(), entry);
+ }
+ }
+
+ public abstract PluginEntry[] getEntries();
+
+ public Map<String, Map<String, PluginEntry>> getCategories() {
+ return Collections.unmodifiableMap(categories);
+ }
+
+ public Map<String, PluginEntry> getCategory(String category) {
+ return Collections.unmodifiableMap(categories.get(category.toLowerCase()));
+ }
+
+ public long size() {
+ return categories.size();
+ }
+
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
similarity index 94%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
copy to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
index 4f6ddda..2c296f9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/processor/package-info.java
@@ -19,4 +19,4 @@
* Java annotation processor for pre-scanning Log4j 2 plugins. This is provided as an alternative to using the
* executable {@link org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in your build process.
*/
-package org.apache.logging.log4j.core.config.plugins.processor;
+package org.apache.logging.log4j.plugins.processor;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
similarity index 93%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
index 0935ce8..ec8a07f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Builder.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Builder.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.util;
+package org.apache.logging.log4j.plugins.util;
/**
* A type of builder that can be used to configure and create a instances using a Java DSL instead of
@@ -25,7 +25,7 @@ package org.apache.logging.log4j.core.util;
* <p>
* When creating <em>plugin</em> builders, it is customary to create the builder class as a public static inner class
* called {@code Builder}. For instance, the builder class for
- * {@link org.apache.logging.log4j.core.layout.PatternLayout PatternLayout} would be
+ * org.apache.logging.log4j.core.layout.PatternLayout PatternLayout would be
* {@code PatternLayout.Builder}.
* </p>
*
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
similarity index 96%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
index 6f38d0e..b6f02f5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginManager.java
@@ -15,17 +15,13 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.util;
+package org.apache.logging.log4j.plugins.util;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
similarity index 81%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
index 99fa610..9e8c6e2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
@@ -15,32 +15,28 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.util;
+package org.apache.logging.log4j.plugins.util;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.processor.PluginCache;
+import org.apache.logging.log4j.plugins.processor.PluginEntry;
+import org.apache.logging.log4j.plugins.processor.PluginProcessor;
+import org.apache.logging.log4j.plugins.processor.PluginService;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util.Strings;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference;
-import org.apache.logging.log4j.Logger;
-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;
-import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
-import org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor;
-import org.apache.logging.log4j.core.util.Loader;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.Strings;
-
/**
* Registry singleton for PluginType maps partitioned by source type and then by category names.
*/
@@ -116,7 +112,8 @@ public class PluginRegistry {
// already loaded
return existing;
}
- final Map<String, List<PluginType<?>>> newPluginsByCategory = decodeCacheFiles(Loader.getClassLoader());
+ final Map<String, List<PluginType<?>>> newPluginsByCategory = decodeCacheFiles(LoaderUtil.getClassLoader());
+ loadPlugins(newPluginsByCategory);
// Note multiple threads could be calling this method concurrently. Both will do the work,
// but only one will be allowed to store the result in the AtomicReference.
@@ -144,6 +141,7 @@ public class PluginRegistry {
return existing;
}
final Map<String, List<PluginType<?>>> newPluginsByCategory = decodeCacheFiles(loader);
+ loadPlugins(loader, newPluginsByCategory);
// Note multiple threads could be calling this method concurrently. Both will do the work,
// but only one will be allowed to store the result in the outer map.
@@ -155,6 +153,51 @@ public class PluginRegistry {
return newPluginsByCategory;
}
+ /**
+ * @since 3.0
+ */
+ public void loadPlugins(Map<String, List<PluginType<?>>> map) {
+ for (ClassLoader classLoader : LoaderUtil.getClassLoaders()) {
+ try {
+ loadPlugins(classLoader, map);
+ } catch (Throwable ex) {
+ LOGGER.debug("Unable to retrieve provider from ClassLoader {}", classLoader, ex);
+ }
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void loadPlugins(ClassLoader classLoader, Map<String, List<PluginType<?>>> map) {
+ final long startTime = System.nanoTime();
+ final ServiceLoader<PluginService> serviceLoader = ServiceLoader.load(PluginService.class, classLoader);
+ int pluginCount = 0;
+ for (final PluginService pluginService : serviceLoader) {
+ PluginEntry[] entries = pluginService.getEntries();
+ for (PluginEntry entry : entries) {
+ try {
+ final Class<?> clazz = classLoader.loadClass(entry.getClassName());
+ final PluginType<?> type = new PluginType(entry, clazz, entry.getName());
+ String category = entry.getCategory().toLowerCase();
+ if (!map.containsKey(category)) {
+ map.put(category, new ArrayList<>());
+ }
+ List<PluginType<?>> list = map.get(category);
+ list.add(type);
+ ++pluginCount;
+ } catch (final ClassNotFoundException e) {
+ LOGGER.info("Plugin [{}] could not be loaded due to missing classes.", entry.getClassName(), e);
+ }
+ }
+ }
+ final long endTime = System.nanoTime();
+ final DecimalFormat numFormat = new DecimalFormat("#0.000000");
+ final double seconds = (endTime - startTime) * 1e-9;
+ LOGGER.debug("Took {} seconds to load {} plugins from {}",
+ numFormat.format(seconds), pluginCount, classLoader);
+ }
+
private Map<String, List<PluginType<?>>> decodeCacheFiles(final ClassLoader loader) {
final long startTime = System.nanoTime();
final PluginCache cache = new PluginCache();
@@ -214,7 +257,7 @@ public class PluginRegistry {
final long startTime = System.nanoTime();
final ResolverUtil resolver = new ResolverUtil();
- final ClassLoader classLoader = Loader.getClassLoader();
+ final ClassLoader classLoader = LoaderUtil.getClassLoader();
if (classLoader != null) {
resolver.setClassLoader(classLoader);
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
similarity index 92%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
index cc6bc66..c213f64 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginType.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginType.java
@@ -14,16 +14,16 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.util;
+package org.apache.logging.log4j.plugins.util;
-import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry;
+import org.apache.logging.log4j.plugins.processor.PluginEntry;
/**
* Plugin Descriptor. This is a memento object for Plugin annotations paired to their annotated classes.
*
* @param <T> The plug-in class, which can be any kind of class.
- * @see org.apache.logging.log4j.core.config.plugins.Plugin
+ * @see org.apache.logging.log4j.plugins.Plugin
*/
public class PluginType<T> {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
similarity index 97%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
index 73b5fc0..a57356c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
@@ -14,33 +14,24 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.util;
+package org.apache.logging.log4j.plugins.util;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.wiring.BundleWiring;
+
+import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.util.Loader;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.wiring.BundleWiring;
-
/**
* <p>
* ResolverUtil is used to locate classes that are available in the/a class path and meet arbitrary conditions. The two
@@ -126,7 +117,7 @@ public class ResolverUtil {
* @return the ClassLoader that will be used to scan for classes
*/
public ClassLoader getClassLoader() {
- return classloader != null ? classloader : (classloader = Loader.getClassLoader(ResolverUtil.class, null));
+ return classloader != null ? classloader : (classloader = LoaderUtil.getClassLoader(ResolverUtil.class, null));
}
/**
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
new file mode 100644
index 0000000..e2bb462
--- /dev/null
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
@@ -0,0 +1,217 @@
+/*
+ * 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.plugins.util;
+
+import java.lang.reflect.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Utility class for working with Java {@link Type}s and derivatives. This class is adapted heavily from the
+ * <a href="http://projects.spring.io/spring-framework/">Spring Framework</a>, specifically the
+ * <a href="http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/TypeUtils.html">TypeUtils</a>
+ * class.
+ *
+ * @see Type
+ * @see GenericArrayType
+ * @see ParameterizedType
+ * @see WildcardType
+ * @see Class
+ * @since 2.1
+ */
+public final class TypeUtil {
+
+ private TypeUtil() {
+ }
+
+ /**
+ * Gets all declared fields for the given class (including superclasses).
+ *
+ * @param cls the class to examine
+ * @return all declared fields for the given class (including superclasses).
+ * @see Class#getDeclaredFields()
+ */
+ public static List<Field> getAllDeclaredFields(Class<?> cls) {
+ final List<Field> fields = new ArrayList<>();
+ while (cls != null) {
+ for (final Field field : cls.getDeclaredFields()) {
+ fields.add(field);
+ }
+ cls = cls.getSuperclass();
+ }
+ return fields;
+ }
+ /**
+ * Indicates if two {@link Type}s are assignment compatible.
+ *
+ * @param lhs the left hand side to check assignability to
+ * @param rhs the right hand side to check assignability from
+ * @return {@code true} if it is legal to assign a variable of type {@code rhs} to a variable of type {@code lhs}
+ * @see Class#isAssignableFrom(Class)
+ */
+ public static boolean isAssignable(final Type lhs, final Type rhs) {
+ Objects.requireNonNull(lhs, "No left hand side type provided");
+ Objects.requireNonNull(rhs, "No right hand side type provided");
+ if (lhs.equals(rhs)) {
+ return true;
+ }
+ if (Object.class.equals(lhs)) {
+ // everything is assignable to Object
+ return true;
+ }
+ // raw type on left
+ if (lhs instanceof Class<?>) {
+ final Class<?> lhsClass = (Class<?>) lhs;
+ if (rhs instanceof Class<?>) {
+ // no generics involved
+ final Class<?> rhsClass = (Class<?>) rhs;
+ return lhsClass.isAssignableFrom(rhsClass);
+ }
+ if (rhs instanceof ParameterizedType) {
+ // check to see if the parameterized type has the same raw type as the lhs; this is legal
+ final Type rhsRawType = ((ParameterizedType) rhs).getRawType();
+ if (rhsRawType instanceof Class<?>) {
+ return lhsClass.isAssignableFrom((Class<?>) rhsRawType);
+ }
+ }
+ if (lhsClass.isArray() && rhs instanceof GenericArrayType) {
+ // check for compatible array component types
+ return isAssignable(lhsClass.getComponentType(), ((GenericArrayType) rhs).getGenericComponentType());
+ }
+ }
+ // parameterized type on left
+ if (lhs instanceof ParameterizedType) {
+ final ParameterizedType lhsType = (ParameterizedType) lhs;
+ if (rhs instanceof Class<?>) {
+ final Type lhsRawType = lhsType.getRawType();
+ if (lhsRawType instanceof Class<?>) {
+ return ((Class<?>) lhsRawType).isAssignableFrom((Class<?>) rhs);
+ }
+ } else if (rhs instanceof ParameterizedType) {
+ final ParameterizedType rhsType = (ParameterizedType) rhs;
+ return isParameterizedAssignable(lhsType, rhsType);
+ }
+ }
+ // generic array type on left
+ if (lhs instanceof GenericArrayType) {
+ final Type lhsComponentType = ((GenericArrayType) lhs).getGenericComponentType();
+ if (rhs instanceof Class<?>) {
+ // raw type on right
+ final Class<?> rhsClass = (Class<?>) rhs;
+ if (rhsClass.isArray()) {
+ return isAssignable(lhsComponentType, rhsClass.getComponentType());
+ }
+ } else if (rhs instanceof GenericArrayType) {
+ return isAssignable(lhsComponentType, ((GenericArrayType) rhs).getGenericComponentType());
+ }
+ }
+ // wildcard type on left
+ if (lhs instanceof WildcardType) {
+ return isWildcardAssignable((WildcardType) lhs, rhs);
+ }
+ // strange...
+ return false;
+ }
+
+ private static boolean isParameterizedAssignable(final ParameterizedType lhs, final ParameterizedType rhs) {
+ if (lhs.equals(rhs)) {
+ // that was easy
+ return true;
+ }
+ final Type[] lhsTypeArguments = lhs.getActualTypeArguments();
+ final Type[] rhsTypeArguments = rhs.getActualTypeArguments();
+ final int size = lhsTypeArguments.length;
+ if (rhsTypeArguments.length != size) {
+ // clearly incompatible types
+ return false;
+ }
+ for (int i = 0; i < size; i++) {
+ // verify all type arguments are assignable
+ final Type lhsArgument = lhsTypeArguments[i];
+ final Type rhsArgument = rhsTypeArguments[i];
+ if (!lhsArgument.equals(rhsArgument) &&
+ !(lhsArgument instanceof WildcardType &&
+ isWildcardAssignable((WildcardType) lhsArgument, rhsArgument))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private static boolean isWildcardAssignable(final WildcardType lhs, final Type rhs) {
+ final Type[] lhsUpperBounds = getEffectiveUpperBounds(lhs);
+ final Type[] lhsLowerBounds = getEffectiveLowerBounds(lhs);
+ if (rhs instanceof WildcardType) {
+ // oh boy, this scenario requires checking a lot of assignability!
+ final WildcardType rhsType = (WildcardType) rhs;
+ final Type[] rhsUpperBounds = getEffectiveUpperBounds(rhsType);
+ final Type[] rhsLowerBounds = getEffectiveLowerBounds(rhsType);
+ for (final Type lhsUpperBound : lhsUpperBounds) {
+ for (final Type rhsUpperBound : rhsUpperBounds) {
+ if (!isBoundAssignable(lhsUpperBound, rhsUpperBound)) {
+ return false;
+ }
+ }
+ for (final Type rhsLowerBound : rhsLowerBounds) {
+ if (!isBoundAssignable(lhsUpperBound, rhsLowerBound)) {
+ return false;
+ }
+ }
+ }
+ for (final Type lhsLowerBound : lhsLowerBounds) {
+ for (final Type rhsUpperBound : rhsUpperBounds) {
+ if (!isBoundAssignable(rhsUpperBound, lhsLowerBound)) {
+ return false;
+ }
+ }
+ for (final Type rhsLowerBound : rhsLowerBounds) {
+ if (!isBoundAssignable(rhsLowerBound, lhsLowerBound)) {
+ return false;
+ }
+ }
+ }
+ } else {
+ // phew, far less bounds to check
+ for (final Type lhsUpperBound : lhsUpperBounds) {
+ if (!isBoundAssignable(lhsUpperBound, rhs)) {
+ return false;
+ }
+ }
+ for (final Type lhsLowerBound : lhsLowerBounds) {
+ if (!isBoundAssignable(lhsLowerBound, rhs)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ private static Type[] getEffectiveUpperBounds(final WildcardType type) {
+ final Type[] upperBounds = type.getUpperBounds();
+ return upperBounds.length == 0 ? new Type[]{Object.class} : upperBounds;
+ }
+
+ private static Type[] getEffectiveLowerBounds(final WildcardType type) {
+ final Type[] lowerBounds = type.getLowerBounds();
+ return lowerBounds.length == 0 ? new Type[]{null} : lowerBounds;
+ }
+
+ private static boolean isBoundAssignable(final Type lhs, final Type rhs) {
+ return (rhs == null) || ((lhs != null) && isAssignable(lhs, rhs));
+ }
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
similarity index 94%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
index 4f6ddda..fae7580 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/package-info.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/package-info.java
@@ -19,4 +19,4 @@
* Java annotation processor for pre-scanning Log4j 2 plugins. This is provided as an alternative to using the
* executable {@link org.apache.logging.log4j.core.config.plugins.util.PluginManager} class in your build process.
*/
-package org.apache.logging.log4j.core.config.plugins.processor;
+package org.apache.logging.log4j.plugins.util;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
similarity index 81%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
index 0ac2223..4586315 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/Constraint.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/Constraint.java
@@ -14,14 +14,9 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
-import java.lang.annotation.Annotation;
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import java.lang.annotation.*;
/**
* Meta annotation to mark an annotation as a validation constraint. This annotation must specify a
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
similarity index 96%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
index 1d8c0c5..2f638a7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidator.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidator.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
import java.lang.annotation.Annotation;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
similarity index 93%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
index 374c8ec..6236bb6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/ConstraintValidators.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/ConstraintValidators.java
@@ -14,7 +14,9 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
+
+import org.apache.logging.log4j.util.ReflectionUtil;
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
@@ -22,8 +24,6 @@ import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
-import org.apache.logging.log4j.core.util.ReflectionUtil;
-
/**
* Utility class to locate an appropriate {@link ConstraintValidator} implementation for an annotation.
*
@@ -36,7 +36,7 @@ public final class ConstraintValidators {
/**
* Finds all relevant {@link ConstraintValidator} objects from an array of annotations. All validators will be
- * {@link ConstraintValidator#initialize(java.lang.annotation.Annotation) initialized} before being returned.
+ * {@link ConstraintValidator#initialize(Annotation) initialized} before being returned.
*
* @param annotations the annotations to find constraint validators for
* @return a collection of ConstraintValidators for the given annotations
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
similarity index 73%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
index e6f3c56..9b8a75d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/Required.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/Required.java
@@ -15,16 +15,12 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+package org.apache.logging.log4j.plugins.validation.constraints;
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import org.apache.logging.log4j.plugins.validation.Constraint;
+import org.apache.logging.log4j.plugins.validation.validators.RequiredValidator;
-import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
-import org.apache.logging.log4j.core.config.plugins.validation.validators.RequiredValidator;
+import java.lang.annotation.*;
/**
* Marks a plugin builder field or plugin factory parameter as required.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
similarity index 84%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
index c652d40..14dd9a8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidHost.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidHost.java
@@ -14,10 +14,10 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+package org.apache.logging.log4j.plugins.validation.constraints;
-import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
-import org.apache.logging.log4j.core.config.plugins.validation.validators.ValidHostValidator;
+import org.apache.logging.log4j.plugins.validation.Constraint;
+import org.apache.logging.log4j.plugins.validation.validators.ValidHostValidator;
import java.lang.annotation.*;
import java.net.InetAddress;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
similarity index 74%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
index a7c68b1..c4aba16 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/ValidPort.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/ValidPort.java
@@ -14,16 +14,12 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+package org.apache.logging.log4j.plugins.validation.constraints;
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import org.apache.logging.log4j.plugins.validation.Constraint;
+import org.apache.logging.log4j.plugins.validation.validators.ValidPortValidator;
-import org.apache.logging.log4j.core.config.plugins.validation.Constraint;
-import org.apache.logging.log4j.core.config.plugins.validation.validators.ValidPortValidator;
+import java.lang.annotation.*;
/**
* Indicates that a plugin attribute must be a valid port number. A valid port number is an integer between 0 and
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
similarity index 91%
copy from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
copy to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
index f22ba49..298cd5a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/constraints/package-info.java
@@ -20,4 +20,4 @@
*
* @since 2.1
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+package org.apache.logging.log4j.plugins.validation.constraints;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
similarity index 93%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
index 171b25a..15955cb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/package-info.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/package-info.java
@@ -20,4 +20,4 @@
*
* @since 2.1
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
similarity index 86%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
index 98c0a71..9df6d3b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidator.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredValidator.java
@@ -14,17 +14,17 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.validators;
-
-import java.util.Collection;
-import java.util.Map;
+package org.apache.logging.log4j.plugins.validation.validators;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.util.Assert;
+import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.util.Assert;
import org.apache.logging.log4j.status.StatusLogger;
+import java.util.Collection;
+import java.util.Map;
+
/**
* Validator that checks an object for emptiness. Emptiness is defined here as:
* <ul>
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
similarity index 89%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
index 6c01753..41abbfd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidator.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidHostValidator.java
@@ -14,11 +14,11 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.validators;
+package org.apache.logging.log4j.plugins.validation.validators;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
+import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
import org.apache.logging.log4j.status.StatusLogger;
import java.net.InetAddress;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
similarity index 85%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
index a59742c..27e97f0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidator.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
@@ -14,12 +14,12 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.validators;
+package org.apache.logging.log4j.plugins.validation.validators;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
-import org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
+import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
similarity index 92%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
index a8ac560..cfe2041 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/validators/package-info.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/package-info.java
@@ -20,4 +20,4 @@
*
* @since 2.1
*/
-package org.apache.logging.log4j.core.config.plugins.validation.validators;
+package org.apache.logging.log4j.plugins.validation.validators;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
similarity index 84%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
index 560cbe3..b98dc09 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/AbstractPluginVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/AbstractPluginVisitor.java
@@ -15,18 +15,18 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.visitors;
+package org.apache.logging.log4j.plugins.visitors;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
import java.lang.annotation.Annotation;
import java.lang.reflect.Member;
import java.util.Map;
import java.util.Objects;
-
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
-import org.apache.logging.log4j.core.lookup.StrSubstitutor;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.Strings;
+import java.util.function.Function;
/**
* Base class for PluginVisitor implementations. Provides convenience methods as well as all method implementations
@@ -34,7 +34,7 @@ import org.apache.logging.log4j.util.Strings;
*
* @param <A> the Plugin annotation type.
*/
-public abstract class AbstractPluginVisitor<A extends Annotation> implements PluginVisitor<A> {
+public abstract class AbstractPluginVisitor<A extends Annotation, T> implements PluginVisitor<A, T> {
/** Status logger. */
protected static final Logger LOGGER = StatusLogger.getLogger();
@@ -58,10 +58,6 @@ public abstract class AbstractPluginVisitor<A extends Annotation> implements Plu
/**
*
*/
- protected StrSubstitutor substitutor;
- /**
- *
- */
protected Member member;
/**
@@ -75,7 +71,7 @@ public abstract class AbstractPluginVisitor<A extends Annotation> implements Plu
@SuppressWarnings("unchecked")
@Override
- public PluginVisitor<A> setAnnotation(final Annotation anAnnotation) {
+ public PluginVisitor<A, T> setAnnotation(final Annotation anAnnotation) {
final Annotation a = Objects.requireNonNull(anAnnotation, "No annotation was provided");
if (this.clazz.isInstance(a)) {
this.annotation = (A) a;
@@ -84,25 +80,19 @@ public abstract class AbstractPluginVisitor<A extends Annotation> implements Plu
}
@Override
- public PluginVisitor<A> setAliases(final String... someAliases) {
+ public PluginVisitor<A, T> setAliases(final String... someAliases) {
this.aliases = someAliases;
return this;
}
@Override
- public PluginVisitor<A> setConversionType(final Class<?> aConversionType) {
+ public PluginVisitor<A, T> setConversionType(final Class<?> aConversionType) {
this.conversionType = Objects.requireNonNull(aConversionType, "No conversion type class was provided");
return this;
}
@Override
- public PluginVisitor<A> setStrSubstitutor(final StrSubstitutor aSubstitutor) {
- this.substitutor = Objects.requireNonNull(aSubstitutor, "No StrSubstitutor was provided");
- return this;
- }
-
- @Override
- public PluginVisitor<A> setMember(final Member aMember) {
+ public PluginVisitor<A, T> setMember(final Member aMember) {
this.member = aMember;
return this;
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
similarity index 80%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
index f4da42b..fbd28b9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginAttributeVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginAttributeVisitor.java
@@ -15,40 +15,39 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.visitors;
+package org.apache.logging.log4j.plugins.visitors;
-import java.util.Map;
-
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.util.NameUtil;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.util.NameUtil;
import org.apache.logging.log4j.util.StringBuilders;
+import java.util.Map;
+import java.util.function.Function;
+
/**
* PluginVisitor implementation for {@link PluginAttribute}.
*/
-public class PluginAttributeVisitor extends AbstractPluginVisitor<PluginAttribute> {
+public class PluginAttributeVisitor extends AbstractPluginVisitor<PluginAttribute, Object> {
public PluginAttributeVisitor() {
super(PluginAttribute.class);
}
@Override
- public Object visit(final Configuration configuration, final Node node, final LogEvent event,
+ public Object visit(final Object unused, final Node node, final Function<String, String> substitutor,
final StringBuilder log) {
final String name = this.annotation.value();
final Map<String, String> attributes = node.getAttributes();
final String rawValue = removeAttributeValue(attributes, name, this.aliases);
- final String replacedValue = this.substitutor.replace(event, rawValue);
- final Object defaultValue = findDefaultValue(event);
+ final String replacedValue = substitutor.apply(rawValue);
+ final Object defaultValue = findDefaultValue(substitutor);
final Object value = convert(replacedValue, defaultValue);
final Object debugValue = this.annotation.sensitive() ? NameUtil.md5(value + this.getClass().getName()) : value;
StringBuilders.appendKeyDqValue(log, name, debugValue);
return value;
}
- private Object findDefaultValue(final LogEvent event) {
+ private Object findDefaultValue(Function<String, String> substitutor) {
if (this.conversionType == int.class || this.conversionType == Integer.class) {
return this.annotation.defaultInt();
}
@@ -76,6 +75,6 @@ public class PluginAttributeVisitor extends AbstractPluginVisitor<PluginAttribut
if (this.conversionType == Class.class) {
return this.annotation.defaultClass();
}
- return this.substitutor.replace(event, this.annotation.defaultString());
+ return substitutor.apply(this.annotation.defaultString());
}
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
similarity index 74%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
index e951456..398ff1c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginBuilderAttributeVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginBuilderAttributeVisitor.java
@@ -15,38 +15,37 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.visitors;
+package org.apache.logging.log4j.plugins.visitors;
-import java.util.Map;
-
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.util.NameUtil;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.util.NameUtil;
import org.apache.logging.log4j.util.StringBuilders;
+import java.util.Map;
+import java.util.function.Function;
+
/**
* PluginVisitor for PluginBuilderAttribute. If {@code null} is returned for the
- * {@link #visit(org.apache.logging.log4j.core.config.Configuration, org.apache.logging.log4j.core.config.Node, org.apache.logging.log4j.core.LogEvent, StringBuilder)}
+ * {@link #visit(org.apache.logging.log4j.core.config.Configuration, org.apache.logging.log4j.plugins.Node, org.apache.logging.log4j.core.LogEvent, StringBuilder)}
* method, then the default value of the field should remain untouched.
*
* @see org.apache.logging.log4j.core.config.plugins.util.PluginBuilder
*/
-public class PluginBuilderAttributeVisitor extends AbstractPluginVisitor<PluginBuilderAttribute> {
+public class PluginBuilderAttributeVisitor extends AbstractPluginVisitor<PluginBuilderAttribute, Object> {
public PluginBuilderAttributeVisitor() {
super(PluginBuilderAttribute.class);
}
@Override
- public Object visit(final Configuration configuration, final Node node, final LogEvent event,
+ public Object visit(final Object unused, final Node node, final Function<String, String> substitutor,
final StringBuilder log) {
final String overridden = this.annotation.value();
final String name = overridden.isEmpty() ? this.member.getName() : overridden;
final Map<String, String> attributes = node.getAttributes();
final String rawValue = removeAttributeValue(attributes, name, this.aliases);
- final String replacedValue = this.substitutor.replace(event, rawValue);
+ final String replacedValue = substitutor.apply(rawValue);
final Object value = convert(replacedValue, null);
final Object debugValue = this.annotation.sensitive() ? NameUtil.md5(value + this.getClass().getName()) : value;
StringBuilders.appendKeyDqValue(log, name, debugValue);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
similarity index 90%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
index 2e6e6ef..f8197f1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginElementVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginElementVisitor.java
@@ -15,30 +15,29 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.visitors;
+package org.apache.logging.log4j.plugins.visitors;
+
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.util.PluginType;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
-
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
+import java.util.function.Function;
/**
* PluginVisitor implementation for {@link PluginElement}. Supports arrays as well as singular values.
*/
-public class PluginElementVisitor extends AbstractPluginVisitor<PluginElement> {
+public class PluginElementVisitor extends AbstractPluginVisitor<PluginElement, Object> {
public PluginElementVisitor() {
super(PluginElement.class);
}
@Override
- public Object visit(final Configuration configuration, final Node node, final LogEvent event,
+ public Object visit(final Object unused, final Node node, final Function<String, String> substitutor,
final StringBuilder log) {
final String name = this.annotation.value();
if (this.conversionType.isArray()) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
similarity index 77%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
index 7f15392..9438b39 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginNodeVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginNodeVisitor.java
@@ -15,23 +15,23 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.visitors;
+package org.apache.logging.log4j.plugins.visitors;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.PluginNode;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.PluginNode;
+
+import java.util.function.Function;
/**
* PluginVisitor implementation for {@link PluginNode}.
*/
-public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode> {
+public class PluginNodeVisitor extends AbstractPluginVisitor<PluginNode, Object> {
public PluginNodeVisitor() {
super(PluginNode.class);
}
@Override
- public Object visit(final Configuration configuration, final Node node, final LogEvent event,
+ public Object visit(final Object unused, final Node node, final Function<String, String> substitutor,
final StringBuilder log) {
if (this.conversionType.isInstance(node)) {
log.append("Node=").append(node.getName());
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
similarity index 79%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
index 8544570..2f68f04 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginValueVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginValueVisitor.java
@@ -15,26 +15,26 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.visitors;
+package org.apache.logging.log4j.plugins.visitors;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.PluginValue;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.PluginValue;
import org.apache.logging.log4j.util.StringBuilders;
import org.apache.logging.log4j.util.Strings;
+import java.util.function.Function;
+
/**
* PluginVisitor implementation for {@link PluginValue}.
*/
-public class PluginValueVisitor extends AbstractPluginVisitor<PluginValue> {
+public class PluginValueVisitor extends AbstractPluginVisitor<PluginValue, Object> {
public PluginValueVisitor() {
super(PluginValue.class);
}
@Override
- public Object visit(final Configuration configuration, final Node node, final LogEvent event,
- final StringBuilder log) {
+ public Object visit(final Object unused, final Node node, final Function<String, String> substitutor,
+ final StringBuilder log) {
final String name = this.annotation.value();
final String elementValue = node.getValue();
final String attributeValue = node.getAttributes().get("value");
@@ -49,7 +49,7 @@ public class PluginValueVisitor extends AbstractPluginVisitor<PluginValue> {
} else {
rawValue = removeAttributeValue(node.getAttributes(), "value");
}
- final String value = this.substitutor.replace(event, rawValue);
+ final String value = substitutor.apply(rawValue);
StringBuilders.appendKeyDqValue(log, name, value);
return value;
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
similarity index 68%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
index 34e2b78..fb7aca4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitor.java
@@ -15,15 +15,13 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.visitors;
+package org.apache.logging.log4j.plugins.visitors;
+
+import org.apache.logging.log4j.plugins.Node;
import java.lang.annotation.Annotation;
import java.lang.reflect.Member;
-
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.lookup.StrSubstitutor;
+import java.util.function.Function;
/**
* Visitor strategy for parsing data from a {@link Node}, doing any relevant type conversion, and returning a
@@ -31,7 +29,7 @@ import org.apache.logging.log4j.core.lookup.StrSubstitutor;
*
* @param <A> the Annotation type.
*/
-public interface PluginVisitor<A extends Annotation> {
+public interface PluginVisitor<A extends Annotation, T> {
/**
* Sets the Annotation to be used for this. If the given Annotation is not compatible with this class's type, then
@@ -41,7 +39,7 @@ public interface PluginVisitor<A extends Annotation> {
* @return {@code this}.
* @throws NullPointerException if the argument is {@code null}.
*/
- PluginVisitor<A> setAnnotation(Annotation annotation);
+ PluginVisitor<A, T> setAnnotation(Annotation annotation);
/**
* Sets the list of aliases to use for this visit. No aliases are required, however.
@@ -49,7 +47,7 @@ public interface PluginVisitor<A extends Annotation> {
* @param aliases the list of aliases to use.
* @return {@code this}.
*/
- PluginVisitor<A> setAliases(String... aliases);
+ PluginVisitor<A, T> setAliases(String... aliases);
/**
* Sets the class to convert the plugin value to on this visit. This should correspond with a class obtained from
@@ -59,17 +57,7 @@ public interface PluginVisitor<A extends Annotation> {
* @return {@code this}.
* @throws NullPointerException if the argument is {@code null}.
*/
- PluginVisitor<A> setConversionType(Class<?> conversionType);
-
- /**
- * Sets the StrSubstitutor to use for converting raw strings before type conversion. Generally obtained from a
- * {@link org.apache.logging.log4j.core.config.Configuration}.
- *
- * @param substitutor the StrSubstitutor to use on plugin values.
- * @return {@code this}.
- * @throws NullPointerException if the argument is {@code null}.
- */
- PluginVisitor<A> setStrSubstitutor(StrSubstitutor substitutor);
+ PluginVisitor<A, T> setConversionType(Class<?> conversionType);
/**
* Sets the Member that this visitor is being used for injection upon. For instance, this could be the Field
@@ -79,16 +67,16 @@ public interface PluginVisitor<A extends Annotation> {
* @param member the member this visitor is parsing a value for.
* @return {@code this}.
*/
- PluginVisitor<A> setMember(Member member);
+ PluginVisitor<A, T> setMember(Member member);
/**
* Visits a Node to obtain a value for constructing a Plugin object.
*
* @param configuration the current Configuration.
* @param node the current Node corresponding to the Plugin object being created.
- * @param event the current LogEvent that caused this Plugin object to be made (optional).
- * @param log the StringBuilder being used to build a debug message.
+ * @param substitutor the function to perform String substitutions.
+ * @param log th e StringBuilder being used to build a debug message.
* @return the converted value to be used for Plugin creation.
*/
- Object visit(Configuration configuration, Node node, LogEvent event, StringBuilder log);
+ Object visit(T configuration, Node node, Function<String, String> substitutor, StringBuilder log);
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
similarity index 86%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
index 10ee0df..695d387 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/PluginVisitors.java
@@ -15,14 +15,14 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.visitors;
-
-import java.lang.annotation.Annotation;
+package org.apache.logging.log4j.plugins.visitors;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.PluginVisitorStrategy;
+import org.apache.logging.log4j.plugins.PluginVisitorStrategy;
import org.apache.logging.log4j.status.StatusLogger;
+import java.lang.annotation.Annotation;
+
/**
* Utility class to locate an appropriate {@link PluginVisitor} implementation for an annotation.
*/
@@ -41,13 +41,13 @@ public final class PluginVisitors {
* @param annotation the Plugin annotation class to find a PluginVisitor for.
* @return a PluginVisitor instance if one could be created, or {@code null} otherwise.
*/
- public static PluginVisitor<? extends Annotation> findVisitor(final Class<? extends Annotation> annotation) {
+ public static <T> PluginVisitor<? extends Annotation, T> findVisitor(final Class<? extends Annotation> annotation) {
final PluginVisitorStrategy strategy = annotation.getAnnotation(PluginVisitorStrategy.class);
if (strategy == null) {
return null;
}
try {
- return strategy.value().newInstance();
+ return (PluginVisitor<? extends Annotation, T>) strategy.value().newInstance();
} catch (final Exception e) {
LOGGER.error("Error loading PluginVisitor [{}] for annotation [{}].", strategy.value(), annotation, e);
return null;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
similarity index 67%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
rename to log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
index f22ba49..0855b16 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/validation/constraints/package-info.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visitors/package-info.java
@@ -16,8 +16,9 @@
*/
/**
- * Validation annotations.
- *
- * @since 2.1
+ * Visitor classes for extracting values from a Configuration or Node corresponding to a plugin annotation.
+ * Visitor implementations must implement {@link org.apache.logging.log4j.plugins.visitors.PluginVisitor},
+ * and the corresponding annotation must be annotated with
+ * {@link org.apache.logging.log4j.plugins.PluginVisitorStrategy}.
*/
-package org.apache.logging.log4j.core.config.plugins.validation.constraints;
+package org.apache.logging.log4j.plugins.visitors;
diff --git a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
similarity index 91%
rename from log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
rename to log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
index bb9dcb9..5d6951a 100644
--- a/log4j-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
+++ b/log4j-plugins/src/main/resources/META-INF/services/javax.annotation.processing.Processor
@@ -14,4 +14,4 @@
# See the license for the specific language governing permissions and
# limitations under the license.
#
-org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor
+org.apache.logging.log4j.plugins.processor.PluginProcessor
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
similarity index 97%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
index f9e757d..6e4b059 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConverterRegistryTest.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/convert/TypeConverterRegistryTest.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.convert;
+package org.apache.logging.log4j.plugins.convert;
import org.junit.Test;
@@ -63,7 +63,7 @@ public class TypeConverterRegistryTest {
// TODO: is there a specific converter this should return?
}
- public static enum Foo {
+ public enum Foo {
I, PITY, THE
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
similarity index 84%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
index f4ceb41..48ea7dc 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/FakePlugin.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/FakePlugin.java
@@ -15,10 +15,10 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.processor;
+package org.apache.logging.log4j.plugins.processor;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
/**
* Test plugin class for unit tests.
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
similarity index 75%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
index 9c37af4..034705c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/processor/PluginProcessorTest.java
@@ -15,17 +15,19 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.processor;
+package org.apache.logging.log4j.plugins.processor;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.net.URL;
+import java.util.ArrayList;
import java.util.Enumeration;
+import java.util.List;
import java.util.Map;
import static org.junit.Assert.*;
@@ -33,29 +35,29 @@ import static org.junit.Assert.*;
@RunWith(JUnit4.class)
public class PluginProcessorTest {
- private static final PluginCache pluginCache = new PluginCache();
+ private static PluginService pluginService;
private final Plugin p = FakePlugin.class.getAnnotation(Plugin.class);
@BeforeClass
public static void setUpClass() throws Exception {
- final Enumeration<URL> resources =
- PluginProcessor.class.getClassLoader().getResources(PluginProcessor.PLUGIN_CACHE_FILE);
- pluginCache.loadCacheFiles(resources);
+ Class<?> clazz = PluginProcessor.class.getClassLoader().loadClass("org.apache.logging.log4j.plugins.plugins.Log4jPlugins");
+ assertNotNull("Could not locate plugins class", clazz);
+ pluginService = (PluginService) clazz.getDeclaredConstructor().newInstance();;
}
@Test
public void testTestCategoryFound() throws Exception {
assertNotNull("No plugin annotation on FakePlugin.", p);
- final Map<String, PluginEntry> testCategory = pluginCache.getCategory(p.category());
- assertNotEquals("No plugins were found.", 0, pluginCache.size());
+ final Map<String, PluginEntry> testCategory = pluginService.getCategory(p.category());
+ assertNotEquals("No plugins were found.", 0, pluginService.size());
assertNotNull("The category '" + p.category() + "' was not found.", testCategory);
assertFalse(testCategory.isEmpty());
}
@Test
public void testFakePluginFoundWithCorrectInformation() throws Exception {
- final PluginEntry fake = pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
+ final PluginEntry fake = pluginService.getCategory(p.category()).get(p.name().toLowerCase());
verifyFakePluginEntry(p.name(), fake);
}
@@ -63,7 +65,7 @@ public class PluginProcessorTest {
public void testFakePluginAliasesContainSameInformation() throws Exception {
final PluginAliases aliases = FakePlugin.class.getAnnotation(PluginAliases.class);
for (final String alias : aliases.value()) {
- final PluginEntry fake = pluginCache.getCategory(p.category()).get(alias.toLowerCase());
+ final PluginEntry fake = pluginService.getCategory(p.category()).get(alias.toLowerCase());
verifyFakePluginEntry(alias, fake);
}
}
@@ -81,7 +83,7 @@ public class PluginProcessorTest {
@Test
public void testNestedPlugin() throws Exception {
final Plugin p = FakePlugin.Nested.class.getAnnotation(Plugin.class);
- final PluginEntry nested = pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
+ final PluginEntry nested = pluginService.getCategory(p.category()).get(p.name().toLowerCase());
assertNotNull(nested);
assertEquals(p.name().toLowerCase(), nested.getKey());
assertEquals(FakePlugin.Nested.class.getName(), nested.getClassName());
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
similarity index 93%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
index 33e0ee1..d0b35d1 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilCustomProtocolTest.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilCustomProtocolTest.java
@@ -15,27 +15,21 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.util;
+package org.apache.logging.log4j.plugins.util;
-import static org.junit.Assert.assertEquals;
+import org.apache.logging.log4j.junit.CleanFolders;
+import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
import java.io.IOException;
-import java.net.Proxy;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.net.URLConnection;
-import java.net.URLStreamHandler;
-import java.net.URLStreamHandlerFactory;
+import java.net.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
-import org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
-import org.apache.logging.log4j.junit.CleanFolders;
-import org.apache.logging.log4j.junit.URLStreamHandlerFactoryRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.RuleChain;
+import static org.junit.Assert.assertEquals;
/**
* Tests the ResolverUtil class for custom protocol like bundleresource, vfs, vfszip.
@@ -187,9 +181,9 @@ public class ResolverUtilCustomProtocolTest {
final ResolverUtil resolverUtil = new ResolverUtil();
resolverUtil
.setClassLoader(new SingleURLClassLoader(new URL("vfs:/" + ResolverUtilTest.WORK_DIR + "/resolverutil3/customplugin3/"), cl));
- resolverUtil.findInPackage(new PluginTest(), "customplugin3");
+ resolverUtil.findInPackage(new PluginRegistry.PluginTest(), "customplugin3");
assertEquals("Class not found in packages", 1, resolverUtil.getClasses().size());
- assertEquals("Unexpected class resolved", cl.loadClass("customplugin3.FixedString3Layout"),
+ assertEquals("Unexpected class resolved", cl.loadClass("customplugin3.FixedString3"),
resolverUtil.getClasses().iterator().next());
}
}
@@ -200,9 +194,9 @@ public class ResolverUtilCustomProtocolTest {
final ResolverUtil resolverUtil = new ResolverUtil();
resolverUtil.setClassLoader(new SingleURLClassLoader(
new URL("vfs:/" + ResolverUtilTest.WORK_DIR + "/resolverutil4/customplugin4.jar/customplugin4/"), cl));
- resolverUtil.findInPackage(new PluginTest(), "customplugin4");
+ resolverUtil.findInPackage(new PluginRegistry.PluginTest(), "customplugin4");
assertEquals("Class not found in packages", 1, resolverUtil.getClasses().size());
- assertEquals("Unexpected class resolved", cl.loadClass("customplugin4.FixedString4Layout"),
+ assertEquals("Unexpected class resolved", cl.loadClass("customplugin4.FixedString4"),
resolverUtil.getClasses().iterator().next());
}
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
similarity index 82%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
index 1c6371b..361fe7b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtilTest.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/util/ResolverUtilTest.java
@@ -15,33 +15,25 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.util;
+package org.apache.logging.log4j.plugins.util;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.nio.file.FileSystem;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardCopyOption;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.PluginTest;
import org.apache.logging.log4j.junit.CleanFolders;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
+import javax.tools.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.*;
+import java.nio.file.*;
+import java.util.*;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
+
/**
* Tests the ResolverUtil class.
*/
@@ -67,6 +59,7 @@ public class ResolverUtilTest {
private void testExtractPathFromJarUrlNotDecodedIfFileExists(final String existingFile)
throws MalformedURLException, UnsupportedEncodingException, URISyntaxException {
URL url = ResolverUtilTest.class.getResource(existingFile);
+ assertNotNull("No url returned for " + existingFile, url);
if (!url.getProtocol().equals("jar")) {
// create fake jar: URL that resolves to existing file
url = new URL("jar:" + url.toExternalForm() + "!/some/entry");
@@ -152,9 +145,9 @@ public class ResolverUtilTest {
try (final URLClassLoader cl = compileAndCreateClassLoader("1")) {
final ResolverUtil resolverUtil = new ResolverUtil();
resolverUtil.setClassLoader(cl);
- resolverUtil.findInPackage(new PluginTest(), "customplugin1");
+ resolverUtil.findInPackage(new PluginRegistry.PluginTest(), "customplugin1");
assertEquals("Class not found in packages", 1, resolverUtil.getClasses().size());
- assertEquals("Unexpected class resolved", cl.loadClass("customplugin1.FixedString1Layout"),
+ assertEquals("Unexpected class resolved", cl.loadClass("customplugin1.FixedString1"),
resolverUtil.getClasses().iterator().next());
}
}
@@ -164,9 +157,9 @@ public class ResolverUtilTest {
try (final URLClassLoader cl = compileJarAndCreateClassLoader("2")) {
final ResolverUtil resolverUtil = new ResolverUtil();
resolverUtil.setClassLoader(cl);
- resolverUtil.findInPackage(new PluginTest(), "customplugin2");
+ resolverUtil.findInPackage(new PluginRegistry.PluginTest(), "customplugin2");
assertEquals("Class not found in packages", 1, resolverUtil.getClasses().size());
- assertEquals("Unexpected class resolved", cl.loadClass("customplugin2.FixedString2Layout"),
+ assertEquals("Unexpected class resolved", cl.loadClass("customplugin2.FixedString2"),
resolverUtil.getClasses().iterator().next());
}
}
@@ -176,7 +169,7 @@ public class ResolverUtilTest {
final File jarFile = new File(workDir, "customplugin" + suffix + ".jar");
final URI jarURI = jarFile.toURI();
createJar(jarURI, workDir, new File(workDir,
- "customplugin" + suffix + "/FixedString" + suffix + "Layout.class"));
+ "customplugin" + suffix + "/FixedString" + suffix + ".class"));
return URLClassLoader.newInstance(new URL[] {jarURI.toURL()});
}
@@ -186,9 +179,9 @@ public class ResolverUtilTest {
}
static File compile(final String suffix) throws IOException {
- final File orig = new File("target/test-classes/customplugin/FixedStringLayout.java.source");
+ final File orig = new File("target/test-classes/customplugin/FixedString.java.source");
final File workDir = new File(WORK_DIR, "resolverutil" + suffix);
- final File f = new File(workDir, "customplugin" + suffix + "/FixedString" + suffix + "Layout.java");
+ final File f = new File(workDir, "customplugin" + suffix + "/FixedString" + suffix + ".java");
final File parent = f.getParentFile();
if (!parent.exists()) {
assertTrue("Create customplugin" + suffix + " folder KO", f.getParentFile().mkdirs());
@@ -199,7 +192,7 @@ public class ResolverUtilTest {
.replaceAll("customplugin", "customplugin" + suffix);
Files.write(f.toPath(), content.getBytes());
- PluginManagerPackagesTest.compile(f);
+ compile(f);
return workDir;
}
@@ -218,4 +211,29 @@ public class ResolverUtilTest {
}
}
+ static void compile(final File f) throws IOException {
+ // set up compiler
+ final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ final DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
+ final List<String> errors = new ArrayList<>();
+ try (final StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null)) {
+ final Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays
+ .asList(f));
+
+ // compile generated source
+ // (switch off annotation processing: no need to create Log4j2Plugins.dat)
+ final List<String> options = Arrays.asList("-proc:none");
+ compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits).call();
+
+ // check we don't have any compilation errors
+ for (final Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics()) {
+ if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
+ errors.add(String.format("Compile error at line %d, column %d: %s%n", diagnostic.getLineNumber(),
+ diagnostic.getColumnNumber(), diagnostic.getMessage(Locale.getDefault())));
+ }
+ }
+ }
+ assertTrue(errors.toString(), errors.isEmpty());
+ }
+
}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
similarity index 87%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
index 5689e29..0e243f2 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/AbstractPluginWithGenericBuilder.java
@@ -14,10 +14,10 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
/**
*
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
similarity index 78%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
index 34123c0..626798e 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/HostAndPort.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/HostAndPort.java
@@ -14,15 +14,15 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
-import java.net.InetSocketAddress;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
+import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
+import java.net.InetSocketAddress;
@Plugin(name = "HostAndPort", category = "Test")
public class HostAndPort {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
similarity index 81%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
index 3f2b15a..c3fe6c5 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
@@ -14,18 +14,18 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
@Plugin(name = "PluginWithGenericSubclassFoo1Builder", category = "Test")
public class PluginWithGenericSubclassFoo1Builder extends AbstractPluginWithGenericBuilder {
public static class Builder<B extends Builder<B>> extends AbstractPluginWithGenericBuilder.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<PluginWithGenericSubclassFoo1Builder> {
+ implements org.apache.logging.log4j.plugins.util.Builder<PluginWithGenericSubclassFoo1Builder> {
@PluginBuilderFactory
public static <B extends Builder<B>> B newBuilder() {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
similarity index 80%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
index 95a4209..9caf453 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPlugin.java
@@ -14,15 +14,15 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
-import java.util.Objects;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import java.util.Objects;
/**
*
@@ -51,7 +51,7 @@ public class ValidatingPlugin {
return new Builder();
}
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<ValidatingPlugin> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<ValidatingPlugin> {
@PluginBuilderAttribute
@Required(message = "The name given by the builder is null")
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
similarity index 80%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
index 81b9d6f..b0bec53 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithGenericBuilder.java
@@ -14,15 +14,16 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
-import java.util.Objects;
+import org.apache.logging.log4j.plugins.Plugin;
+
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import java.util.Objects;
/**
*
@@ -51,7 +52,7 @@ public class ValidatingPluginWithGenericBuilder {
return new Builder<B>().asBuilder();
}
- public static class Builder<B extends Builder<B>> implements org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithGenericBuilder> {
+ public static class Builder<B extends Builder<B>> implements org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithGenericBuilder> {
@PluginBuilderAttribute
@Required(message = "The name given by the builder is null")
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
similarity index 80%
rename from log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
rename to log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
index 74a6477..256181c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/validation/ValidatingPluginWithTypedBuilder.java
@@ -14,15 +14,15 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.validation;
+package org.apache.logging.log4j.plugins.validation;
-import java.util.Objects;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import java.util.Objects;
/**
*
@@ -51,7 +51,7 @@ public class ValidatingPluginWithTypedBuilder {
return new Builder<>();
}
- public static class Builder<T> implements org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithTypedBuilder> {
+ public static class Builder<T> implements org.apache.logging.log4j.plugins.util.Builder<ValidatingPluginWithTypedBuilder> {
@PluginBuilderAttribute
@Required(message = "The name given by the builder is null")
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
similarity index 52%
rename from log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
rename to log4j-plugins/src/test/resources/customplugin/FixedString.java.source
index 15a162c..85a62ec 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/EnumConverter.java
+++ b/log4j-plugins/src/test/resources/customplugin/FixedString.java.source
@@ -14,25 +14,32 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.config.plugins.convert;
-import org.apache.logging.log4j.util.EnglishEnums;
+package customplugin;
-/**
- * Converts a {@link String} into a {@link Enum}. Returns {@code null} for invalid enum names.
- *
- * @param <E> the enum class to parse.
- * @since 2.1 moved from TypeConverters
- */
-public class EnumConverter<E extends Enum<E>> implements TypeConverter<E> {
- private final Class<E> clazz;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+
+@Plugin(name = "FixedString", category = "Core", elementType = "plugin", printObject = true)
+public class FixedString {
+
+ private String fixedString;
+
+ @PluginFactory
+ public static FixedString create(
+ @PluginAttribute("fixedString") final String fixedString) {
+ return new FixedString(fixedString);
+ }
- public EnumConverter(final Class<E> clazz) {
- this.clazz = clazz;
+ public FixedString(String fixedString) {
+ this.fixedString = fixedString;
}
- @Override
- public E convert(final String s) {
- return EnglishEnums.valueOf(clazz, s);
+ public Map<String, String> getContentFormat() {
+ return Collections.emptyMap();
}
}
diff --git a/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
new file mode 100644
index 0000000..b85475a
--- /dev/null
+++ b/log4j-plugins/src/test/resources/log4j+config+with+plus+characters.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+
+-->
+<Configuration status="OFF" name="XMLConfigTest">
+
+ <Appenders>
+ <List name="List">
+ </List>
+ </Appenders>
+ <Loggers>
+ <Root level="trace">
+ <AppenderRef ref="List"/>
+ </Root>
+ </Loggers>
+
+</Configuration>
\ No newline at end of file
diff --git a/log4j-plugins/src/test/resources/s p a c e s/log4j+config+with+plus+characters.xml b/log4j-plugins/src/test/resources/s p a c e s/log4j+config+with+plus+characters.xml
new file mode 100644
index 0000000..b85475a
--- /dev/null
+++ b/log4j-plugins/src/test/resources/s p a c e s/log4j+config+with+plus+characters.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+
+-->
+<Configuration status="OFF" name="XMLConfigTest">
+
+ <Appenders>
+ <List name="List">
+ </List>
+ </Appenders>
+ <Loggers>
+ <Root level="trace">
+ <AppenderRef ref="List"/>
+ </Root>
+ </Loggers>
+
+</Configuration>
\ No newline at end of file
[logging-log4j2] 02/02: LOG4J2-2621 - Initial commit
Posted by rg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rgoers pushed a commit to branch LOG4J2-2621
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 4455177339c978e4be98d3dc21d2513693c74c82
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Sun Jun 2 13:23:14 2019 -0700
LOG4J2-2621 - Initial commit
---
.../src/main/java/org/apache/log4j/Category.java | 2 +-
.../org/apache/log4j/layout/Log4j1XmlLayout.java | 8 +-
.../log4j/pattern/Log4j1MdcPatternConverter.java | 2 +-
.../log4j/pattern/Log4j1NdcPatternConverter.java | 2 +-
.../java/org/apache/logging/log4j/util/Assert.java | 2 +-
.../logging/log4j/util/InternalException.java | 16 +-
.../org/apache/logging/log4j/util/LoaderUtil.java | 40 +
.../org/apache/logging/log4j/util/NameUtil.java | 2 +-
.../apache/logging/log4j/util/ReflectionUtil.java | 11 +-
.../org/apache/logging/log4j/util/StringMap.java | 2 +-
.../log4j/message/ParameterFormatterTest.java | 2 +-
.../log4j/message/ReusableMessageFactoryTest.java | 2 +-
.../log4j/message/ReusableObjectMessageTest.java | 2 +-
.../log4j/message/ReusableSimpleMessageTest.java | 2 +-
.../logging/log4j/spi/LoggerAdapterTest.java | 2 +-
.../org/apache/logging/log4j/util/AssertTest.java | 3 +-
.../org/apache/logging/log4j/util/CharsTest.java | 2 +-
.../apache/logging/log4j/util/ConstantsTest.java | 2 +-
.../log4j/util/EnvironmentPropertySourceTest.java | 2 +-
.../util/LegacyPropertiesCompatibilityTest.java | 2 +-
.../log4j/util/PropertiesPropertySourceTest.java | 2 +-
.../log4j/util/PropertySourceCamelCaseTest.java | 2 +-
.../log4j/util/PropertySourceTokenizerTest.java | 2 +-
.../log4j/util/SortedArrayStringMapTest.java | 2 +-
.../logging/log4j/util/StringBuildersTest.java | 2 +-
.../org/apache/logging/log4j/util/Unbox1Test.java | 2 +-
.../logging/log4j/util/Unbox2ConfigurableTest.java | 2 +-
.../logging/log4j/cassandra/CassandraAppender.java | 12 +-
.../logging/log4j/cassandra/CassandraManager.java | 2 +-
.../logging/log4j/cassandra/package-info.java | 2 +-
.../logging/log4j/FilterPerformanceComparison.java | 2 +-
.../logging/log4j/PerformanceComparison.java | 2 +-
.../log4j/core/appender/HttpAppenderTest.java | 2 +-
log4j-core/pom.xml | 40 +-
log4j-core/revapi.json | 2082 --------------------
.../org/apache/logging/log4j/core/Appender.java | 6 +-
.../java/org/apache/logging/log4j/core/Filter.java | 2 +-
.../java/org/apache/logging/log4j/core/Layout.java | 2 +-
.../log4j/core/appender/AbstractAppender.java | 6 +-
.../log4j/core/appender/AbstractFileAppender.java | 4 +-
.../appender/AbstractOutputStreamAppender.java | 2 +-
.../logging/log4j/core/appender/AppenderSet.java | 12 +-
.../logging/log4j/core/appender/AsyncAppender.java | 14 +-
.../log4j/core/appender/ConsoleAppender.java | 12 +-
.../log4j/core/appender/CountingNoOpAppender.java | 6 +-
.../log4j/core/appender/FailoverAppender.java | 10 +-
.../log4j/core/appender/FailoversPlugin.java | 6 +-
.../logging/log4j/core/appender/FileAppender.java | 13 +-
.../logging/log4j/core/appender/HttpAppender.java | 15 +-
.../core/appender/MemoryMappedFileAppender.java | 10 +-
.../logging/log4j/core/appender/NullAppender.java | 6 +-
.../log4j/core/appender/OutputStreamAppender.java | 8 +-
.../core/appender/RandomAccessFileAppender.java | 11 +-
.../log4j/core/appender/RollingFileAppender.java | 15 +-
.../appender/RollingRandomAccessFileAppender.java | 13 +-
.../core/appender/ScriptAppenderSelector.java | 12 +-
.../log4j/core/appender/SocketAppender.java | 19 +-
.../log4j/core/appender/SyslogAppender.java | 11 +-
.../log4j/core/appender/WriterAppender.java | 8 +-
.../log4j/core/appender/db/ColumnMapping.java | 12 +-
.../log4j/core/appender/nosql/NoSqlAppender.java | 11 +-
.../rewrite/LoggerNameLevelRewritePolicy.java | 8 +-
.../core/appender/rewrite/MapRewritePolicy.java | 8 +-
.../appender/rewrite/PropertiesRewritePolicy.java | 6 +-
.../core/appender/rewrite/RewriteAppender.java | 8 +-
.../rolling/CompositeTriggeringPolicy.java | 6 +-
.../appender/rolling/CronTriggeringPolicy.java | 6 +-
.../appender/rolling/DefaultRolloverStrategy.java | 10 +-
.../rolling/DirectWriteRolloverStrategy.java | 10 +-
.../appender/rolling/NoOpTriggeringPolicy.java | 4 +-
.../rolling/OnStartupTriggeringPolicy.java | 6 +-
.../rolling/SizeBasedTriggeringPolicy.java | 6 +-
.../rolling/TimeBasedTriggeringPolicy.java | 10 +-
.../core/appender/rolling/action/DeleteAction.java | 8 +-
.../rolling/action/IfAccumulatedFileCount.java | 8 +-
.../rolling/action/IfAccumulatedFileSize.java | 8 +-
.../log4j/core/appender/rolling/action/IfAll.java | 6 +-
.../log4j/core/appender/rolling/action/IfAny.java | 6 +-
.../core/appender/rolling/action/IfFileName.java | 8 +-
.../appender/rolling/action/IfLastModified.java | 8 +-
.../log4j/core/appender/rolling/action/IfNot.java | 6 +-
.../rolling/action/PathSortByModificationTime.java | 6 +-
.../rolling/action/PosixViewAttributeAction.java | 12 +-
.../appender/rolling/action/ScriptCondition.java | 6 +-
.../core/appender/routing/IdlePurgePolicy.java | 6 +-
.../logging/log4j/core/appender/routing/Route.java | 10 +-
.../log4j/core/appender/routing/Routes.java | 12 +-
.../core/appender/routing/RoutingAppender.java | 12 +-
.../core/async/ArrayBlockingQueueFactory.java | 6 +-
.../log4j/core/async/AsyncLoggerConfig.java | 12 +-
.../log4j/core/async/BlockingQueueFactory.java | 2 +-
.../core/async/DisruptorBlockingQueueFactory.java | 8 +-
.../core/async/JCToolsBlockingQueueFactory.java | 8 +-
.../core/async/LinkedTransferQueueFactory.java | 6 +-
.../core/async/ThreadNameCachingStrategy.java | 2 +-
.../log4j/core/config/AbstractConfiguration.java | 30 +-
.../logging/log4j/core/config/AppenderRef.java | 11 +-
.../logging/log4j/core/config/AppendersPlugin.java | 6 +-
.../logging/log4j/core/config/Configuration.java | 1 +
.../log4j/core/config/ConfigurationFactory.java | 8 +-
.../log4j/core/config/CustomLevelConfig.java | 6 +-
.../logging/log4j/core/config/CustomLevels.java | 6 +-
.../log4j/core/config/DefaultAdvertiser.java | 3 +-
.../logging/log4j/core/config/HttpWatcher.java | 4 +-
.../logging/log4j/core/config/LoggerConfig.java | 11 +-
.../logging/log4j/core/config/LoggersPlugin.java | 7 +-
.../log4j/core/config/PropertiesPlugin.java | 8 +-
.../apache/logging/log4j/core/config/Property.java | 9 +-
.../logging/log4j/core/config/ScriptsPlugin.java | 6 +-
.../core/config/builder/api/ComponentBuilder.java | 2 +-
.../config/builder/api/ConfigurationBuilder.java | 2 +-
.../config/builder/impl/BuiltConfiguration.java | 8 +-
.../config/composite/CompositeConfiguration.java | 4 +-
.../config/composite/DefaultMergeStrategy.java | 6 +-
.../log4j/core/config/composite/MergeStrategy.java | 4 +-
.../log4j/core/config/composite/package-info.java | 2 +-
.../log4j/core/config/json/JsonConfiguration.java | 6 +-
.../core/config/json/JsonConfigurationFactory.java | 2 +-
.../core/config/plugins/PluginConfiguration.java | 1 +
.../config/plugins/convert/CoreTypeConverters.java | 410 +---
.../log4j/core/config/plugins/package-info.java | 2 +-
.../core/config/plugins/util/PluginBuilder.java | 71 +-
.../visitors/PluginConfigurationVisitor.java | 10 +-
.../core/config/plugins/visitors/package-info.java | 4 +-
.../properties/PropertiesConfigurationBuilder.java | 2 +-
.../properties/PropertiesConfigurationFactory.java | 2 +-
.../log4j/core/config/xml/XmlConfiguration.java | 6 +-
.../core/config/xml/XmlConfigurationFactory.java | 2 +-
.../core/config/yaml/YamlConfigurationFactory.java | 2 +-
.../logging/log4j/core/filter/AbstractFilter.java | 2 +-
.../log4j/core/filter/AbstractFilterable.java | 2 +-
.../logging/log4j/core/filter/BurstFilter.java | 10 +-
.../logging/log4j/core/filter/CompositeFilter.java | 8 +-
.../log4j/core/filter/DynamicThresholdFilter.java | 10 +-
.../log4j/core/filter/LevelRangeFilter.java | 8 +-
.../logging/log4j/core/filter/MapFilter.java | 10 +-
.../logging/log4j/core/filter/MarkerFilter.java | 8 +-
.../logging/log4j/core/filter/RegexFilter.java | 10 +-
.../logging/log4j/core/filter/ScriptFilter.java | 10 +-
.../log4j/core/filter/StructuredDataFilter.java | 10 +-
.../log4j/core/filter/ThreadContextMapFilter.java | 12 +-
.../logging/log4j/core/filter/ThresholdFilter.java | 8 +-
.../logging/log4j/core/filter/TimeFilter.java | 8 +-
.../logging/log4j/core/filter/package-info.java | 6 +-
.../logging/log4j/core/impl/ExtendedClassInfo.java | 2 +-
.../logging/log4j/core/impl/Log4jLogEvent.java | 2 +-
.../logging/log4j/core/layout/AbstractLayout.java | 2 +-
.../log4j/core/layout/AbstractStringLayout.java | 4 +-
.../logging/log4j/core/layout/GelfLayout.java | 13 +-
.../logging/log4j/core/layout/HtmlLayout.java | 14 +-
.../logging/log4j/core/layout/LoggerFields.java | 10 +-
.../log4j/core/layout/MarkerPatternSelector.java | 12 +-
.../logging/log4j/core/layout/MessageLayout.java | 6 +-
.../logging/log4j/core/layout/PatternLayout.java | 16 +-
.../logging/log4j/core/layout/PatternMatch.java | 10 +-
.../logging/log4j/core/layout/Rfc5424Layout.java | 10 +-
.../log4j/core/layout/ScriptPatternSelector.java | 12 +-
.../logging/log4j/core/layout/SyslogLayout.java | 10 +-
.../logging/log4j/core/layout/package-info.java | 6 +-
.../log4j/core/lookup/ContextMapLookup.java | 2 +-
.../logging/log4j/core/lookup/DateLookup.java | 2 +-
.../log4j/core/lookup/EnvironmentLookup.java | 2 +-
.../logging/log4j/core/lookup/Interpolator.java | 6 +-
.../logging/log4j/core/lookup/JavaLookup.java | 2 +-
.../lookup/JmxRuntimeInputArgumentsLookup.java | 2 +-
.../logging/log4j/core/lookup/JndiLookup.java | 2 +-
.../logging/log4j/core/lookup/Log4jLookup.java | 2 +-
.../logging/log4j/core/lookup/MainMapLookup.java | 2 +-
.../logging/log4j/core/lookup/MapLookup.java | 2 +-
.../logging/log4j/core/lookup/MarkerLookup.java | 2 +-
.../log4j/core/lookup/ResourceBundleLookup.java | 2 +-
.../log4j/core/lookup/StructuredDataLookup.java | 2 +-
.../log4j/core/lookup/SystemPropertiesLookup.java | 2 +-
.../logging/log4j/core/lookup/package-info.java | 2 +-
.../log4j/core/net/MulticastDnsAdvertiser.java | 2 +-
.../logging/log4j/core/net/SocketAddress.java | 14 +-
.../logging/log4j/core/net/SocketOptions.java | 10 +-
.../core/net/SocketPerformancePreferences.java | 10 +-
.../log4j/core/net/ssl/KeyStoreConfiguration.java | 6 +-
.../log4j/core/net/ssl/SslConfiguration.java | 8 +-
.../core/net/ssl/TrustStoreConfiguration.java | 6 +-
.../logging/log4j/core/net/ssl/package-info.java | 2 +-
.../apache/logging/log4j/core/osgi/Activator.java | 2 +-
.../logging/log4j/core/osgi/package-info.java | 2 +-
.../core/pattern/AbstractStyleNameConverter.java | 2 +-
.../core/pattern/ClassNamePatternConverter.java | 2 +-
.../log4j/core/pattern/DatePatternConverter.java | 2 +-
.../core/pattern/EncodingPatternConverter.java | 2 +-
.../core/pattern/EndOfBatchPatternConverter.java | 2 +-
.../EqualsIgnoreCaseReplacementConverter.java | 2 +-
.../core/pattern/EqualsReplacementConverter.java | 2 +-
.../pattern/ExtendedThrowablePatternConverter.java | 2 +-
.../core/pattern/FileDatePatternConverter.java | 2 +-
.../core/pattern/FileLocationPatternConverter.java | 2 +-
.../core/pattern/FullLocationPatternConverter.java | 2 +-
.../log4j/core/pattern/HighlightConverter.java | 2 +-
.../core/pattern/IntegerPatternConverter.java | 2 +-
.../log4j/core/pattern/LevelPatternConverter.java | 2 +-
.../core/pattern/LineLocationPatternConverter.java | 2 +-
.../pattern/LineSeparatorPatternConverter.java | 2 +-
.../core/pattern/LoggerFqcnPatternConverter.java | 2 +-
.../log4j/core/pattern/LoggerPatternConverter.java | 2 +-
.../log4j/core/pattern/MapPatternConverter.java | 2 +-
.../log4j/core/pattern/MarkerPatternConverter.java | 2 +-
.../pattern/MarkerSimpleNamePatternConverter.java | 2 +-
.../log4j/core/pattern/MaxLengthConverter.java | 2 +-
.../log4j/core/pattern/MdcPatternConverter.java | 2 +-
.../core/pattern/MessagePatternConverter.java | 2 +-
.../pattern/MethodLocationPatternConverter.java | 2 +-
.../core/pattern/NanoTimePatternConverter.java | 2 +-
.../log4j/core/pattern/NdcPatternConverter.java | 2 +-
.../logging/log4j/core/pattern/PatternParser.java | 4 +-
.../core/pattern/ProcessIdPatternConverter.java | 2 +-
.../log4j/core/pattern/RegexReplacement.java | 6 +-
.../core/pattern/RegexReplacementConverter.java | 2 +-
.../core/pattern/RelativeTimePatternConverter.java | 2 +-
.../pattern/RootThrowablePatternConverter.java | 2 +-
.../pattern/SequenceNumberPatternConverter.java | 2 +-
.../logging/log4j/core/pattern/StyleConverter.java | 2 +-
.../core/pattern/ThreadIdPatternConverter.java | 2 +-
.../core/pattern/ThreadNamePatternConverter.java | 2 +-
.../pattern/ThreadPriorityPatternConverter.java | 2 +-
.../core/pattern/ThrowablePatternConverter.java | 2 +-
.../log4j/core/pattern/UuidPatternConverter.java | 2 +-
.../VariablesNotEmptyReplacementConverter.java | 2 +-
.../apache/logging/log4j/core/script/Script.java | 10 +-
.../logging/log4j/core/script/ScriptFile.java | 8 +-
.../logging/log4j/core/script/ScriptRef.java | 8 +-
.../log4j/core/util/CloseShieldOutputStream.java | 2 +-
.../logging/log4j/core/util/KeyValuePair.java | 10 +-
.../org/apache/logging/log4j/core/util/Loader.java | 39 +-
.../logging/log4j/core/util/WatcherFactory.java | 4 +-
.../logging/log4j/categories/package-info.java | 2 +-
.../logging/log4j/core/TestPatternConverters.java | 2 +-
.../FileAppenderPermissionsXmlConfigTest.java | 2 +-
.../log4j/core/appender/HangingAppender.java | 10 +-
.../core/appender/MemoryMappedFileManagerTest.java | 2 +-
.../core/appender/OutputStreamManagerTest.java | 2 +-
.../core/appender/ReconfigureAppenderTest.java | 2 +-
.../log4j/core/appender/TlsSyslogFrameTest.java | 2 +-
.../core/appender/rewrite/TestRewritePolicy.java | 4 +-
.../async/AsyncQueueFullPolicyFactoryTest.java | 2 +-
.../logging/log4j/core/async/BlockingAppender.java | 10 +-
.../async/DefaultAsyncQueueFullPolicyTest.java | 2 +-
.../async/DiscardingAsyncQueueFullPolicyTest.java | 2 +-
.../log4j/core/async/Log4j2Jira1688AsyncTest.java | 2 +-
.../log4j/core/async/Log4j2Jira1688Test.java | 2 +-
.../log4j/core/async/QueueFullAbstractTest.java | 2 +-
.../core/async/QueueFullAsyncAppenderTest.java | 2 +-
.../core/async/QueueFullAsyncAppenderTest2.java | 2 +-
...llAsyncLoggerConfigLoggingFromToStringTest.java | 2 +-
...lAsyncLoggerConfigLoggingFromToStringTest2.java | 2 +-
.../core/async/QueueFullAsyncLoggerConfigTest.java | 2 +-
.../async/QueueFullAsyncLoggerConfigTest2.java | 2 +-
...ueueFullAsyncLoggerLoggingFromToStringTest.java | 2 +-
...eueFullAsyncLoggerLoggingFromToStringTest2.java | 2 +-
.../log4j/core/async/QueueFullAsyncLoggerTest.java | 2 +-
.../core/async/QueueFullAsyncLoggerTest2.java | 2 +-
.../core/async/perftest/MultiThreadPerfTest.java | 2 +-
.../core/config/AppenderControlArraySetTest.java | 2 +-
.../log4j/core/config/InMemoryAdvertiser.java | 2 +-
.../log4j/core/config/LoggersPluginTest.java | 2 +-
.../config/plugins/convert/TypeConvertersTest.java | 3 +-
.../plugins/util/PluginManagerPackagesTest.java | 4 +-
.../validators/RequiredValidatorTest.java | 8 +-
.../validators/ValidHostValidatorTest.java | 10 +-
.../validators/ValidPortValidatorTest.java | 10 +-
.../ValidatingPluginWithFailoverTest.java | 6 +-
.../ValidatingPluginWithGenericBuilderTest.java | 2 +-
...ngPluginWithGenericSubclassFoo1BuilderTest.java | 8 +-
.../ValidatingPluginWithTypedBuilderTest.java | 8 +-
.../log4j/core/filter/AbstractFilterTest.java | 2 +-
...taFactoryPropertySetMissingConstructorTest.java | 2 +-
.../impl/ContextDataFactoryPropertySetTest.java | 2 +-
.../log4j/core/impl/ContextDataFactoryTest.java | 2 +-
.../core/impl/JdkMapAdapterStringMapTest.java | 2 +-
.../logging/log4j/core/impl/Log4jLogEventTest.java | 6 +-
.../log4j/core/impl/MutableLogEventTest.java | 2 +-
.../core/impl/NestedLoggingFromToStringTest.java | 2 +-
.../core/impl/ReusableLogEventFactoryTest.java | 2 +-
.../log4j/core/impl/ThrowableProxyTest.java | 9 +-
.../core/layout/AbstractStringLayoutTest.java | 2 +-
.../log4j/core/layout/Log4j2_1482_Test.java | 2 +-
.../core/layout/StringBuilderEncoderTest.java | 2 +-
.../log4j/core/lookup/MarkerLookupTest.java | 2 +-
.../message/ExtendedThreadInformationTest.java | 2 +-
.../log4j/core/net/mock/MockTlsSyslogServer.java | 2 +-
.../log4j/core/net/mock/MockUdpSyslogServer.java | 2 +-
.../net/ssl/EnvironmentPasswordProviderTest.java | 2 +-
.../net/ssl/TlsSyslogInputStreamReaderBase.java | 2 +-
.../log4j/core/pattern/HighlightConverterTest.java | 2 +-
.../pattern/ProcessIdPatternConverterTest.java | 2 +-
.../selector/ClassLoaderContextSelectorTest.java | 2 +-
.../log4j/core/time/MutableInstantTest.java | 2 +-
.../logging/log4j/core/util/FileUtilsTest.java | 2 +-
.../apache/logging/log4j/core/util/LoaderTest.java | 2 +-
.../apache/logging/log4j/junit/package-info.java | 2 +-
.../apache/logging/log4j/test/ExtendedLevels.java | 2 +-
.../log4j/test/appender/AlwaysFailAppender.java | 8 +-
.../log4j/test/appender/BlockingAppender.java | 8 +-
.../log4j/test/appender/DeadlockAppender.java | 8 +-
.../log4j/test/appender/FailOnceAppender.java | 8 +-
.../logging/log4j/test/appender/ListAppender.java | 12 +-
.../log4j/test/appender/UsesLoggingAppender.java | 10 +-
.../logging/log4j/test/layout/BasicLayout.java | 4 +-
.../customplugin/FixedStringLayout.java.source | 6 +-
.../logging/log4j/couchdb/CouchDbProvider.java | 14 +-
.../log4j/csv/layout/CsvLogEventLayout.java | 8 +-
.../log4j/csv/layout/CsvParameterLayout.java | 8 +-
.../apache/logging/log4j/docker/DockerLookup.java | 2 +-
.../apache/logging/log4j/flume/appender/Agent.java | 6 +-
.../log4j/flume/appender/FlumeAppender.java | 10 +-
.../log4j/flume/appender/FlumeEmbeddedManager.java | 2 +-
.../flume/appender/FlumePersistentManager.java | 4 +-
.../flume/appender/FlumeEmbeddedAgentTest.java | 2 +-
.../appender/FlumePersistentAppenderTest.java | 2 +-
.../log4j/flume/appender/FlumePersistentPerf.java | 2 +-
.../logging/log4j/flume/test/FlumeKeyProvider.java | 2 +-
.../logging/log4j/io/internal/package-info.java | 2 +-
.../appender/PoolableConnectionFactoryConfig.java | 10 +-
.../appender/PoolingDriverConnectionSource.java | 10 +-
.../AbstractDriverManagerConnectionSource.java | 6 +-
.../logging/log4j/jdbc/appender/ColumnConfig.java | 10 +-
.../jdbc/appender/DataSourceConnectionSource.java | 6 +-
.../appender/DriverManagerConnectionSource.java | 6 +-
.../appender/FactoryMethodConnectionSource.java | 6 +-
.../logging/log4j/jdbc/appender/JdbcAppender.java | 16 +-
.../log4j/jdbc/appender/JdbcDatabaseManager.java | 2 +-
.../log4j/jdbc/convert/DateTypeConverterTest.java | 2 +-
.../log4j/jeromq/appender/JeroMqAppender.java | 12 +-
.../log4j/jeromq/appender/JeroMqTestClient.java | 2 +-
.../logging/log4j/jms/appender/JmsAppender.java | 14 +-
.../log4j/jms/appender/JmsAppenderTest.java | 2 +-
.../logging/log4j/jpa/appender/JpaAppender.java | 8 +-
.../apache/logging/log4j/jul/CoreLoggerTest.java | 2 +-
.../logging/log4j/jul/JavaLevelTranslatorTest.java | 2 +-
.../log4j/jul/Log4jLevelTranslatorTest.java | 2 +-
.../log4j/kafka/appender/KafkaAppender.java | 10 +-
.../log4j/kafka/appender/KafkaProducerFactory.java | 2 +-
.../appender/KafkaAppenderCloseTimeoutTest.java | 2 +-
.../log4j/kafka/appender/KafkaAppenderTest.java | 2 +-
.../jackson/json/JsonSetupContextInitializer.java | 2 +-
.../jackson/json/layout/JsonJacksonFactory.java | 2 +-
.../log4j/jackson/json/layout/JsonLayout.java | 12 +-
.../logging/log4j/jackson/xml/XmlMapEntry.java | 2 +-
.../jackson/xml/XmlSetupContextInitializer.java | 2 +-
.../jackson/xml/layout/Log4jXmlPrettyPrinter.java | 2 +-
.../jackson/xml/layout/XmlJacksonFactory.java | 2 +-
.../log4j/jackson/xml/layout/XmlLayout.java | 8 +-
.../jackson/yaml/YamlSetupContextInitializer.java | 2 +-
.../jackson/yaml/layout/YamlJacksonFactory.java | 2 +-
.../log4j/jackson/yaml/layout/YamlLayout.java | 8 +-
.../log4j/jackson/AbstractJacksonLayout.java | 4 +-
.../Log4jStackTraceElementDeserializer.java | 2 +-
.../org/apache/logging/log4j/jackson/MapEntry.java | 2 +-
.../log4j/jackson/SetupContextInitializer.java | 2 +-
.../log4j/jackson/SimpleModuleInitializer.java | 2 +-
.../jackson/layout/AbstractJacksonLayout.java | 4 +-
.../logging/log4j/mongodb2/MongoDbProvider.java | 20 +-
.../logging/log4j/mongodb2/MongoDbTestRule.java | 2 +-
.../logging/log4j/mongodb3/MongoDbProvider.java | 18 +-
.../logging/log4j/mongodb3/MongoDbTestRule.java | 2 +-
.../perf/jmh/SortedArrayVsHashMapBenchmark.java | 2 +-
.../log4j/perf/jmh/ThreadContextBenchmark.java | 2 +-
.../ThreadLocalVsConcurrentHashMapBenchmark.java | 2 +-
.../apache/logging/log4j/perf/nogc/NoGcLayout.java | 2 +-
.../configuration/CustomConfigurationFactory.java | 2 +-
.../apache/logging/log4j/samples/events/Alert.java | 2 +-
.../log4j/samples/events/ChangePassword.java | 2 +-
.../apache/logging/log4j/samples/events/Login.java | 2 +-
.../log4j/samples/events/ScheduledTransaction.java | 2 +-
.../logging/log4j/samples/events/Transfer.java | 2 +-
.../apache/logging/log4j/lookup/CustomLookup.java | 2 +-
.../logging/log4j/lookup/MapMessageLookup.java | 2 +-
.../logging/slf4j/Log4j2_1482_Slf4jTest.java | 2 +-
.../org/apache/logging/slf4j/OverflowTest.java | 2 +-
.../logging/slf4j/Log4j2_1482_Slf4jTest.java | 2 +-
.../org/apache/logging/slf4j/OverflowTest.java | 2 +-
.../logging/log4j/smtp/MimeMessageBuilder.java | 2 +-
.../logging/log4j/smtp/appender/SmtpAppender.java | 12 +-
.../logging/log4j/smtp/appender/SmtpManager.java | 2 +-
.../log4j/smtp/appender/SmtpAppenderAsyncTest.java | 2 +-
.../org/apache/logging/log4j/web/WebLookup.java | 2 +-
.../log4j/web/appender/ServletAppender.java | 8 +-
pom.xml | 22 +-
src/changes/changes.xml | 2 +-
src/site/asciidoc/manual/extending.adoc | 2 +-
387 files changed, 1073 insertions(+), 3525 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
index 873aa0e..c06c5f2 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
@@ -27,7 +27,7 @@ import org.apache.log4j.helpers.NullEnumeration;
import org.apache.log4j.spi.LoggerFactory;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.util.NameUtil;
+import org.apache.logging.log4j.util.NameUtil;
import org.apache.logging.log4j.message.LocalizedMessage;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.ObjectMessage;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
index 9522b9e..8d23307 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
@@ -23,13 +23,13 @@ import java.util.List;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.AbstractStringLayout;
import org.apache.logging.log4j.core.layout.ByteBufferDestination;
import org.apache.logging.log4j.core.util.Transform;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.util.BiConsumer;
import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java
index b4ae0c5..6600322 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.log4j.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import org.apache.logging.log4j.core.pattern.PatternConverter;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1NdcPatternConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1NdcPatternConverter.java
index 405db00..7301799 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1NdcPatternConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1NdcPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.log4j.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import org.apache.logging.log4j.core.pattern.PatternConverter;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
index da7f45a..7a7a925 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Assert.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.util;
+package org.apache.logging.log4j.util;
import java.util.Collection;
import java.util.Map;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
index 8c433db..06472e3 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/InternalException.java
@@ -14,15 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j;
+package org.apache.logging.log4j.util;
/**
- * Exception thrown when an error occurs while logging. In most cases exceptions will be handled
- * within Log4j but certain Appenders may be configured to allow exceptions to propagate to the
- * application. This is a RuntimeException so that the exception may be thrown in those cases without
- * requiring all Logger methods be contained with try/catch blocks.
+ * Exception thrown when an error occurs while accessing internal resources. This is generally used to
+ * convert checked exceptions to runtime exceptions.
*/
-public class LoggingException extends RuntimeException {
+public class InternalException extends RuntimeException {
private static final long serialVersionUID = 6366395965071580537L;
@@ -31,7 +29,7 @@ public class LoggingException extends RuntimeException {
*
* @param message The reason for the exception
*/
- public LoggingException(final String message) {
+ public InternalException(final String message) {
super(message);
}
@@ -41,7 +39,7 @@ public class LoggingException extends RuntimeException {
* @param message The reason for the exception
* @param cause The underlying cause of the exception
*/
- public LoggingException(final String message, final Throwable cause) {
+ public InternalException(final String message, final Throwable cause) {
super(message, cause);
}
@@ -50,7 +48,7 @@ public class LoggingException extends RuntimeException {
*
* @param cause The underlying cause of the exception
*/
- public LoggingException(final Throwable cause) {
+ public InternalException(final Throwable cause) {
super(cause);
}
}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
index 021dcde..962d9e1 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
@@ -77,6 +77,26 @@ public final class LoaderUtil {
}
/**
+ * Returns the ClassLoader to use.
+ * @return the ClassLoader.
+ */
+ public static ClassLoader getClassLoader() {
+ return getClassLoader(LoaderUtil.class, null);
+ }
+
+ // TODO: this method could use some explanation
+ public static ClassLoader getClassLoader(final Class<?> class1, final Class<?> class2) {
+ final ClassLoader threadContextClassLoader = getThreadContextClassLoader();
+ final ClassLoader loader1 = class1 == null ? null : class1.getClassLoader();
+ final ClassLoader loader2 = class2 == null ? null : class2.getClassLoader();
+
+ if (isChild(threadContextClassLoader, loader1)) {
+ return isChild(threadContextClassLoader, loader2) ? threadContextClassLoader : loader2;
+ }
+ return isChild(loader1, loader2) ? loader1 : loader2;
+ }
+
+ /**
* Gets the current Thread ClassLoader. Returns the system ClassLoader if the TCCL is {@code null}. If the system
* ClassLoader is {@code null} as well, then the ClassLoader for this class is returned. If running with a
* {@link SecurityManager} that does not allow access to the Thread ClassLoader or system ClassLoader, then the
@@ -94,6 +114,26 @@ public final class LoaderUtil {
}
/**
+ * Determines if one ClassLoader is a child of another ClassLoader. Note that a {@code null} ClassLoader is
+ * interpreted as the system ClassLoader as per convention.
+ *
+ * @param loader1 the ClassLoader to check for childhood.
+ * @param loader2 the ClassLoader to check for parenthood.
+ * @return {@code true} if the first ClassLoader is a strict descendant of the second ClassLoader.
+ */
+ private static boolean isChild(final ClassLoader loader1, final ClassLoader loader2) {
+ if (loader1 != null && loader2 != null) {
+ ClassLoader parent = loader1.getParent();
+ while (parent != null && parent != loader2) {
+ parent = parent.getParent();
+ }
+ // once parent is null, we're at the system CL, which would indicate they have separate ancestry
+ return parent != null;
+ }
+ return loader1 != null;
+ }
+
+ /**
*
*/
private static class ThreadContextClassLoaderGetter implements PrivilegedAction<ClassLoader> {
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
index 4d4cfcc..31cbf7e 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
@@ -14,7 +14,7 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.util;
+package org.apache.logging.log4j.util;
import java.security.MessageDigest;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
index f00e64a..b49863b 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
@@ -15,7 +15,7 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core.util;
+package org.apache.logging.log4j.util;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
@@ -193,10 +193,13 @@ public final class ReflectionUtil {
} catch (final IllegalAccessException e) {
throw new IllegalStateException(e);
} catch (final InvocationTargetException e) {
- if (e.getCause() instanceof RuntimeException) {
- throw (RuntimeException) e.getCause();
+ if (e.getCause() != null) {
+ if (e.getCause() instanceof RuntimeException) {
+ throw (RuntimeException) e.getCause();
+ }
+ throw new InternalException(e.getCause());
}
- throw new
+ throw new InternalException("Error creating new instance of " + clazz.getName(), e);
}
}
}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringMap.java
index e4ce7e8..ef1c28f 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringMap.java
@@ -95,4 +95,4 @@ public interface StringMap extends ReadOnlyStringMap {
* @throws UnsupportedOperationException if this collection has been {@linkplain #isFrozen() frozen}.
*/
void remove(final String key);
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ParameterFormatterTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ParameterFormatterTest.java
index 6e728f6..8c509b4 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ParameterFormatterTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ParameterFormatterTest.java
@@ -188,4 +188,4 @@ public class ParameterFormatterTest {
final String expected = list.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(list));
assertEquals(expected, actual);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableMessageFactoryTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableMessageFactoryTest.java
index 7942e5f..63135dc 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableMessageFactoryTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableMessageFactoryTest.java
@@ -127,4 +127,4 @@ public class ReusableMessageFactoryTest {
ReusableMessageFactory.release(message2[0]);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
index 614d54c..955c786 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
@@ -119,4 +119,4 @@ public class ReusableObjectMessageTest {
msg.formatTo(sb);
assertEquals("xyz", sb.toString());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
index 1070a53..6a095fd 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
@@ -119,4 +119,4 @@ public class ReusableSimpleMessageTest {
msg.formatTo(sb);
assertEquals("xyz", sb.toString());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/spi/LoggerAdapterTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/spi/LoggerAdapterTest.java
index 8a56b40..c2b1290 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/spi/LoggerAdapterTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/spi/LoggerAdapterTest.java
@@ -123,4 +123,4 @@ public class LoggerAdapterTest {
assertEquals(2, resultMap1.size());
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
index 7e46036..9a11647 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/AssertTest.java
@@ -14,12 +14,13 @@
* See the license for the specific language governing permissions and
* limitations under the license.
*/
-package org.apache.logging.log4j.core.util;
+package org.apache.logging.log4j.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import org.apache.logging.log4j.util.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/CharsTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/CharsTest.java
index d1447f2..e799825 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/CharsTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/CharsTest.java
@@ -43,4 +43,4 @@ public class CharsTest {
assertEquals(String.format("Expected %X", i), expectedUpper[i], Chars.getUpperCaseHex(i));
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/ConstantsTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/ConstantsTest.java
index 8d323be..abc5fef 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/ConstantsTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/ConstantsTest.java
@@ -13,4 +13,4 @@ public class ConstantsTest {
assertEquals(9, Constants.getMajorVersion("9.1.1"));
assertEquals(11, Constants.getMajorVersion("11.1.1"));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceTest.java
index 3beea89..0a25a2a 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceTest.java
@@ -55,4 +55,4 @@ public class EnvironmentPropertySourceTest {
public void testNormalFormFollowsEnvironmentVariableConventions() throws Exception {
assertEquals(expected, source.getNormalForm(tokens));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/LegacyPropertiesCompatibilityTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/LegacyPropertiesCompatibilityTest.java
index b979d9a..3e05ed4 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/LegacyPropertiesCompatibilityTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/LegacyPropertiesCompatibilityTest.java
@@ -100,4 +100,4 @@ public class LegacyPropertiesCompatibilityTest {
final List<CharSequence> oldTokens = PropertySource.Util.tokenize(oldName);
assertEquals(oldTokens, newTokens);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertiesPropertySourceTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertiesPropertySourceTest.java
index c1c97ef..34d2dd6 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertiesPropertySourceTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertiesPropertySourceTest.java
@@ -53,4 +53,4 @@ public class PropertiesPropertySourceTest {
public void testNormalFormFollowsCamelCaseConventions() throws Exception {
assertEquals(expected, source.getNormalForm(tokens));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertySourceCamelCaseTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertySourceCamelCaseTest.java
index a197085..8b86c1d 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertySourceCamelCaseTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertySourceCamelCaseTest.java
@@ -51,4 +51,4 @@ public class PropertySourceCamelCaseTest {
public void testJoinAsCamelCase() throws Exception {
assertEquals(expected, PropertySource.Util.joinAsCamelCase(tokens));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertySourceTokenizerTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertySourceTokenizerTest.java
index dd1d49c..d53fd99 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertySourceTokenizerTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/PropertySourceTokenizerTest.java
@@ -63,4 +63,4 @@ public class PropertySourceTokenizerTest {
List<CharSequence> tokens = PropertySource.Util.tokenize(value);
assertEquals(expectedTokens, tokens);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
index ea333ae..3b91008 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
@@ -1116,4 +1116,4 @@ public class SortedArrayStringMapTest {
original.forEach(COUNTER, state);
assertEquals(state.count, original.size());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java
index 6feecbb..903c97f 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java
@@ -89,4 +89,4 @@ public class StringBuildersTest {
StringBuilders.escapeXml(sb, 0);
assertEquals(xmlValueEscaped, sb.toString());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/Unbox1Test.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/Unbox1Test.java
index 2e8cb77..d0330cf 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/Unbox1Test.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/Unbox1Test.java
@@ -167,4 +167,4 @@ public class Unbox1Test {
probe[i++] = Unbox.box(Short.MAX_VALUE);
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/Unbox2ConfigurableTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/Unbox2ConfigurableTest.java
index 2deda12..807e7c2 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/Unbox2ConfigurableTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/Unbox2ConfigurableTest.java
@@ -88,4 +88,4 @@ public class Unbox2ConfigurableTest {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
index 2ccfde1..9df9f97 100644
--- a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
+++ b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
@@ -23,13 +23,13 @@ import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
import org.apache.logging.log4j.core.appender.db.ColumnMapping;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.net.SocketAddress;
import org.apache.logging.log4j.core.time.Clock;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
/**
* Appender plugin that uses a Cassandra database.
@@ -51,7 +51,7 @@ public class CassandraAppender extends AbstractDatabaseAppender<CassandraManager
}
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<CassandraAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<CassandraAppender> {
/**
* List of Cassandra node contact points. Addresses without a port (or port set to 0) will use the default
diff --git a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraManager.java b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraManager.java
index ad1a4a6..7ae8393 100644
--- a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraManager.java
+++ b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraManager.java
@@ -31,7 +31,7 @@ import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.ManagerFactory;
import org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager;
import org.apache.logging.log4j.core.appender.db.ColumnMapping;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
import org.apache.logging.log4j.core.net.SocketAddress;
import org.apache.logging.log4j.jdbc.convert.DateTypeConverter;
import org.apache.logging.log4j.spi.ThreadContextMap;
diff --git a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/package-info.java b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/package-info.java
index 0336dd0..3121a56 100644
--- a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/package-info.java
+++ b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/package-info.java
@@ -20,4 +20,4 @@
* @see <a href="https://logging.apache.org/log4j/2.x/manual/appenders.html#CassandraAppender">Cassandra Appender manual</a>
* @since 2.8
*/
-package org.apache.logging.log4j.cassandra;
\ No newline at end of file
+package org.apache.logging.log4j.cassandra;
diff --git a/log4j-core-its/src/test/java/org/apache/logging/log4j/FilterPerformanceComparison.java b/log4j-core-its/src/test/java/org/apache/logging/log4j/FilterPerformanceComparison.java
index 1de0e97..541394e 100644
--- a/log4j-core-its/src/test/java/org/apache/logging/log4j/FilterPerformanceComparison.java
+++ b/log4j-core-its/src/test/java/org/apache/logging/log4j/FilterPerformanceComparison.java
@@ -211,4 +211,4 @@ public class FilterPerformanceComparison {
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core-its/src/test/java/org/apache/logging/log4j/PerformanceComparison.java b/log4j-core-its/src/test/java/org/apache/logging/log4j/PerformanceComparison.java
index a2c1007..2af0421 100644
--- a/log4j-core-its/src/test/java/org/apache/logging/log4j/PerformanceComparison.java
+++ b/log4j-core-its/src/test/java/org/apache/logging/log4j/PerformanceComparison.java
@@ -202,4 +202,4 @@ public class PerformanceComparison {
return s.getBytes();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/HttpAppenderTest.java b/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/HttpAppenderTest.java
index 8b7fbdb..46cd3d8 100644
--- a/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/HttpAppenderTest.java
+++ b/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/HttpAppenderTest.java
@@ -313,4 +313,4 @@ public class HttpAppenderTest {
appender.append(createLogEvent());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/pom.xml b/log4j-core/pom.xml
index a59133c..fcabc0b 100644
--- a/log4j-core/pom.xml
+++ b/log4j-core/pom.xml
@@ -38,6 +38,10 @@
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-plugins</artifactId>
+ </dependency>
<!-- Classes and resources to be shaded into the core jar -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
@@ -122,6 +126,13 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
+ <!-- And test plugins -->
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-plugins</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
<!-- Apache Commons Compress -->
<dependency>
<groupId>org.tukaani</groupId>
@@ -353,35 +364,6 @@
</executions>
</plugin>
<plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <executions>
- <execution>
- <!-- disable annotation processing for first pass -->
- <id>default-compile</id>
- <configuration>
- <excludes>
- <exclude>module-info.java</exclude>
- </excludes>
- <proc>none</proc>
- </configuration>
- </execution>
- <execution>
- <!-- then do a processing-only pass to generate plugins .dat file -->
- <id>process-plugins</id>
- <goals>
- <goal>compile</goal>
- </goals>
- <phase>process-classes</phase>
- <configuration>
- <excludes>
- <exclude>module-info.java</exclude>
- </excludes>
- <proc>only</proc>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>
diff --git a/log4j-core/revapi.json b/log4j-core/revapi.json
index a1fa0c2..1ee8659 100644
--- a/log4j-core/revapi.json
+++ b/log4j-core/revapi.json
@@ -31,2088 +31,6 @@
{
"extension": "revapi.ignore",
"configuration": [
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.AsyncAppender.Builder org.apache.logging.log4j.core.appender.AsyncAppender.Builder::setFilter(org.apache.logging.log4j.core.Filter)",
- "new": "method B org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B>>>::setFilter(org.apache.logging.log4j.core.Filter) @ org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B extends org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B extends org.apache.logging.log4j.core.appender.AsyncAppender.Buil [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.class.nonFinalClassInheritsFromNewClass",
- "old": "class org.apache.logging.log4j.core.appender.AsyncAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B extends org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B>>",
- "superClass": "org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.generics.elementNowParameterized",
- "old": "class org.apache.logging.log4j.core.appender.AsyncAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B extends org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.generics.formalTypeParameterAdded",
- "old": "class org.apache.logging.log4j.core.appender.AsyncAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B extends org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B>>",
- "typeParameter": "B extends org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B extends org.apache.logging.log4j.core.appender.AsyncAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.annotation.attributeAdded",
- "old": "parameter org.apache.logging.log4j.core.appender.NullAppender org.apache.logging.log4j.core.appender.NullAppender::createAppender(===java.lang.String===)",
- "new": "parameter org.apache.logging.log4j.core.appender.NullAppender org.apache.logging.log4j.core.appender.NullAppender::createAppender(===java.lang.String===)",
- "annotation": "@org.apache.logging.log4j.core.config.plugins.PluginAttribute(value = \"name\", defaultString = \"null\")",
- "attribute": "defaultString",
- "justification": "LOG4J2-2447 - Allow NullAppender to default its name to null"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder::setFilter(org.apache.logging.log4j.core.Filter)",
- "new": "method B org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B>>>::setFilter(org.apache.logging.log4j.core.Filter) @ org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.Outp [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder::setFollow(boolean)",
- "new": "method B org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>>::setFollow(boolean)",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder::setIgnoreExceptions(boolean)",
- "new": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setIgnoreExceptions(boolean) @ org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Bu [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder::setLayout(org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>)",
- "new": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setLayout(org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>) @ org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache. [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder::setName(java.lang.String)",
- "new": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setName(java.lang.String) @ org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Build [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder::setTarget(java.io.OutputStream)",
- "new": "method B org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>>::setTarget(java.io.OutputStream)",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.class.nonFinalClassInheritsFromNewClass",
- "old": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>",
- "superClass": "org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.class.nonFinalClassInheritsFromNewClass",
- "old": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>",
- "superClass": "org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.class.nonFinalClassInheritsFromNewClass",
- "old": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>",
- "superClass": "org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.generics.elementNowParameterized",
- "old": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.generics.formalTypeParameterAdded",
- "old": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>",
- "typeParameter": "B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.OutputStreamAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender.Builder::setFilter(org.apache.logging.log4j.core.Filter)",
- "new": "method B org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B>>>::setFilter(org.apache.logging.log4j.core.Filter) @ org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.B [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender.Builder::setFollow(boolean)",
- "new": "method B org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>>::setFollow(boolean)",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender.Builder::setIgnoreExceptions(boolean)",
- "new": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setIgnoreExceptions(boolean) @ org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender.Builder::setLayout(===org.apache.logging.log4j.core.StringLayout===)",
- "new": "parameter B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setLayout(===org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>===) @ org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.log [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender.Builder::setLayout(org.apache.logging.log4j.core.StringLayout)",
- "new": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setLayout(org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>) @ org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4 [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender.Builder::setName(java.lang.String)",
- "new": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setName(java.lang.String) @ org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender.Builder::setTarget(java.io.Writer)",
- "new": "method B org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>>::setTarget(java.io.Writer)",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.class.nonFinalClassInheritsFromNewClass",
- "old": "class org.apache.logging.log4j.core.appender.WriterAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>",
- "superClass": "org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.class.nonFinalClassInheritsFromNewClass",
- "old": "class org.apache.logging.log4j.core.appender.WriterAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>",
- "superClass": "org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.generics.elementNowParameterized",
- "old": "class org.apache.logging.log4j.core.appender.WriterAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.generics.formalTypeParameterAdded",
- "old": "class org.apache.logging.log4j.core.appender.WriterAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>",
- "typeParameter": "B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.class.nonFinalClassInheritsFromNewClass",
- "old": "class org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.Builder<B extends org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.Builder<B>>",
- "new": "class org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.Builder<B extends org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.Builder<B>>",
- "superClass": "org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.Builder<B extends org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager::getManager(java.lang.String, int, org.apache.logging.log4j.core.appender.db.jdbc.ConnectionSource, java.lang.String, org.apache.logging.log4j.core.appender.db.jdbc.ColumnConfig[], org.apache.logging.log4j.core.appender.db.ColumnMapping[])",
- "new": "method org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager::getManager(java.lang.String, int, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.appender.db.jdbc.ConnectionSource, java.lang.String, org.apache.logging.log4j.core.appender.db.jdbc.ColumnConfig[], org.apache.logging.log4j.core.appender.db.ColumnMapping[], boolean, long)",
- "justification": "LOG4J2-2500 - Allow a JDBC Appender to truncate string to match a table's metadata column length limit"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder::setFilter(org.apache.logging.log4j.core.Filter)",
- "new": "method B org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B>>>::setFilter(org.apache.logging.log4j.core.Filter) @ org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppende [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder::setIgnoreExceptions(boolean)",
- "new": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setIgnoreExceptions(boolean) @ org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B>>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder::setLayout(org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>)",
- "new": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setLayout(org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>) @ org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.lo [...]
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder::setName(java.lang.String)",
- "new": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::setName(java.lang.String) @ org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B>>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.class.nonFinalClassInheritsFromNewClass",
- "old": "class org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B>>",
- "superClass": "org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.class.nonFinalClassInheritsFromNewClass",
- "old": "class org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B>>",
- "superClass": "org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.generics.elementNowParameterized",
- "old": "class org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.generics.formalTypeParameterAdded",
- "old": "class org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder",
- "new": "class org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B>>",
- "typeParameter": "B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.JmsAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.Property[] org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.Builder<B>>>::getProperties()",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.Builder<B extends org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.Builder<B>>>::setProperties(org.apache.logging.log4j.core.config.Property[])",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
-
- },
- {
- "code": "java.method.returnTypeChanged",
- "old": "method void org.apache.logging.log4j.core.util.Closer::close(java.lang.AutoCloseable) throws java.lang.Exception",
- "new": "method boolean org.apache.logging.log4j.core.util.Closer::close(java.lang.AutoCloseable) throws java.lang.Exception",
- "justification": "LOG4J2-2496 - JDBC Appender should reconnect to the database when a connection goes stale"
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method java.lang.Object org.apache.logging.log4j.core.util.Loader::newInstanceOf(java.lang.String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException",
- "new": "method <T> T org.apache.logging.log4j.core.util.Loader::newInstanceOf(java.lang.String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException",
- "justification": "LOG4J2-2482 - BasicContextSelector cannot be used in an OSGi application"
- },
- {
- "code": "java.generics.elementNowParameterized",
- "old": "method java.lang.Object org.apache.logging.log4j.core.util.Loader::newInstanceOf(java.lang.String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException",
- "new": "method <T> T org.apache.logging.log4j.core.util.Loader::newInstanceOf(java.lang.String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException",
- "justification": "LOG4J2-2482 - BasicContextSelector cannot be used in an OSGi application"
- },
- {
- "code": "java.generics.formalTypeParameterAdded",
- "old": "method java.lang.Object org.apache.logging.log4j.core.util.Loader::newInstanceOf(java.lang.String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException",
- "new": "method <T> T org.apache.logging.log4j.core.util.Loader::newInstanceOf(java.lang.String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException",
- "typeParameter": "T",
- "justification": "LOG4J2-2482 - BasicContextSelector cannot be used in an OSGi application"
- },
- {
- "code": "java.field.enumConstantOrderChanged",
- "old": "field org.apache.logging.log4j.core.util.datetime.FixedDateFormat.FixedFormat.ISO8601_PERIOD",
- "new": "field org.apache.logging.log4j.core.util.datetime.FixedDateFormat.FixedFormat.ISO8601_PERIOD",
- "justification": "LOG4J2-1247 - PatternLayout %date conversion pattern should render time zone designator"
-
- },
- {
- "code": "java.method.removed",
- "old": "method java.util.Map<java.lang.String, java.lang.String> org.apache.logging.log4j.core.AbstractLogEvent::getContextMap()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.addedToInterface",
- "new": "method boolean org.apache.logging.log4j.core.LifeCycle::stop(long, java.util.concurrent.TimeUnit)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method java.util.Map<java.lang.String, java.lang.String> org.apache.logging.log4j.core.LogEvent::getContextMap()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::withConfiguration(org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::withIgnoreExceptions(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::withLayout(org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>>::withName(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method void org.apache.logging.log4j.core.appender.AbstractAppender::<init>(java.lang.String, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean)",
- "new": "method void org.apache.logging.log4j.core.appender.AbstractAppender::<init>(java.lang.String, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean, org.apache.logging.log4j.core.config.Property[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.AbstractAppender::<init>(java.lang.String, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B>>>::withAdvertise(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B>>>::withAdvertiseUri(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B>>>::withAppend(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B>>>::withCreateOnDemand(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B>>>::withFileGroup(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B>>>::withFileName(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B>>>::withFileOwner(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B>>>::withFilePermissions(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractFileAppender.Builder<B>>>::withLocking(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.AbstractManager::release()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B>>>::withBufferSize(int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B>>>::withBufferedIo(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.Builder<B>>>::withImmediateFlush(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method void org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender<M extends org.apache.logging.log4j.core.appender.OutputStreamManager>::<init>(java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, boolean, boolean, M)",
- "new": "method void org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender<M extends org.apache.logging.log4j.core.appender.OutputStreamManager>::<init>(java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, boolean, boolean, org.apache.logging.log4j.core.config.Property[], M)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method void org.apache.logging.log4j.core.appender.AbstractWriterAppender<M extends org.apache.logging.log4j.core.appender.WriterManager>::<init>(java.lang.String, org.apache.logging.log4j.core.StringLayout, org.apache.logging.log4j.core.Filter, boolean, boolean, M)",
- "new": "method void org.apache.logging.log4j.core.appender.AbstractWriterAppender<M extends org.apache.logging.log4j.core.appender.WriterManager>::<init>(java.lang.String, org.apache.logging.log4j.core.StringLayout, org.apache.logging.log4j.core.Filter, boolean, boolean, org.apache.logging.log4j.core.config.Property[], M)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.AppenderSet.Builder org.apache.logging.log4j.core.appender.AppenderSet.Builder::withConfiguration(org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.AppenderSet.Builder org.apache.logging.log4j.core.appender.AppenderSet.Builder::withNode(org.apache.logging.log4j.core.config.Node)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.AsyncAppender org.apache.logging.log4j.core.appender.AsyncAppender::createAppender(org.apache.logging.log4j.core.config.AppenderRef[], java.lang.String, boolean, long, int, java.lang.String, boolean, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.config.Configuration, boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.ConsoleAppender org.apache.logging.log4j.core.appender.ConsoleAppender::createAppender(org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, java.lang.String, java.lang.String, java.lang.String, java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.ConsoleAppender org.apache.logging.log4j.core.appender.ConsoleAppender::createAppender(org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.appender.ConsoleAppender.Target, java.lang.String, boolean, boolean, boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>>::withAdvertise(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>>::withAdvertiseUri(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>>::withAppend(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>>::withCreateOnDemand(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>>::withFileGroup(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>>::withFileName(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>>::withFileOwner(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>>::withFilePermissions(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>>::withLocking(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method <B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B extends org.apache.logging.log4j.core.appender.FileAppender.Builder<B>>> org.apache.logging.log4j.core.appender.FileAppender org.apache.logging.log4j.core.appender.FileAppender::createAppender(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Seri [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.FileManager::<init>(java.lang.String, java.io.OutputStream, boolean, boolean, java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean, java.nio.ByteBuffer)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.FileManager::<init>(java.lang.String, java.io.OutputStream, boolean, boolean, java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, int, boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.FileManager::<init>(org.apache.logging.log4j.core.LoggerContext, java.lang.String, java.io.OutputStream, boolean, boolean, boolean, java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean, java.nio.ByteBuffer)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method <B extends org.apache.logging.log4j.core.appender.MemoryMappedFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.MemoryMappedFileAppender.Builder<B>>> org.apache.logging.log4j.core.appender.MemoryMappedFileAppender org.apache.logging.log4j.core.appender.MemoryMappedFileAppender::createAppender(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.apache.logging.log4j.core.Layout<? extends [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method <B extends org.apache.logging.log4j.core.appender.RandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RandomAccessFileAppender.Builder<B>>> org.apache.logging.log4j.core.appender.RandomAccessFileAppender org.apache.logging.log4j.core.appender.RandomAccessFileAppender::createAppender(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.apache.logging.log4j.core.Layout<? extends [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withAdvertise(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withAdvertiseUri(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withAppend(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withCreateOnDemand(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withFileGroup(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withFileName(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withFileOwner(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withFilePattern(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withFilePermissions(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withLocking(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withPolicy(org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>>::withStrategy(org.apache.logging.log4j.core.appender.rolling.RolloverStrategy)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method <B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingFileAppender.Builder<B>>> org.apache.logging.log4j.core.appender.RollingFileAppender org.apache.logging.log4j.core.appender.RollingFileAppender::createAppender(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.apache.logging.log4j.core.appender.rolling.Tr [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withAdvertise(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withAdvertiseURI(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withAppend(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withFileGroup(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withFileName(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withFileOwner(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withFilePattern(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withFilePermissions(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withPolicy(org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>>::withStrategy(org.apache.logging.log4j.core.appender.rolling.RolloverStrategy)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method <B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B extends org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.Builder<B>>> org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender::createAppender(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.apache.logging. [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.ScriptAppenderSelector.Builder org.apache.logging.log4j.core.appender.ScriptAppenderSelector.Builder::withAppenderNodeSet(org.apache.logging.log4j.core.appender.AppenderSet)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.ScriptAppenderSelector.Builder org.apache.logging.log4j.core.appender.ScriptAppenderSelector.Builder::withConfiguration(org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.ScriptAppenderSelector.Builder org.apache.logging.log4j.core.appender.ScriptAppenderSelector.Builder::withName(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.ScriptAppenderSelector.Builder org.apache.logging.log4j.core.appender.ScriptAppenderSelector.Builder::withScript(org.apache.logging.log4j.core.script.AbstractScript)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.SmtpAppender",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B>>>::withAdvertise(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B>>>::withConnectTimeoutMillis(int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B>>>::withHost(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B>>>::withImmediateFail(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B>>>::withPort(int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B>>>::withProtocol(org.apache.logging.log4j.core.net.Protocol)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B>>>::withReconnectDelayMillis(int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B>>>::withSocketOptions(org.apache.logging.log4j.core.net.SocketOptions)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B extends org.apache.logging.log4j.core.appender.SocketAppender.AbstractBuilder<B>>>::withSslConfiguration(org.apache.logging.log4j.core.net.ssl.SslConfiguration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.SocketAppender org.apache.logging.log4j.core.appender.SocketAppender::createAppender(java.lang.String, int, org.apache.logging.log4j.core.net.Protocol, org.apache.logging.log4j.core.net.ssl.SslConfiguration, int, int, boolean, java.lang.String, boolean, boolean, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, boolean, org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.SocketAppender org.apache.logging.log4j.core.appender.SocketAppender::createAppender(java.lang.String, java.lang.String, java.lang.String, org.apache.logging.log4j.core.net.ssl.SslConfiguration, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, java.lang.String, org.apache.log [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.net.AbstractSocketManager org.apache.logging.log4j.core.appender.SocketAppender::createSocketManager(java.lang.String, org.apache.logging.log4j.core.net.Protocol, java.lang.String, int, int, org.apache.logging.log4j.core.net.ssl.SslConfiguration, int, boolean, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method <B extends org.apache.logging.log4j.core.appender.SyslogAppender.Builder<B extends org.apache.logging.log4j.core.appender.SyslogAppender.Builder<B>>> org.apache.logging.log4j.core.appender.SyslogAppender org.apache.logging.log4j.core.appender.SyslogAppender::createAppender(java.lang.String, int, java.lang.String, org.apache.logging.log4j.core.net.ssl.SslConfiguration, int, int, boolean, java.lang.String, boolean, boolean, org.apache.logging.log4j.core.net.Facility, [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method void org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender<T extends org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager>::<init>(java.lang.String, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean, T)",
- "new": "method void org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender<T extends org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager>::<init>(java.lang.String, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean, org.apache.logging.log4j.core.config.Property[], T)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender<T extends org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager>::<init>(java.lang.String, org.apache.logging.log4j.core.Filter, boolean, T)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager::write(org.apache.logging.log4j.core.LogEvent)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager::writeInternal(org.apache.logging.log4j.core.LogEvent)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.db.jdbc.AbstractConnectionSource",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.db.jdbc.AbstractDriverManagerConnectionSource",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.db.jdbc.ColumnConfig",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "interface org.apache.logging.log4j.core.appender.db.jdbc.ConnectionSource",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.db.jdbc.DriverManagerConnectionSource",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.db.jdbc.FactoryMethodConnectionSource",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.mom.JmsAppender",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.mom.JmsManager",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.mom.jeromq.JeroMqAppender",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.mom.jeromq.JeroMqManager",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.mom.kafka.DefaultKafkaProducerFactory",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.appender.mom.kafka.KafkaManager",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "interface org.apache.logging.log4j.core.appender.mom.kafka.KafkaProducerFactory",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.nosql.NoSqlAppender org.apache.logging.log4j.core.appender.nosql.NoSqlAppender::createAppender(java.lang.String, java.lang.String, org.apache.logging.log4j.core.Filter, java.lang.String, org.apache.logging.log4j.core.appender.nosql.NoSqlProvider<?>)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.nosql.NoSqlDatabaseManager<W>::writeInternal(org.apache.logging.log4j.core.LogEvent)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder::withCompressionLevelStr(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder::withConfig(org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder::withCustomActions(org.apache.logging.log4j.core.appender.rolling.action.Action[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder::withFileIndex(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder::withMax(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder::withMin(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder::withStopCustomActionsOnError(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder::withTempCompressedFilePattern(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy::<init>(int, int, boolean, int, org.apache.logging.log4j.core.lookup.StrSubstitutor, org.apache.logging.log4j.core.appender.rolling.action.Action[], boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy::createStrategy(java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.apache.logging.log4j.core.appender.rolling.action.Action[], boolean, org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder::withCompressionLevelStr(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder::withConfig(org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder::withCustomActions(org.apache.logging.log4j.core.appender.rolling.action.Action[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder::withMaxFiles(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder::withStopCustomActionsOnError(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.Builder::withTempCompressedFilePattern(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy::<init>(int, int, org.apache.logging.log4j.core.lookup.StrSubstitutor, org.apache.logging.log4j.core.appender.rolling.action.Action[], boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy::createStrategy(java.lang.String, java.lang.String, org.apache.logging.log4j.core.appender.rolling.action.Action[], boolean, org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.rolling.RollingFileManager::<init>(java.lang.String, java.lang.String, java.io.OutputStream, boolean, long, long, org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy, org.apache.logging.log4j.core.appender.rolling.RolloverStrategy, java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean, java.nio.ByteBuffer)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.rolling.RollingFileManager::<init>(java.lang.String, java.lang.String, java.io.OutputStream, boolean, long, long, org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy, org.apache.logging.log4j.core.appender.rolling.RolloverStrategy, java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, int, boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.rolling.RollingFileManager::<init>(org.apache.logging.log4j.core.LoggerContext, java.lang.String, java.lang.String, java.io.OutputStream, boolean, boolean, long, long, org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy, org.apache.logging.log4j.core.appender.rolling.RolloverStrategy, java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean, java.nio.ByteBuffer)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager::<init>(org.apache.logging.log4j.core.LoggerContext, java.io.RandomAccessFile, java.lang.String, java.lang.String, java.io.OutputStream, boolean, boolean, int, long, long, org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy, org.apache.logging.log4j.core.appender.rolling.RolloverStrategy, java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializabl [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy.Builder org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy.Builder::withInterval(int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy.Builder org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy.Builder::withMaxRandomDelay(int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy.Builder org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy.Builder::withModulate(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy::createPolicy(java.lang.String, java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withBasePath(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withConfiguration(org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withFileGroup(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withFileOwner(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withFilePermissions(java.util.Set<java.nio.file.attribute.PosixFilePermission>)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withFilePermissionsString(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withFollowLinks(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withMaxDepth(int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withPathConditions(org.apache.logging.log4j.core.appender.rolling.action.PathCondition[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.Builder::withSubst(org.apache.logging.log4j.core.lookup.StrSubstitutor)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.routing.Routes.Builder org.apache.logging.log4j.core.appender.routing.Routes.Builder::withConfiguration(org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.routing.Routes.Builder org.apache.logging.log4j.core.appender.routing.Routes.Builder::withPattern(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.routing.Routes.Builder org.apache.logging.log4j.core.appender.routing.Routes.Builder::withPatternScript(org.apache.logging.log4j.core.script.AbstractScript)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.routing.Routes.Builder org.apache.logging.log4j.core.appender.routing.Routes.Builder::withRoutes(org.apache.logging.log4j.core.appender.routing.Route[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.routing.Routes org.apache.logging.log4j.core.appender.routing.Routes::createRoutes(java.lang.String, org.apache.logging.log4j.core.appender.routing.Route[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B extends org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B extends org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B>>>::withDefaultRouteScript(org.apache.logging.log4j.core.script.AbstractScript)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B extends org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B extends org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B>>>::withPurgePolicy(org.apache.logging.log4j.core.appender.routing.PurgePolicy)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B extends org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B extends org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B>>>::withRewritePolicy(org.apache.logging.log4j.core.appender.rewrite.RewritePolicy)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B extends org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B extends org.apache.logging.log4j.core.appender.routing.RoutingAppender.Builder<B>>>::withRoutes(org.apache.logging.log4j.core.appender.routing.Routes)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.appender.routing.RoutingAppender org.apache.logging.log4j.core.appender.routing.RoutingAppender::createAppender(java.lang.String, java.lang.String, org.apache.logging.log4j.core.appender.routing.Routes, org.apache.logging.log4j.core.config.Configuration, org.apache.logging.log4j.core.appender.rewrite.RewritePolicy, org.apache.logging.log4j.core.appender.routing.PurgePolicy, org.apache.logging.log4j.core.Filter)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.LoggerConfig org.apache.logging.log4j.core.async.AsyncLoggerConfig.RootLogger::createLogger(java.lang.String, java.lang.String, java.lang.String, org.apache.logging.log4j.core.config.AppenderRef[], org.apache.logging.log4j.core.config.Property[], org.apache.logging.log4j.core.config.Configuration, org.apache.logging.log4j.core.Filter)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.LoggerConfig org.apache.logging.log4j.core.async.AsyncLoggerConfig::createLogger(java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.apache.logging.log4j.core.config.AppenderRef[], org.apache.logging.log4j.core.config.Property[], org.apache.logging.log4j.core.config.Configuration, org.apache.logging.log4j.core.Filter)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method java.util.Map<java.lang.String, java.lang.String> org.apache.logging.log4j.core.async.RingBufferLogEvent::getContextMap()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.async.RingBufferLogEvent::setValues(org.apache.logging.log4j.core.async.AsyncLogger, java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, org.apache.logging.log4j.util.StringMap, org.apache.logging.log4j.ThreadContext.ContextStack, long, java.lang.String, int, java.lang.StackTraceElement, ===org.apache.logging.log4j.co [...]
- "new": "parameter void org.apache.logging.log4j.core.async.RingBufferLogEvent::setValues(org.apache.logging.log4j.core.async.AsyncLogger, java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, org.apache.logging.log4j.util.StringMap, org.apache.logging.log4j.ThreadContext.ContextStack, long, java.lang.String, int, java.lang.StackTraceElement, ===org.apache.logging.log4j.co [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.async.RingBufferLogEvent::setValues(org.apache.logging.log4j.core.async.AsyncLogger, java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, org.apache.logging.log4j.util.StringMap, org.apache.logging.log4j.ThreadContext.ContextStack, long, java.lang.String, int, java.lang.StackTraceElement, org.apache.logging.log4j.core. [...]
- "new": "parameter void org.apache.logging.log4j.core.async.RingBufferLogEvent::setValues(org.apache.logging.log4j.core.async.AsyncLogger, java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, org.apache.logging.log4j.util.StringMap, org.apache.logging.log4j.ThreadContext.ContextStack, long, java.lang.String, int, java.lang.StackTraceElement, org.apache.logging.log4j.core. [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.async.RingBufferLogEventTranslator::setBasicValues(org.apache.logging.log4j.core.async.AsyncLogger, java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, org.apache.logging.log4j.ThreadContext.ContextStack, java.lang.StackTraceElement, ===org.apache.logging.log4j.core.util.Clock===, org.apache.logging.log4j.core.util.Na [...]
- "new": "parameter void org.apache.logging.log4j.core.async.RingBufferLogEventTranslator::setBasicValues(org.apache.logging.log4j.core.async.AsyncLogger, java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, org.apache.logging.log4j.ThreadContext.ContextStack, java.lang.StackTraceElement, ===org.apache.logging.log4j.core.time.Clock===, org.apache.logging.log4j.core.time.Na [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.async.RingBufferLogEventTranslator::setBasicValues(org.apache.logging.log4j.core.async.AsyncLogger, java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, org.apache.logging.log4j.ThreadContext.ContextStack, java.lang.StackTraceElement, org.apache.logging.log4j.core.util.Clock, ===org.apache.logging.log4j.core.util.NanoC [...]
- "new": "parameter void org.apache.logging.log4j.core.async.RingBufferLogEventTranslator::setBasicValues(org.apache.logging.log4j.core.async.AsyncLogger, java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, org.apache.logging.log4j.ThreadContext.ContextStack, java.lang.StackTraceElement, org.apache.logging.log4j.core.time.Clock, ===org.apache.logging.log4j.core.time.NanoC [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.returnTypeChanged",
- "old": "method org.apache.logging.log4j.core.util.NanoClock org.apache.logging.log4j.core.config.AbstractConfiguration::getNanoClock()",
- "new": "method org.apache.logging.log4j.core.time.NanoClock org.apache.logging.log4j.core.config.AbstractConfiguration::getNanoClock()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.config.AbstractConfiguration::setNanoClock(===org.apache.logging.log4j.core.util.NanoClock===)",
- "new": "parameter void org.apache.logging.log4j.core.config.AbstractConfiguration::setNanoClock(===org.apache.logging.log4j.core.time.NanoClock===)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.returnTypeChanged",
- "old": "method org.apache.logging.log4j.core.util.NanoClock org.apache.logging.log4j.core.config.Configuration::getNanoClock()",
- "new": "method org.apache.logging.log4j.core.time.NanoClock org.apache.logging.log4j.core.config.Configuration::getNanoClock()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.config.Configuration::setNanoClock(===org.apache.logging.log4j.core.util.NanoClock===)",
- "new": "parameter void org.apache.logging.log4j.core.config.Configuration::setNanoClock(===org.apache.logging.log4j.core.time.NanoClock===)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.LoggerConfig org.apache.logging.log4j.core.config.LoggerConfig::createLogger(java.lang.String, org.apache.logging.log4j.Level, java.lang.String, java.lang.String, org.apache.logging.log4j.core.config.AppenderRef[], org.apache.logging.log4j.core.config.Property[], org.apache.logging.log4j.core.config.Configuration, org.apache.logging.log4j.core.Filter)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method java.util.Map<org.apache.logging.log4j.core.config.Property, java.lang.Boolean> org.apache.logging.log4j.core.config.LoggerConfig::getProperties()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method boolean org.apache.logging.log4j.core.config.LoggerConfig::includeLocation(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.config.plugins.convert.DateTypeConverter",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.plugins.util.PluginBuilder org.apache.logging.log4j.core.config.plugins.util.PluginBuilder::withConfiguration(org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.plugins.util.PluginBuilder org.apache.logging.log4j.core.config.plugins.util.PluginBuilder::withConfigurationNode(org.apache.logging.log4j.core.config.Node)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.config.plugins.util.PluginManager::main(java.lang.String[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.status.StatusConfiguration org.apache.logging.log4j.core.config.status.StatusConfiguration::withDestination(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.status.StatusConfiguration org.apache.logging.log4j.core.config.status.StatusConfiguration::withStatus(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.status.StatusConfiguration org.apache.logging.log4j.core.config.status.StatusConfiguration::withStatus(org.apache.logging.log4j.Level)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.status.StatusConfiguration org.apache.logging.log4j.core.config.status.StatusConfiguration::withVerboseClasses(java.lang.String[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.config.status.StatusConfiguration org.apache.logging.log4j.core.config.status.StatusConfiguration::withVerbosity(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method B org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B extends org.apache.logging.log4j.core.filter.AbstractFilterable.Builder<B>>>::withFilter(org.apache.logging.log4j.core.Filter)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method void org.apache.logging.log4j.core.filter.AbstractFilterable::<init>(org.apache.logging.log4j.core.Filter)",
- "new": "method void org.apache.logging.log4j.core.filter.AbstractFilterable::<init>(org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.config.Property[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method java.util.List<org.apache.logging.log4j.core.Filter> org.apache.logging.log4j.core.filter.CompositeFilter::getFilters()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method java.util.Map<java.lang.String, java.util.List<java.lang.String>> org.apache.logging.log4j.core.filter.MapFilter::getMap()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.impl.Log4jLogEvent.Builder org.apache.logging.log4j.core.impl.Log4jLogEvent.Builder::setContextMap(java.util.Map<java.lang.String, java.lang.String>)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.impl.Log4jLogEvent::<init>(java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.impl.Log4jLogEvent::<init>(java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, java.util.Map<java.lang.String, java.lang.String>, org.apache.logging.log4j.ThreadContext.ContextStack, java.lang.String, java.lang.StackTraceElement, long)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.impl.Log4jLogEvent::<init>(long)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.impl.Log4jLogEvent org.apache.logging.log4j.core.impl.Log4jLogEvent::createEvent(java.lang.String, org.apache.logging.log4j.Marker, java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable, org.apache.logging.log4j.core.impl.ThrowableProxy, java.util.Map<java.lang.String, java.lang.String>, org.apache.logging.log4j.ThreadContext.ContextStack, java.lang.String, java.lang.StackTraceE [...]
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method java.util.Map<java.lang.String, java.lang.String> org.apache.logging.log4j.core.impl.Log4jLogEvent::getContextMap()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.returnTypeChanged",
- "old": "method org.apache.logging.log4j.core.util.NanoClock org.apache.logging.log4j.core.impl.Log4jLogEvent::getNanoClock()",
- "new": "method org.apache.logging.log4j.core.time.NanoClock org.apache.logging.log4j.core.impl.Log4jLogEvent::getNanoClock()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.impl.Log4jLogEvent::setNanoClock(===org.apache.logging.log4j.core.util.NanoClock===)",
- "new": "parameter void org.apache.logging.log4j.core.impl.Log4jLogEvent::setNanoClock(===org.apache.logging.log4j.core.time.NanoClock===)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method java.util.Map<java.lang.String, java.lang.String> org.apache.logging.log4j.core.impl.MutableLogEvent::getContextMap()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.layout.AbstractCsvLayout",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.layout.AbstractLayout<T extends java.io.Serializable>::<init>(byte[], byte[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.layout.CsvLogEventLayout",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.layout.CsvParameterLayout",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.layout.GelfLayout::<init>(java.lang.String, org.apache.logging.log4j.core.util.KeyValuePair[], org.apache.logging.log4j.core.layout.GelfLayout.CompressionType, int, boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.GelfLayout org.apache.logging.log4j.core.layout.GelfLayout::createLayout(java.lang.String, org.apache.logging.log4j.core.util.KeyValuePair[], org.apache.logging.log4j.core.layout.GelfLayout.CompressionType, int, boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.HtmlLayout.Builder org.apache.logging.log4j.core.layout.HtmlLayout.Builder::withCharset(java.nio.charset.Charset)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.HtmlLayout.Builder org.apache.logging.log4j.core.layout.HtmlLayout.Builder::withContentType(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.HtmlLayout.Builder org.apache.logging.log4j.core.layout.HtmlLayout.Builder::withFontName(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.HtmlLayout.Builder org.apache.logging.log4j.core.layout.HtmlLayout.Builder::withFontSize(org.apache.logging.log4j.core.layout.HtmlLayout.FontSize)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.HtmlLayout.Builder org.apache.logging.log4j.core.layout.HtmlLayout.Builder::withLocationInfo(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.HtmlLayout.Builder org.apache.logging.log4j.core.layout.HtmlLayout.Builder::withTitle(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.layout.JsonLayout",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.layout.MarkerPatternSelector::<init>(org.apache.logging.log4j.core.layout.PatternMatch[], java.lang.String, boolean, boolean, org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.MarkerPatternSelector org.apache.logging.log4j.core.layout.MarkerPatternSelector::createSelector(org.apache.logging.log4j.core.layout.PatternMatch[], java.lang.String, boolean, boolean, org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withAlwaysWriteExceptions(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withCharset(java.nio.charset.Charset)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withConfiguration(org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withDisableAnsi(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withFooter(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withHeader(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withNoConsoleNoAnsi(boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withPattern(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withPatternSelector(org.apache.logging.log4j.core.layout.PatternSelector)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout.Builder org.apache.logging.log4j.core.layout.PatternLayout.Builder::withRegexReplacement(org.apache.logging.log4j.core.pattern.RegexReplacement)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.PatternLayout org.apache.logging.log4j.core.layout.PatternLayout::createLayout(java.lang.String, org.apache.logging.log4j.core.layout.PatternSelector, org.apache.logging.log4j.core.config.Configuration, org.apache.logging.log4j.core.pattern.RegexReplacement, java.nio.charset.Charset, boolean, boolean, java.lang.String, java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.AbstractStringLayout.Serializer org.apache.logging.log4j.core.layout.PatternLayout::createSerializer(org.apache.logging.log4j.core.config.Configuration, org.apache.logging.log4j.core.pattern.RegexReplacement, java.lang.String, java.lang.String, org.apache.logging.log4j.core.layout.PatternSelector, boolean, boolean)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.visibilityReduced",
- "old": "method void org.apache.logging.log4j.core.layout.ScriptPatternSelector::<init>(org.apache.logging.log4j.core.script.AbstractScript, org.apache.logging.log4j.core.layout.PatternMatch[], java.lang.String, boolean, boolean, boolean, org.apache.logging.log4j.core.config.Configuration)",
- "new": "method void org.apache.logging.log4j.core.layout.ScriptPatternSelector::<init>(org.apache.logging.log4j.core.script.AbstractScript, org.apache.logging.log4j.core.layout.PatternMatch[], java.lang.String, boolean, boolean, boolean, org.apache.logging.log4j.core.config.Configuration)",
- "oldVisibility": "public",
- "newVisibility": "private",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.ScriptPatternSelector org.apache.logging.log4j.core.layout.ScriptPatternSelector::createSelector(org.apache.logging.log4j.core.script.AbstractScript, org.apache.logging.log4j.core.layout.PatternMatch[], java.lang.String, boolean, boolean, org.apache.logging.log4j.core.config.Configuration)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.layout.SerializedLayout",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.layout.SyslogLayout org.apache.logging.log4j.core.layout.SyslogLayout::createLayout(org.apache.logging.log4j.core.net.Facility, boolean, java.lang.String, java.nio.charset.Charset)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.layout.XmlLayout",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.layout.YamlLayout",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.lookup.MapLookup::setMainArguments(java.lang.String[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.net.MimeMessageBuilder",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.net.SmtpManager",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.net.SslSocketManager::<init>(java.lang.String, java.io.OutputStream, java.net.Socket, org.apache.logging.log4j.core.net.ssl.SslConfiguration, java.net.InetAddress, java.lang.String, int, int, int, boolean, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.net.SslSocketManager org.apache.logging.log4j.core.net.SslSocketManager::getSocketManager(org.apache.logging.log4j.core.net.ssl.SslConfiguration, java.lang.String, int, int, int, boolean, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.net.TcpSocketManager::<init>(java.lang.String, java.io.OutputStream, java.net.Socket, java.net.InetAddress, java.lang.String, int, int, int, boolean, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.net.TcpSocketManager org.apache.logging.log4j.core.net.TcpSocketManager::getSocketManager(java.lang.String, int, int, int, boolean, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, int)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.net.ssl.AbstractKeyStoreConfiguration::<init>(java.lang.String, char[], java.lang.String) throws org.apache.logging.log4j.core.net.ssl.StoreConfigurationException",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.net.ssl.AbstractKeyStoreConfiguration::<init>(java.lang.String, java.lang.String, java.lang.String) throws org.apache.logging.log4j.core.net.ssl.StoreConfigurationException",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration::createKeyStoreConfiguration(java.lang.String, char[], java.lang.String, java.lang.String) throws org.apache.logging.log4j.core.net.ssl.StoreConfigurationException",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration::createKeyStoreConfiguration(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.apache.logging.log4j.core.net.ssl.StoreConfigurationException",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.net.ssl.StoreConfiguration<T>::<init>(java.lang.String, char[])",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.net.ssl.StoreConfiguration<T>::<init>(java.lang.String, java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.returnTypeChanged",
- "old": "method java.lang.String org.apache.logging.log4j.core.net.ssl.StoreConfiguration<T>::getPassword()",
- "new": "method char[] org.apache.logging.log4j.core.net.ssl.StoreConfiguration<T>::getPassword()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method char[] org.apache.logging.log4j.core.net.ssl.StoreConfiguration<T>::getPasswordAsCharArray()",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.net.ssl.StoreConfiguration<T>::setPassword(java.lang.String)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration::<init>(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.apache.logging.log4j.core.net.ssl.StoreConfigurationException",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration::createKeyStoreConfiguration(java.lang.String, char[], java.lang.String, java.lang.String) throws org.apache.logging.log4j.core.net.ssl.StoreConfigurationException",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.removed",
- "old": "method org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration::createKeyStoreConfiguration(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.apache.logging.log4j.core.net.ssl.StoreConfigurationException",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.parser.JsonLogEventParser",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.parser.XmlLogEventParser",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.parser.YamlLogEventParser",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.field.serialVersionUIDChanged",
- "new": "field org.apache.logging.log4j.core.time.MutableInstant.serialVersionUID",
- "oldSerialVersionUID": "-9042291931185997574",
- "newSerialVersionUID": "1",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.time.MutableInstant::initFrom(===org.apache.logging.log4j.core.util.Clock===)",
- "new": "parameter void org.apache.logging.log4j.core.time.MutableInstant::initFrom(===org.apache.logging.log4j.core.time.Clock===)",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.noLongerImplementsInterface",
- "old": "interface org.apache.logging.log4j.core.time.PreciseClock",
- "new": "interface org.apache.logging.log4j.core.time.PreciseClock",
- "interface": "org.apache.logging.log4j.core.util.Clock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.noLongerImplementsInterface",
- "old": "class org.apache.logging.log4j.core.time.internal.FixedPreciseClock",
- "new": "class org.apache.logging.log4j.core.time.internal.FixedPreciseClock",
- "interface": "org.apache.logging.log4j.core.util.Clock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.nonPublicPartOfAPI",
- "new": "interface org.apache.logging.log4j.core.time.internal.format.FastDatePrinter.NumberRule",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.nonPublicPartOfAPI",
- "new": "interface org.apache.logging.log4j.core.time.internal.format.FastDatePrinter.Rule",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.CachedClock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "interface org.apache.logging.log4j.core.util.Clock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.ClockFactory",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.CoarseCachedClock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.DummyNanoClock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "interface org.apache.logging.log4j.core.util.NanoClock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.field.removed",
- "old": "field org.apache.logging.log4j.core.util.NullOutputStream.NULL_OUTPUT_STREAM",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.SystemClock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.SystemMillisClock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.SystemNanoClock",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "interface org.apache.logging.log4j.core.util.datetime.DateParser",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "interface org.apache.logging.log4j.core.util.datetime.DatePrinter",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.datetime.FastDateFormat",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.datetime.FastDateParser",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.datetime.FastDatePrinter",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.datetime.FixedDateFormat",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.util.datetime.Format",
- "justification": "Removed deprecated code"
-
- },
- {
- "code": "java.method.addedToInterface",
- "new": "method void org.apache.logging.log4j.core.appender.rolling.DirectFileRolloverStrategy::clearCurrentFileName()",
- "justification": "Required to reset file name so it can be calculated at the appropriate time"
- },
- {
- "code": "java.method.returnTypeTypeParametersChanged",
- "old": "method org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender::newBuilder()",
- "new": "method <B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>> B org.apache.logging.log4j.core.appender.WriterAppender::newBuilder()",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.generics.elementNowParameterized",
- "old": "method org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender::newBuilder()",
- "new": "method <B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>> B org.apache.logging.log4j.core.appender.WriterAppender::newBuilder()",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.generics.formalTypeParameterAdded",
- "old": "method org.apache.logging.log4j.core.appender.WriterAppender.Builder org.apache.logging.log4j.core.appender.WriterAppender::newBuilder()",
- "new": "method <B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>> B org.apache.logging.log4j.core.appender.WriterAppender::newBuilder()",
- "typeParameter": "B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B extends org.apache.logging.log4j.core.appender.WriterAppender.Builder<B>>",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.AbstractAppender::<init>(java.lang.String, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean)",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender<M extends org.apache.logging.log4j.core.appender.OutputStreamManager>::<init>(java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, boolean, boolean, M)",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.AbstractWriterAppender<M extends org.apache.logging.log4j.core.appender.WriterManager>::<init>(java.lang.String, org.apache.logging.log4j.core.StringLayout, org.apache.logging.log4j.core.Filter, boolean, boolean, M)",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.SocketAppender::<init>(java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.net.AbstractSocketManager, boolean, boolean, org.apache.logging.log4j.core.net.Advertiser, org.apache.logging.log4j.core.config.Property[])",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.SyslogAppender::<init>(java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, boolean, boolean, org.apache.logging.log4j.core.net.AbstractSocketManager, org.apache.logging.log4j.core.net.Advertiser, org.apache.logging.log4j.core.config.Property[])",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender<T extends org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager>::<init>(java.lang.String, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean, T)",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.appender.rolling.RollingFileManager::rollover(===java.util.Date===, java.util.Date)",
- "new": "parameter void org.apache.logging.log4j.core.appender.rolling.RollingFileManager::rollover(===long===, long)",
- "justification": "Fix RollingFileManger"
- },
- {
- "code": "java.method.parameterTypeChanged",
- "old": "parameter void org.apache.logging.log4j.core.appender.rolling.RollingFileManager::rollover(java.util.Date, ===java.util.Date===)",
- "new": "parameter void org.apache.logging.log4j.core.appender.rolling.RollingFileManager::rollover(long, ===long===)",
- "justification": "Use milliseconds instead of date"
- },
- {
- "code": "java.method.removed",
- "old": "method void org.apache.logging.log4j.core.filter.AbstractFilterable::<init>(org.apache.logging.log4j.core.Filter)",
- "justification": "LOG4J2-2491 - Allow all appenders to optionally carry a property array"
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method java.net.Socket org.apache.logging.log4j.core.net.SslSocketManager::createSocket(java.lang.String, int) throws java.io.IOException",
- "new": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.net.InetSocketAddress, org.apache.logging.log4j.core.net.SocketOptions, int) throws java.io.IOException @ org.apache.logging.log4j.core.net.SslSocketManager",
- "justification": "LOG4J2-2586 - Support the host name resolving to mulitple ip addresses"
- },
- {
- "code": "java.method.nowStatic",
- "old": "method java.net.Socket org.apache.logging.log4j.core.net.SslSocketManager::createSocket(java.lang.String, int) throws java.io.IOException",
- "new": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.net.InetSocketAddress, org.apache.logging.log4j.core.net.SocketOptions, int) throws java.io.IOException @ org.apache.logging.log4j.core.net.SslSocketManager",
- "justification": "LOG4J2-2586 - Support the host name resolving to mulitple ip addresses"
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.lang.String, int, org.apache.logging.log4j.core.net.SocketOptions, int) throws java.io.IOException @ org.apache.logging.log4j.core.net.SslSocketManager",
- "new": "method java.net.Socket org.apache.logging.log4j.core.net.SslSocketManager::createSocket(java.net.InetSocketAddress) throws java.io.IOException",
- "justification": "LOG4J2-2586 - Support the host name resolving to mulitple ip addresses"
- },
- {
- "code": "java.method.noLongerStatic",
- "old": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.lang.String, int, org.apache.logging.log4j.core.net.SocketOptions, int) throws java.io.IOException @ org.apache.logging.log4j.core.net.SslSocketManager",
- "new": "method java.net.Socket org.apache.logging.log4j.core.net.SslSocketManager::createSocket(java.net.InetSocketAddress) throws java.io.IOException",
- "justification": "LOG4J2-2586 - Support the host name resolving to mulitple ip addresses"
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.lang.String, int) throws java.io.IOException",
- "new": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.net.InetSocketAddress, org.apache.logging.log4j.core.net.SocketOptions, int) throws java.io.IOException",
- "justification": "LOG4J2-2586 - Support the host name resolving to mulitple ip addresses"
- },
- {
- "code": "java.method.nowStatic",
- "old": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.lang.String, int) throws java.io.IOException",
- "new": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.net.InetSocketAddress, org.apache.logging.log4j.core.net.SocketOptions, int) throws java.io.IOException",
- "justification": "LOG4J2-2586 - Support the host name resolving to mulitple ip addresses"
- },
- {
- "code": "java.method.numberOfParametersChanged",
- "old": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.lang.String, int, org.apache.logging.log4j.core.net.SocketOptions, int) throws java.io.IOException",
- "new": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.net.InetSocketAddress) throws java.io.IOException",
- "justification": "LOG4J2-2586 - Support the host name resolving to mulitple ip addresses"
- },
- {
- "code": "java.method.noLongerStatic",
- "old": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.lang.String, int, org.apache.logging.log4j.core.net.SocketOptions, int) throws java.io.IOException",
- "new": "method java.net.Socket org.apache.logging.log4j.core.net.TcpSocketManager::createSocket(java.net.InetSocketAddress) throws java.io.IOException",
- "justification": "LOG4J2-2586 - Support the host name resolving to mulitple ip addresses"
- },
- {
- "code": "java.class.removed",
- "old": "class org.apache.logging.log4j.core.config.ConfiguratonFileWatcher",
- "justification": "Fixed misspelled class name"
- }
]
}
]
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Appender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/Appender.java
index 91a0932..71aeb0e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Appender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Appender.java
@@ -23,8 +23,8 @@ import java.io.Serializable;
* as an {@link ErrorHandler}. Typical Appender implementations coordinate with an
* implementation of {@link org.apache.logging.log4j.core.appender.AbstractManager} to handle external resources
* such as streams, connections, and other shared state. As Appenders are plugins, concrete implementations need to
- * be annotated with {@link org.apache.logging.log4j.core.config.plugins.Plugin} and need to provide a static
- * factory method annotated with {@link org.apache.logging.log4j.core.config.plugins.PluginFactory}.
+ * be annotated with {@link org.apache.logging.log4j.plugins.Plugin} and need to provide a static
+ * factory method annotated with {@link org.apache.logging.log4j.plugins.PluginFactory}.
*
* <p>Most core plugins are written using a related Manager class that handle the actual task of serializing a
* {@link LogEvent} to some output location. For instance, many Appenders can take
@@ -37,7 +37,7 @@ import java.io.Serializable;
public interface Appender extends LifeCycle {
/**
- * Main {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#elementType() plugin element type} for
+ * Main {@linkplain org.apache.logging.log4j.plugins.Plugin#elementType() plugin element type} for
* Appender plugins.
*
* @since 2.6
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
index 0286498..1baa39b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
@@ -33,7 +33,7 @@ import org.apache.logging.log4j.util.EnglishEnums;
public interface Filter extends LifeCycle {
/**
- * Main {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#elementType() plugin element type} for
+ * Main {@linkplain org.apache.logging.log4j.plugins.Plugin#elementType() plugin element type} for
* Filter plugins.
*
* @since 2.1
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Layout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/Layout.java
index 73b5d6f..aa86fac 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Layout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Layout.java
@@ -47,7 +47,7 @@ import org.apache.logging.log4j.core.layout.Encoder;
public interface Layout<T extends Serializable> extends Encoder<LogEvent> {
/**
- * Main {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#elementType() plugin element type} for
+ * Main {@linkplain org.apache.logging.log4j.plugins.Plugin#elementType() plugin element type} for
* Layout plugins.
*
* @since 2.1
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
index bd3ad0b..1e2125d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
@@ -27,10 +27,10 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.filter.AbstractFilterable;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.Integers;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractFileAppender.java
index ca3428e..4b88cc7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractFileAppender.java
@@ -24,8 +24,8 @@ import java.util.concurrent.TimeUnit;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.net.Advertiser;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
index 2e9356a..b498f95 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.core.util.Constants;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderSet.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderSet.java
index 30de391..ff1e074 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderSet.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderSet.java
@@ -23,12 +23,12 @@ import java.util.Map;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginNode;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginNode;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.status.StatusLogger;
/**
@@ -37,7 +37,7 @@ import org.apache.logging.log4j.status.StatusLogger;
@Plugin(name = "AppenderSet", category = Core.CATEGORY_NAME, printObject = true, deferChildren = true)
public class AppenderSet {
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<AppenderSet> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<AppenderSet> {
@PluginNode
private Node node;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
index a739978..361ce15 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
@@ -42,13 +42,13 @@ import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.Property;
-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.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.filter.AbstractFilterable;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.util.Log4jThread;
@@ -245,7 +245,7 @@ public final class AsyncAppender extends AbstractAppender {
}
public static class Builder<B extends Builder<B>> extends AbstractFilterable.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<AsyncAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<AsyncAppender> {
@PluginElement("AppenderRef")
@Required(message = "No appender references provided to AsyncAppender")
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index 60751b8..e563806 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -21,12 +21,10 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.layout.PatternLayout;
-import org.apache.logging.log4j.core.util.Booleans;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.util.CloseShieldOutputStream;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.core.util.Throwables;
@@ -112,7 +110,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
* @param <B> The type to build
*/
public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<ConsoleAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<ConsoleAppender> {
@PluginBuilderAttribute
@Required
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
index da0c6bb..51e4d3b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
@@ -24,9 +24,9 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* No-Operation Appender that counts events.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
index ce18519..e907fe3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
@@ -29,12 +29,12 @@ import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.AppenderControl;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Property;
-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.PluginAttribute;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.Booleans;
import org.apache.logging.log4j.core.util.Constants;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoversPlugin.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoversPlugin.java
index c537d91..1bf889b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoversPlugin.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoversPlugin.java
@@ -19,9 +19,9 @@ package org.apache.logging.log4j.core.appender;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.config.AppenderRef;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
index d9b8369..b9e4168 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
@@ -25,15 +25,12 @@ import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.net.Advertiser;
-import org.apache.logging.log4j.core.util.Booleans;
-import org.apache.logging.log4j.core.util.Integers;
/**
* File Appender.
@@ -50,7 +47,7 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
* The type to build
*/
public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<FileAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<FileAppender> {
@PluginBuilderAttribute
@Required
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java
index 4c3455f..4a2cc47 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java
@@ -26,14 +26,15 @@ import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+
/**
* Sends log events over HTTP.
@@ -46,7 +47,7 @@ public final class HttpAppender extends AbstractAppender {
* @param <B> The type to build
*/
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<HttpAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<HttpAppender> {
@PluginBuilderAttribute
@Required(message = "No URL provided for HttpAppender")
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
index 8363f4a..1e9c63f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
@@ -26,13 +26,11 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.net.Advertiser;
-import org.apache.logging.log4j.core.util.Booleans;
import org.apache.logging.log4j.core.util.Integers;
/**
@@ -50,7 +48,7 @@ public final class MemoryMappedFileAppender extends AbstractOutputStreamAppender
* The type to build
*/
public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<MemoryMappedFileAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<MemoryMappedFileAppender> {
@PluginBuilderAttribute("fileName")
private String fileName;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java
index 08c0730..0aa4ced 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java
@@ -20,9 +20,9 @@ import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* An Appender that ignores log events. Use for compatibility with version 1.2 and handy for composing a
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
index f2af88f..418d136 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
@@ -24,9 +24,9 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.CloseShieldOutputStream;
@@ -43,7 +43,7 @@ public final class OutputStreamAppender extends AbstractOutputStreamAppender<Out
* Builds OutputStreamAppender instances.
*/
public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<OutputStreamAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<OutputStreamAppender> {
private boolean follow = false;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
index 7b366c4..e333248 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
@@ -26,13 +26,10 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.net.Advertiser;
-import org.apache.logging.log4j.core.util.Booleans;
-import org.apache.logging.log4j.core.util.Integers;
/**
* File Appender.
@@ -47,7 +44,7 @@ public final class RandomAccessFileAppender extends AbstractOutputStreamAppender
* The type to build
*/
public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<RandomAccessFileAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<RandomAccessFileAppender> {
@PluginBuilderAttribute("fileName")
private String fileName;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
index 8312e8c..a1afb46 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
@@ -33,15 +33,12 @@ import org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrateg
import org.apache.logging.log4j.core.appender.rolling.RollingFileManager;
import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy;
import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.net.Advertiser;
-import org.apache.logging.log4j.core.util.Booleans;
-import org.apache.logging.log4j.core.util.Integers;
/**
* An appender that writes to files and can roll over at intervals.
@@ -59,7 +56,7 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
* @since 2.7
*/
public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<RollingFileAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<RollingFileAppender> {
@PluginBuilderAttribute
private String fileName;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
index 17d7aa3..92af006 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
@@ -33,14 +33,11 @@ import org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrateg
import org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager;
import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy;
import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.net.Advertiser;
-import org.apache.logging.log4j.core.util.Booleans;
-import org.apache.logging.log4j.core.util.Integers;
/**
* An appender that writes to random access files and can roll over at
@@ -50,7 +47,7 @@ import org.apache.logging.log4j.core.util.Integers;
public final class RollingRandomAccessFileAppender extends AbstractOutputStreamAppender<RollingRandomAccessFileManager> {
public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<RollingRandomAccessFileAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<RollingRandomAccessFileAppender> {
public Builder() {
super();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
index 36480bc..13df86d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
@@ -28,12 +28,12 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.script.AbstractScript;
import org.apache.logging.log4j.core.script.ScriptManager;
@@ -43,7 +43,7 @@ public class ScriptAppenderSelector extends AbstractAppender {
/**
* Builds an appender.
*/
- public static final class Builder implements org.apache.logging.log4j.core.util.Builder<Appender> {
+ public static final class Builder implements org.apache.logging.log4j.plugins.util.Builder<Appender> {
@PluginElement("AppenderSet")
@Required
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java
index fe19ef3..5a90fc1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java
@@ -27,15 +27,6 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Configuration;
-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.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
import org.apache.logging.log4j.core.net.AbstractSocketManager;
import org.apache.logging.log4j.core.net.Advertiser;
import org.apache.logging.log4j.core.net.DatagramSocketManager;
@@ -44,7 +35,13 @@ import org.apache.logging.log4j.core.net.SocketOptions;
import org.apache.logging.log4j.core.net.SslSocketManager;
import org.apache.logging.log4j.core.net.TcpSocketManager;
import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
-import org.apache.logging.log4j.core.util.Booleans;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
/**
* An Appender that delivers events over socket connections. Supports both TCP and UDP.
@@ -192,7 +189,7 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
* </ul>
*/
public static class Builder extends AbstractBuilder<Builder>
- implements org.apache.logging.log4j.core.util.Builder<SocketAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<SocketAppender> {
@SuppressWarnings("resource")
@Override
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
index ee57b6a..ada063e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
@@ -25,10 +25,10 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.layout.LoggerFields;
import org.apache.logging.log4j.core.layout.Rfc5424Layout;
import org.apache.logging.log4j.core.layout.SyslogLayout;
@@ -38,7 +38,6 @@ import org.apache.logging.log4j.core.net.Facility;
import org.apache.logging.log4j.core.net.Protocol;
import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
import org.apache.logging.log4j.core.util.Constants;
-import org.apache.logging.log4j.util.EnglishEnums;
/**
* The Syslog Appender.
@@ -47,7 +46,7 @@ import org.apache.logging.log4j.util.EnglishEnums;
public class SyslogAppender extends SocketAppender {
public static class Builder<B extends Builder<B>> extends AbstractBuilder<B>
- implements org.apache.logging.log4j.core.util.Builder<SocketAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<SocketAppender> {
@PluginBuilderAttribute(value = "facility")
private Facility facility = Facility.LOCAL0;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/WriterAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/WriterAppender.java
index 1c83018..c27ef72 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/WriterAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/WriterAppender.java
@@ -23,9 +23,9 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.StringLayout;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.CloseShieldWriter;
@@ -39,7 +39,7 @@ public final class WriterAppender extends AbstractWriterAppender<WriterManager>
* Builds WriterAppender instances.
*/
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<WriterAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<WriterAppender> {
private boolean follow = false;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java
index 67ca0e0..6b25301 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java
@@ -23,12 +23,12 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.StringLayout;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.spi.ThreadContextMap;
import org.apache.logging.log4j.spi.ThreadContextStack;
@@ -46,7 +46,7 @@ public class ColumnMapping {
/**
* Builder for {@link ColumnMapping}.
*/
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<ColumnMapping> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<ColumnMapping> {
@PluginConfiguration
private Configuration configuration;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
index 46e7954..7055e11 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
@@ -24,11 +24,10 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.util.Booleans;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
/**
* This Appender writes logging events to a NoSQL database using a configured NoSQL provider. It requires
@@ -53,7 +52,7 @@ public final class NoSqlAppender extends AbstractDatabaseAppender<NoSqlDatabaseM
* The type to build
*/
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<NoSqlAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<NoSqlAppender> {
@PluginBuilderAttribute("bufferSize")
private int bufferSize;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/LoggerNameLevelRewritePolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/LoggerNameLevelRewritePolicy.java
index a1ef2ef..abc9339 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/LoggerNameLevelRewritePolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/LoggerNameLevelRewritePolicy.java
@@ -23,10 +23,10 @@ import java.util.Map;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.util.KeyValuePair;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
index 5302a07..1082573 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
@@ -22,10 +22,10 @@ import java.util.Map;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.message.MapMessage;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/PropertiesRewritePolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/PropertiesRewritePolicy.java
index 88a574d..ccd5571 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/PropertiesRewritePolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/PropertiesRewritePolicy.java
@@ -26,10 +26,10 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.impl.ContextDataFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
index d21056e..5e2661f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
@@ -28,11 +28,11 @@ import org.apache.logging.log4j.core.config.AppenderControl;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.Booleans;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
index b63bca0..c5c024f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CompositeTriggeringPolicy.java
@@ -23,9 +23,9 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LifeCycle2;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Triggering policy that wraps other triggering policies.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
index c15cb5f..03cf69b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicy.java
@@ -28,10 +28,10 @@ import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationScheduler;
import org.apache.logging.log4j.core.config.CronScheduledFuture;
import org.apache.logging.log4j.core.config.Scheduled;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.CronExpression;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
index 1c21474..bd8f986 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
@@ -35,11 +35,11 @@ import org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction;
import org.apache.logging.log4j.core.appender.rolling.action.PathCondition;
import org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.util.Integers;
@@ -85,7 +85,7 @@ public class DefaultRolloverStrategy extends AbstractRolloverStrategy {
/**
* Builds DefaultRolloverStrategy instances.
*/
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<DefaultRolloverStrategy> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<DefaultRolloverStrategy> {
@PluginBuilderAttribute("max")
private String max;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
index 0800593..3a0ab1b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
@@ -34,11 +34,11 @@ import org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction;
import org.apache.logging.log4j.core.appender.rolling.action.PathCondition;
import org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.util.Integers;
@@ -62,7 +62,7 @@ public class DirectWriteRolloverStrategy extends AbstractRolloverStrategy implem
/**
* Builds DirectWriteRolloverStrategy instances.
*/
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<DirectWriteRolloverStrategy> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<DirectWriteRolloverStrategy> {
@PluginBuilderAttribute("maxFiles")
private String maxFiles;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/NoOpTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/NoOpTriggeringPolicy.java
index 149ae4f..6ae08eb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/NoOpTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/NoOpTriggeringPolicy.java
@@ -19,8 +19,8 @@ package org.apache.logging.log4j.core.appender.rolling;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginFactory;
/*
* Never triggers and is handy for edge-cases in tests for example.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
index 77b673a..cfd8f38 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicy.java
@@ -20,9 +20,9 @@ import java.lang.reflect.Method;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
index f77d571..8fde3d9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
@@ -18,9 +18,9 @@ package org.apache.logging.log4j.core.appender.rolling;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
*
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
index 337a0a3..884e9d8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
@@ -21,11 +21,9 @@ import java.util.concurrent.TimeUnit;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.util.Integers;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
/**
* Rolls a file over based on time.
@@ -34,7 +32,7 @@ import org.apache.logging.log4j.core.util.Integers;
public final class TimeBasedTriggeringPolicy extends AbstractTriggeringPolicy {
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<TimeBasedTriggeringPolicy> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<TimeBasedTriggeringPolicy> {
@PluginBuilderAttribute
private int interval = 1;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteAction.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteAction.java
index 76e9b00..cebafb7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteAction.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/DeleteAction.java
@@ -26,11 +26,11 @@ import java.util.Objects;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAccumulatedFileCount.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAccumulatedFileCount.java
index b47954f..6c83a76 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAccumulatedFileCount.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAccumulatedFileCount.java
@@ -24,10 +24,10 @@ import java.util.List;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAccumulatedFileSize.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAccumulatedFileSize.java
index 7c1d908..7bad7d7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAccumulatedFileSize.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAccumulatedFileSize.java
@@ -25,10 +25,10 @@ import java.util.List;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.appender.rolling.FileSize;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAll.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAll.java
index 2eaea8b..69a38bf 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAll.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAll.java
@@ -22,9 +22,9 @@ import java.util.Arrays;
import java.util.Objects;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Composite {@code PathCondition} that only accepts objects that are accepted by <em>all</em> component conditions.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAny.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAny.java
index 6d5841f..c12a252 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAny.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfAny.java
@@ -22,9 +22,9 @@ import java.util.Arrays;
import java.util.Objects;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Composite {@code PathCondition} that accepts objects that are accepted by <em>any</em> component conditions.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfFileName.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfFileName.java
index 1084a77..509fbc6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfFileName.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfFileName.java
@@ -28,10 +28,10 @@ import java.util.regex.Pattern;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java
index ffd740e..d232280 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfLastModified.java
@@ -26,10 +26,10 @@ import java.util.Objects;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfNot.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfNot.java
index 1baf187..9e8e7a5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfNot.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/IfNot.java
@@ -21,9 +21,9 @@ import java.nio.file.attribute.BasicFileAttributes;
import java.util.Objects;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Wrapper {@code PathCondition} that accepts objects that are rejected by the wrapped component filter.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PathSortByModificationTime.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PathSortByModificationTime.java
index e0a04b5..1568dba 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PathSortByModificationTime.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PathSortByModificationTime.java
@@ -20,9 +20,9 @@ package org.apache.logging.log4j.core.appender.rolling.action;
import java.io.Serializable;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* {@link PathSorter} that sorts path by their LastModified attribute.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PosixViewAttributeAction.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PosixViewAttributeAction.java
index fc945a8..7897259 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PosixViewAttributeAction.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/PosixViewAttributeAction.java
@@ -31,12 +31,12 @@ import java.util.Set;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.util.FileUtils;
import org.apache.logging.log4j.util.Strings;
@@ -82,7 +82,7 @@ public class PosixViewAttributeAction extends AbstractPathAction {
/**
* Builder for the posix view attribute action.
*/
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<PosixViewAttributeAction> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<PosixViewAttributeAction> {
@PluginConfiguration
private Configuration configuration;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/ScriptCondition.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/ScriptCondition.java
index 9d728c0..d96a1ba 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/ScriptCondition.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/ScriptCondition.java
@@ -26,10 +26,10 @@ import javax.script.SimpleBindings;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.script.AbstractScript;
import org.apache.logging.log4j.core.script.ScriptFile;
import org.apache.logging.log4j.core.script.ScriptRef;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/IdlePurgePolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/IdlePurgePolicy.java
index e892f66..7184fdd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/IdlePurgePolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/IdlePurgePolicy.java
@@ -28,10 +28,10 @@ import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationScheduler;
import org.apache.logging.log4j.core.config.Scheduled;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Policy is purging appenders that were not in use specified time in minutes
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Route.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Route.java
index 1a92b66..5211b7d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Route.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Route.java
@@ -18,11 +18,11 @@ package org.apache.logging.log4j.core.appender.routing;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginNode;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginNode;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Routes.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Routes.java
index 71d089f..a783cd6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Routes.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Routes.java
@@ -27,12 +27,12 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.script.AbstractScript;
import org.apache.logging.log4j.core.script.ScriptManager;
import org.apache.logging.log4j.status.StatusLogger;
@@ -45,7 +45,7 @@ public final class Routes {
private static final String LOG_EVENT_KEY = "logEvent";
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<Routes> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<Routes> {
@PluginConfiguration
private Configuration configuration;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
index 35dc204..3bae986 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
@@ -29,20 +29,18 @@ import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LifeCycle;
-import org.apache.logging.log4j.core.LifeCycle2;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
import org.apache.logging.log4j.core.config.AppenderControl;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.script.AbstractScript;
import org.apache.logging.log4j.core.script.ScriptManager;
-import org.apache.logging.log4j.core.util.Booleans;
/**
* This Appender "routes" between various Appenders, some of which can be references to
@@ -58,7 +56,7 @@ public final class RoutingAppender extends AbstractAppender {
public static final String STATIC_VARIABLES_KEY = "staticVariables";
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<RoutingAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<RoutingAppender> {
// Does not work unless the element is called "Script", I wanted "DefaultRounteScript"...
@PluginElement("Script")
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ArrayBlockingQueueFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ArrayBlockingQueueFactory.java
index be4bf22..ad94b73 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ArrayBlockingQueueFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ArrayBlockingQueueFactory.java
@@ -19,9 +19,9 @@ package org.apache.logging.log4j.core.async;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Factory for creating instances of {@link ArrayBlockingQueue}.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig.java
index b62a71a..1ecf153 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig.java
@@ -28,16 +28,16 @@ import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.AppenderRef;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
-import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.jmx.RingBufferAdmin;
import org.apache.logging.log4j.core.util.Booleans;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/BlockingQueueFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/BlockingQueueFactory.java
index b495d5f..cd96f7b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/BlockingQueueFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/BlockingQueueFactory.java
@@ -26,7 +26,7 @@ import java.util.concurrent.BlockingQueue;
public interface BlockingQueueFactory<E> {
/**
- * The {@link org.apache.logging.log4j.core.config.plugins.Plugin#elementType() element type} to use for plugins
+ * The {@link org.apache.logging.log4j.plugins.Plugin#elementType() element type} to use for plugins
* implementing this interface.
*/
String ELEMENT_TYPE = "BlockingQueueFactory";
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorBlockingQueueFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorBlockingQueueFactory.java
index 5c941db..66bd78a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorBlockingQueueFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorBlockingQueueFactory.java
@@ -20,10 +20,10 @@ import java.util.concurrent.BlockingQueue;
import com.conversantmedia.util.concurrent.DisruptorBlockingQueue;
import com.conversantmedia.util.concurrent.SpinPolicy;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Factory for creating instances of {@link DisruptorBlockingQueue}.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/JCToolsBlockingQueueFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/JCToolsBlockingQueueFactory.java
index facc59e..c3517c3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/JCToolsBlockingQueueFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/JCToolsBlockingQueueFactory.java
@@ -21,10 +21,10 @@ import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.jctools.queues.MpscArrayQueue;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/LinkedTransferQueueFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/LinkedTransferQueueFactory.java
index 0d4628e..906bb8e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/LinkedTransferQueueFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/LinkedTransferQueueFactory.java
@@ -20,9 +20,9 @@ package org.apache.logging.log4j.core.async;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedTransferQueue;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Factory for creating instances of {@link LinkedTransferQueue}.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
index 1741155..def4d8d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
@@ -64,4 +64,4 @@ public enum ThreadNameCachingStrategy { // LOG4J2-467
return ThreadNameCachingStrategy.valueOf(defaultStrategy);
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index dfa10b5..747f24e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -41,7 +41,6 @@ import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LifeCycle;
-import org.apache.logging.log4j.core.LifeCycle2;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.Version;
@@ -51,8 +50,6 @@ import org.apache.logging.log4j.core.async.AsyncLoggerConfig;
import org.apache.logging.log4j.core.async.AsyncLoggerConfigDelegate;
import org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor;
import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
import org.apache.logging.log4j.core.filter.AbstractFilterable;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.lookup.Interpolator;
@@ -66,12 +63,15 @@ import org.apache.logging.log4j.core.script.ScriptRef;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
import org.apache.logging.log4j.core.util.Loader;
-import org.apache.logging.log4j.core.util.NameUtil;
+import org.apache.logging.log4j.util.NameUtil;
import org.apache.logging.log4j.core.util.Source;
import org.apache.logging.log4j.core.time.NanoClock;
import org.apache.logging.log4j.core.util.WatchManager;
import org.apache.logging.log4j.core.util.Watcher;
import org.apache.logging.log4j.core.util.WatcherFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
import org.apache.logging.log4j.util.PropertiesUtil;
/**
@@ -940,27 +940,27 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
/**
* Invokes a static factory method to either create the desired object or to create a builder object that creates
* the desired object. In the case of a factory method, it should be annotated with
- * {@link org.apache.logging.log4j.core.config.plugins.PluginFactory}, and each parameter should be annotated with
+ * {@link org.apache.logging.log4j.plugins.PluginFactory}, and each parameter should be annotated with
* an appropriate plugin annotation depending on what that parameter describes. Parameters annotated with
- * {@link org.apache.logging.log4j.core.config.plugins.PluginAttribute} must be a type that can be converted from a
- * string using one of the {@link org.apache.logging.log4j.core.config.plugins.convert.TypeConverter TypeConverters}
- * . Parameters with {@link org.apache.logging.log4j.core.config.plugins.PluginElement} may be any plugin class or
+ * {@link org.apache.logging.log4j.plugins.PluginAttribute} must be a type that can be converted from a
+ * string using one of the {@link org.apache.logging.log4j.plugins.convert.TypeConverter TypeConverters}
+ * . Parameters with {@link org.apache.logging.log4j.plugins.PluginElement} may be any plugin class or
* an array of a plugin class. Collections and Maps are currently not supported, although the factory method that is
* called can create these from an array.
*
* Plugins can also be created using a builder class that implements
- * {@link org.apache.logging.log4j.core.util.Builder}. In that case, a static method annotated with
- * {@link org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute} should create the builder class, and
+ * {@link org.apache.logging.log4j.plugins.util.Builder}. In that case, a static method annotated with
+ * {@link org.apache.logging.log4j.plugins.PluginBuilderAttribute} should create the builder class, and
* the various fields in the builder class should be annotated similarly to the method parameters. However, instead
* of using PluginAttribute, one should use
- * {@link org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute} where the default value can be
+ * {@link org.apache.logging.log4j.plugins.PluginBuilderAttribute} where the default value can be
* specified as the default field value instead of as an additional annotation parameter.
*
* In either case, there are also annotations for specifying a
* {@link org.apache.logging.log4j.core.config.Configuration} (
* {@link org.apache.logging.log4j.core.config.plugins.PluginConfiguration}) or a
- * {@link org.apache.logging.log4j.core.config.Node} (
- * {@link org.apache.logging.log4j.core.config.plugins.PluginNode}).
+ * {@link org.apache.logging.log4j.plugins.Node} (
+ * {@link org.apache.logging.log4j.plugins.PluginNode}).
*
* Although the happy path works, more work still needs to be done to log incorrect parameters. These will generally
* result in unhelpful InvocationTargetExceptions.
@@ -970,8 +970,8 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
* @param event the LogEvent that spurred the creation of this plugin
* @return the created plugin object or {@code null} if there was an error setting it up.
* @see org.apache.logging.log4j.core.config.plugins.util.PluginBuilder
- * @see org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor
- * @see org.apache.logging.log4j.core.config.plugins.convert.TypeConverter
+ * @see org.apache.logging.log4j.plugins.visitors.PluginVisitor
+ * @see org.apache.logging.log4j.plugins.convert.TypeConverter
*/
private Object createPluginObject(final PluginType<?> type, final Node node, final LogEvent event) {
final Class<?> clazz = type.getPluginClass();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderRef.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderRef.java
index e0ee77a..eee3c01 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderRef.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderRef.java
@@ -19,11 +19,12 @@ package org.apache.logging.log4j.core.config;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Filter;
-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.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
index 03f5e06..60645bd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
@@ -21,9 +21,9 @@ import java.util.concurrent.ConcurrentMap;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* An Appender container.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
index b314f6b..1a5172c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
@@ -32,6 +32,7 @@ import org.apache.logging.log4j.core.net.Advertiser;
import org.apache.logging.log4j.core.script.ScriptManager;
import org.apache.logging.log4j.core.time.NanoClock;
import org.apache.logging.log4j.core.util.WatchManager;
+import org.apache.logging.log4j.plugins.Node;
/**
* Interface that must be implemented to create a configuration.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
index c0f2b23..ef0643d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
@@ -35,8 +35,6 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
import org.apache.logging.log4j.core.config.composite.CompositeConfiguration;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
import org.apache.logging.log4j.core.lookup.Interpolator;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.net.UrlConnectionFactory;
@@ -45,7 +43,9 @@ import org.apache.logging.log4j.core.util.BasicAuthorizationProvider;
import org.apache.logging.log4j.core.util.FileUtils;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.core.util.NetUtils;
-import org.apache.logging.log4j.core.util.ReflectionUtil;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.util.ReflectionUtil;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.LoaderUtil;
import org.apache.logging.log4j.util.PropertiesUtil;
@@ -94,7 +94,7 @@ public abstract class ConfigurationFactory extends ConfigurationBuilderFactory {
public static final String AUTHORIZATION_PROVIDER = "log4j2.authorizationProvider";
/**
- * Plugin category used to inject a ConfigurationFactory {@link org.apache.logging.log4j.core.config.plugins.Plugin}
+ * Plugin category used to inject a ConfigurationFactory {@link org.apache.logging.log4j.plugins.Plugin}
* class.
*
* @since 2.1
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevelConfig.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevelConfig.java
index ca6bd9b..2194617 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevelConfig.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevelConfig.java
@@ -20,9 +20,9 @@ import java.util.Objects;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevels.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevels.java
index 0b43858..18838f7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevels.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/CustomLevels.java
@@ -22,9 +22,9 @@ import java.util.Arrays;
import java.util.List;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Container for CustomLevelConfig objects.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultAdvertiser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultAdvertiser.java
index cc0e1bc..5c4185f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultAdvertiser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultAdvertiser.java
@@ -18,8 +18,9 @@ package org.apache.logging.log4j.core.config;
import java.util.Map;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.net.Advertiser;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
/**
* The default advertiser does not do anything.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/HttpWatcher.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/HttpWatcher.java
index 1673c07..ea98514 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/HttpWatcher.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/HttpWatcher.java
@@ -25,8 +25,8 @@ import java.net.URL;
import java.util.List;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
import org.apache.logging.log4j.core.net.UrlConnectionFactory;
import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
import org.apache.logging.log4j.core.net.ssl.SslConfigurationFactory;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
index 308e364..7bfcdc1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
@@ -33,12 +33,7 @@ import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.async.AsyncLoggerConfig;
import org.apache.logging.log4j.core.async.AsyncLoggerContext;
import org.apache.logging.log4j.core.async.AsyncLoggerContextSelector;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.filter.AbstractFilterable;
import org.apache.logging.log4j.core.impl.DefaultLogEventFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
@@ -49,6 +44,12 @@ import org.apache.logging.log4j.core.util.Booleans;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggersPlugin.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggersPlugin.java
index a9fb94c..92c9040 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggersPlugin.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggersPlugin.java
@@ -19,9 +19,10 @@ package org.apache.logging.log4j.core.config;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Container of Logger objects.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/PropertiesPlugin.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/PropertiesPlugin.java
index f0ed358..9ead135 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/PropertiesPlugin.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/PropertiesPlugin.java
@@ -19,13 +19,15 @@ package org.apache.logging.log4j.core.config;
import java.util.HashMap;
import java.util.Map;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.lookup.Interpolator;
import org.apache.logging.log4j.core.lookup.MapLookup;
import org.apache.logging.log4j.core.lookup.StrLookup;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Handles properties defined in the configuration.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
index 137fba8..53cf84e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
@@ -19,10 +19,11 @@ package org.apache.logging.log4j.core.config;
import java.util.Objects;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginValue;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginValue;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java
index 4c3ae89..6329f89 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java
@@ -17,9 +17,9 @@
package org.apache.logging.log4j.core.config;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.script.AbstractScript;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ComponentBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ComponentBuilder.java
index 5ad7bab..55090a2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ComponentBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ComponentBuilder.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.config.builder.api;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.util.Builder;
+import org.apache.logging.log4j.plugins.util.Builder;
/**
* Builds arbitrary components and is the base type for the provided components.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
index 1cbf6cc..fa84b43 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationSource;
-import org.apache.logging.log4j.core.util.Builder;
+import org.apache.logging.log4j.plugins.util.Builder;
/**
* Interface for building logging configurations.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/BuiltConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/BuiltConfiguration.java
index d7b840b..7462df6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/BuiltConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/BuiltConfiguration.java
@@ -24,14 +24,14 @@ import java.util.List;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
import org.apache.logging.log4j.core.config.ConfigurationSource;
-import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.Reconfigurable;
import org.apache.logging.log4j.core.config.builder.api.Component;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.config.plugins.util.ResolverUtil;
import org.apache.logging.log4j.core.config.status.StatusConfiguration;
import org.apache.logging.log4j.core.util.Patterns;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.util.ResolverUtil;
/**
* This is the general version of the Configuration created by the Builder. It may be extended to
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
index 7f54455..e9dc3bb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
@@ -28,9 +28,8 @@ import org.apache.logging.log4j.core.config.AbstractConfiguration;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.Reconfigurable;
-import org.apache.logging.log4j.core.config.plugins.util.ResolverUtil;
import org.apache.logging.log4j.core.config.status.StatusConfiguration;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.core.util.Patterns;
@@ -38,6 +37,7 @@ import org.apache.logging.log4j.core.util.Source;
import org.apache.logging.log4j.core.util.WatchManager;
import org.apache.logging.log4j.core.util.Watcher;
import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.plugins.util.ResolverUtil;
/**
* A Composite Configuration.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/DefaultMergeStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/DefaultMergeStrategy.java
index 7b9a21d..e76c5f9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/DefaultMergeStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/DefaultMergeStrategy.java
@@ -24,10 +24,10 @@ import java.util.Objects;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
import org.apache.logging.log4j.core.filter.CompositeFilter;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
/**
* The default merge strategy for composite configurations.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java
index a01f6a3..d8cd797 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/MergeStrategy.java
@@ -17,8 +17,8 @@
package org.apache.logging.log4j.core.config.composite;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.util.PluginManager;
/**
* Merges two configurations together
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/package-info.java
index fd920fa..0f289b6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/package-info.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/package-info.java
@@ -18,4 +18,4 @@
/**
* Support for composite configurations.
*/
-package org.apache.logging.log4j.core.config.composite;
\ No newline at end of file
+package org.apache.logging.log4j.core.config.composite;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
index 3bc5931..ef32a6c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
@@ -34,12 +34,12 @@ import org.apache.logging.log4j.core.config.AbstractConfiguration;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.LoggerConfig;
-import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.Reconfigurable;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.config.plugins.util.ResolverUtil;
import org.apache.logging.log4j.core.config.status.StatusConfiguration;
import org.apache.logging.log4j.core.util.Patterns;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.util.ResolverUtil;
/**
* Creates a Node hierarchy from a JSON file.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfigurationFactory.java
index 20c957c..8b4d2e6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfigurationFactory.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Order;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.Loader;
@Plugin(name = "JsonConfigurationFactory", category = ConfigurationFactory.CATEGORY)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java
index ac7eb74..f6aa202 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java
@@ -23,6 +23,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.apache.logging.log4j.core.config.plugins.visitors.PluginConfigurationVisitor;
+import org.apache.logging.log4j.plugins.PluginVisitorStrategy;
/**
* Identifies a parameter or field as a Configuration.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
index 00e6da7..f83397b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
@@ -17,196 +17,20 @@
package org.apache.logging.log4j.core.config.plugins.convert;
-import java.io.File;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.security.Provider;
-import java.security.Security;
-import java.util.Base64;
-import java.util.UUID;
-import java.util.regex.Pattern;
-
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.appender.rolling.action.Duration;
-import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.CronExpression;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.convert.TypeConverter;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
/**
- * Collection of basic TypeConverter implementations. May be used to register additional TypeConverters or find
- * registered TypeConverters.
+ * Core specific type converters.
*
* @since 2.1 Moved to the {@code convert} package.
*/
-public final class TypeConverters {
-
- /**
- * The {@link Plugin#category() Plugin Category} to use for {@link TypeConverter} plugins.
- *
- * @since 2.1
- */
- public static final String CATEGORY = "TypeConverter";
-
- private static final Base64.Decoder decoder = Base64.getDecoder();
-
- /**
- * Parses a {@link String} into a {@link BigDecimal}.
- */
- @Plugin(name = "BigDecimal", category = CATEGORY)
- public static class BigDecimalConverter implements TypeConverter<BigDecimal> {
- @Override
- public BigDecimal convert(final String s) {
- return new BigDecimal(s);
- }
- }
-
- /**
- * Parses a {@link String} into a {@link BigInteger}.
- */
- @Plugin(name = "BigInteger", category = CATEGORY)
- public static class BigIntegerConverter implements TypeConverter<BigInteger> {
- @Override
- public BigInteger convert(final String s) {
- return new BigInteger(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Boolean}.
- */
- @Plugin(name = "Boolean", category = CATEGORY)
- public static class BooleanConverter implements TypeConverter<Boolean> {
- @Override
- public Boolean convert(final String s) {
- return Boolean.valueOf(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@code byte[]}.
- *
- * The supported formats are:
- * <ul>
- * <li>0x0123456789ABCDEF</li>
- * <li>Base64:ABase64String</li>
- * <li>String using {@link Charset#defaultCharset()} [TODO Should this be UTF-8 instead?]</li>
- * </ul>
- */
- @Plugin(name = "ByteArray", category = CATEGORY)
- public static class ByteArrayConverter implements TypeConverter<byte[]> {
-
- private static final String PREFIX_0x = "0x";
- private static final String PREFIX_BASE64 = "Base64:";
-
- @Override
- public byte[] convert(final String value) {
- byte[] bytes;
- if (value == null || value.isEmpty()) {
- bytes = new byte[0];
- } else if (value.startsWith(PREFIX_BASE64)) {
- final String lexicalXSDBase64Binary = value.substring(PREFIX_BASE64.length());
- bytes = decoder.decode(lexicalXSDBase64Binary);
- } else if (value.startsWith(PREFIX_0x)) {
- final String lexicalXSDHexBinary = value.substring(PREFIX_0x.length());
- bytes = HexConverter.parseHexBinary(lexicalXSDHexBinary);
- } else {
- bytes = value.getBytes(Charset.defaultCharset());
- }
- return bytes;
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Byte}.
- */
- @Plugin(name = "Byte", category = CATEGORY)
- public static class ByteConverter implements TypeConverter<Byte> {
- @Override
- public Byte convert(final String s) {
- return Byte.valueOf(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Character}.
- */
- @Plugin(name = "Character", category = CATEGORY)
- public static class CharacterConverter implements TypeConverter<Character> {
- @Override
- public Character convert(final String s) {
- if (s.length() != 1) {
- throw new IllegalArgumentException("Character string must be of length 1: " + s);
- }
- return Character.valueOf(s.toCharArray()[0]);
- }
- }
-
- /**
- * Converts a {@link String} into a {@code char[]}.
- */
- @Plugin(name = "CharacterArray", category = CATEGORY)
- public static class CharArrayConverter implements TypeConverter<char[]> {
- @Override
- public char[] convert(final String s) {
- return s.toCharArray();
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Charset}.
- */
- @Plugin(name = "Charset", category = CATEGORY)
- public static class CharsetConverter implements TypeConverter<Charset> {
- @Override
- public Charset convert(final String s) {
- return Charset.forName(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Class}.
- */
- @Plugin(name = "Class", category = CATEGORY)
- public static class ClassConverter implements TypeConverter<Class<?>> {
- @Override
- public Class<?> convert(final String s) throws ClassNotFoundException {
- switch (s.toLowerCase()) {
- case "boolean":
- return boolean.class;
- case "byte":
- return byte.class;
- case "char":
- return char.class;
- case "double":
- return double.class;
- case "float":
- return float.class;
- case "int":
- return int.class;
- case "long":
- return long.class;
- case "short":
- return short.class;
- case "void":
- return void.class;
- default:
- return LoaderUtil.loadClass(s);
- }
-
- }
- }
+public final class CoreTypeConverters {
- @Plugin(name = "CronExpression", category = CATEGORY)
+ @Plugin(name = "CronExpression", category = TypeConverters.CATEGORY)
public static class CronExpressionConverter implements TypeConverter<CronExpression> {
@Override
public CronExpression convert(final String s) throws Exception {
@@ -215,234 +39,14 @@ public final class TypeConverters {
}
/**
- * Converts a {@link String} into a {@link Double}.
- */
- @Plugin(name = "Double", category = CATEGORY)
- public static class DoubleConverter implements TypeConverter<Double> {
- @Override
- public Double convert(final String s) {
- return Double.valueOf(s);
- }
- }
-
- /**
* Converts a {@link String} into a {@link Duration}.
* @since 2.5
*/
- @Plugin(name = "Duration", category = CATEGORY)
+ @Plugin(name = "Duration", category = TypeConverters.CATEGORY)
public static class DurationConverter implements TypeConverter<Duration> {
@Override
public Duration convert(final String s) {
return Duration.parse(s);
}
}
-
- /**
- * Converts a {@link String} into a {@link File}.
- */
- @Plugin(name = "File", category = CATEGORY)
- public static class FileConverter implements TypeConverter<File> {
- @Override
- public File convert(final String s) {
- return new File(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Float}.
- */
- @Plugin(name = "Float", category = CATEGORY)
- public static class FloatConverter implements TypeConverter<Float> {
- @Override
- public Float convert(final String s) {
- return Float.valueOf(s);
- }
- }
-
- /**
- * Converts a {@link String} into an {@link InetAddress}.
- */
- @Plugin(name = "InetAddress", category = CATEGORY)
- public static class InetAddressConverter implements TypeConverter<InetAddress> {
- @Override
- public InetAddress convert(final String s) throws Exception {
- return InetAddress.getByName(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Integer}.
- */
- @Plugin(name = "Integer", category = CATEGORY)
- public static class IntegerConverter implements TypeConverter<Integer> {
- @Override
- public Integer convert(final String s) {
- return Integer.valueOf(s);
- }
- }
-
- /**
- * Converts a {@link String} into a Log4j {@link Level}. Returns {@code null} for invalid level names.
- */
- @Plugin(name = "Level", category = CATEGORY)
- public static class LevelConverter implements TypeConverter<Level> {
- @Override
- public Level convert(final String s) {
- return Level.valueOf(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Long}.
- */
- @Plugin(name = "Long", category = CATEGORY)
- public static class LongConverter implements TypeConverter<Long> {
- @Override
- public Long convert(final String s) {
- return Long.valueOf(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Path}.
- * @since 2.8
- */
- @Plugin(name = "Path", category = CATEGORY)
- public static class PathConverter implements TypeConverter<Path> {
- @Override
- public Path convert(final String s) throws Exception {
- return Paths.get(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Pattern}.
- */
- @Plugin(name = "Pattern", category = CATEGORY)
- public static class PatternConverter implements TypeConverter<Pattern> {
- @Override
- public Pattern convert(final String s) {
- return Pattern.compile(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Provider}.
- */
- @Plugin(name = "SecurityProvider", category = CATEGORY)
- public static class SecurityProviderConverter implements TypeConverter<Provider> {
- @Override
- public Provider convert(final String s) {
- return Security.getProvider(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link Short}.
- */
- @Plugin(name = "Short", category = CATEGORY)
- public static class ShortConverter implements TypeConverter<Short> {
- @Override
- public Short convert(final String s) {
- return Short.valueOf(s);
- }
- }
-
- /**
- * Returns the given {@link String}, no conversion takes place.
- */
- @Plugin(name = "String", category = CATEGORY)
- public static class StringConverter implements TypeConverter<String> {
- @Override
- public String convert(final String s) {
- return s;
- }
- }
-
- /**
- * Converts a {@link String} into a {@link URI}.
- */
- @Plugin(name = "URI", category = CATEGORY)
- public static class UriConverter implements TypeConverter<URI> {
- @Override
- public URI convert(final String s) throws URISyntaxException {
- return new URI(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link URL}.
- */
- @Plugin(name = "URL", category = CATEGORY)
- public static class UrlConverter implements TypeConverter<URL> {
- @Override
- public URL convert(final String s) throws MalformedURLException {
- return new URL(s);
- }
- }
-
- /**
- * Converts a {@link String} into a {@link UUID}.
- * @since 2.8
- */
- @Plugin(name = "UUID", category = CATEGORY)
- public static class UuidConverter implements TypeConverter<UUID> {
- @Override
- public UUID convert(final String s) throws Exception {
- return UUID.fromString(s);
- }
- }
-
- /**
- * Converts a String to a given class if a TypeConverter is available for that class. Falls back to the provided
- * default value if the conversion is unsuccessful. However, if the default value is <em>also</em> invalid, then
- * {@code null} is returned (along with a nasty status log message).
- *
- * @param s
- * the string to convert
- * @param clazz
- * the class to try to convert the string to
- * @param defaultValue
- * the fallback object to use if the conversion is unsuccessful
- * @return the converted object which may be {@code null} if the string is invalid for the given type
- * @throws NullPointerException
- * if {@code clazz} is {@code null}
- * @throws IllegalArgumentException
- * if no TypeConverter exists for the given class
- */
- public static <T> T convert(final String s, final Class<? extends T> clazz, final Object defaultValue) {
- @SuppressWarnings("unchecked")
- final TypeConverter<T> converter = (TypeConverter<T>) TypeConverterRegistry.getInstance().findCompatibleConverter(clazz);
- if (s == null) {
- // don't debug print here, resulting output is hard to understand
- // LOGGER.debug("Null string given to convert. Using default [{}].", defaultValue);
- return parseDefaultValue(converter, defaultValue);
- }
- try {
- return converter.convert(s);
- } catch (final Exception e) {
- LOGGER.warn("Error while converting string [{}] to type [{}]. Using default value [{}].", s, clazz,
- defaultValue, e);
- return parseDefaultValue(converter, defaultValue);
- }
- }
-
- @SuppressWarnings("unchecked")
- private static <T> T parseDefaultValue(final TypeConverter<T> converter, final Object defaultValue) {
- if (defaultValue == null) {
- return null;
- }
- if (!(defaultValue instanceof String)) {
- return (T) defaultValue;
- }
- try {
- return converter.convert((String) defaultValue);
- } catch (final Exception e) {
- LOGGER.debug("Can't parse default value [{}] for type [{}].", defaultValue, converter.getClass(), e);
- return null;
- }
- }
-
- private static final Logger LOGGER = StatusLogger.getLogger();
-
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/package-info.java
index 5e74915..0224a3e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/package-info.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/package-info.java
@@ -18,4 +18,4 @@
/**
* Annotations for Log4j 2 plugins.
*/
-package org.apache.logging.log4j.core.config.plugins;
\ No newline at end of file
+package org.apache.logging.log4j.core.config.plugins;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
index a8d7522..5982af4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
@@ -23,27 +23,29 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.function.Function;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.PluginAliases;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidator;
-import org.apache.logging.log4j.core.config.plugins.validation.ConstraintValidators;
-import org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor;
-import org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitors;
-import org.apache.logging.log4j.core.util.Builder;
-import org.apache.logging.log4j.core.util.ReflectionUtil;
-import org.apache.logging.log4j.core.util.TypeUtil;
+import org.apache.logging.log4j.core.lookup.StrSubstitutor;
+import org.apache.logging.log4j.plugins.util.Builder;
+import org.apache.logging.log4j.util.ReflectionUtil;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.util.TypeUtil;
+import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
+import org.apache.logging.log4j.plugins.validation.ConstraintValidators;
+import org.apache.logging.log4j.plugins.visitors.PluginVisitor;
+import org.apache.logging.log4j.plugins.visitors.PluginVisitors;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.StringBuilders;
@@ -61,6 +63,7 @@ public class PluginBuilder implements Builder<Object> {
private Configuration configuration;
private Node node;
private LogEvent event;
+ private Substitutor substitutor;
/**
* Constructs a PluginBuilder for a given PluginType.
@@ -113,6 +116,7 @@ public class PluginBuilder implements Builder<Object> {
@Override
public Object build() {
verify();
+ substitutor = new Substitutor(event);
// first try to use a builder class if one is available
try {
LOGGER.debug("Building Plugin[name={}, class={}].", pluginType.getElementName(),
@@ -128,7 +132,7 @@ public class PluginBuilder implements Builder<Object> {
} catch (final Exception e) {
LOGGER.error("Could not create plugin of type {} for element {}: {}",
this.clazz, node.getName(),
- (e instanceof InvocationTargetException ? ((InvocationTargetException) e).getCause() : e).toString(), e);
+ (e instanceof InvocationTargetException ? e.getCause() : e).toString(), e);
}
// or fall back to factory method if no builder class is available
try {
@@ -138,7 +142,7 @@ public class PluginBuilder implements Builder<Object> {
} catch (final Exception e) {
LOGGER.error("Unable to invoke factory method in {} for element {}: {}",
this.clazz, this.node.getName(),
- (e instanceof InvocationTargetException ? ((InvocationTargetException) e).getCause() : e).toString(), e);
+ (e instanceof InvocationTargetException ? e.getCause() : e).toString(), e);
return null;
}
}
@@ -166,7 +170,7 @@ public class PluginBuilder implements Builder<Object> {
AccessibleObject.setAccessible(fields.toArray(new Field[] {}), true);
final StringBuilder log = new StringBuilder();
boolean invalid = false;
- String reason = "";
+ StringBuilder reason = new StringBuilder();
for (final Field field : fields) {
log.append(log.length() == 0 ? simpleName(builder) + "(" : ", ");
final Annotation[] annotations = field.getDeclaredAnnotations();
@@ -175,15 +179,14 @@ public class PluginBuilder implements Builder<Object> {
if (a instanceof PluginAliases) {
continue; // already processed
}
- final PluginVisitor<? extends Annotation> visitor =
+ final PluginVisitor<? extends Annotation, Configuration> visitor =
PluginVisitors.findVisitor(a.annotationType());
if (visitor != null) {
final Object value = visitor.setAliases(aliases)
.setAnnotation(a)
.setConversionType(field.getType())
- .setStrSubstitutor(configuration.getStrSubstitutor())
.setMember(field)
- .visit(configuration, node, event, log);
+ .visit(configuration, node, substitutor, log);
// don't overwrite default values if the visitor gives us no value to inject
if (value != null) {
field.set(builder, value);
@@ -196,17 +199,21 @@ public class PluginBuilder implements Builder<Object> {
for (final ConstraintValidator<?> validator : validators) {
if (!validator.isValid(field.getName(), value)) {
invalid = true;
- if (!reason.isEmpty()) {
- reason += ", ";
+ if (reason.length() > 0) {
+ reason.append(", ");
+ } else {
+ reason.append("Arguments given for element ").append(node.getName())
+ .append(" are invalid: ");
}
- reason += "field '" + field.getName() + "' has invalid value '" + value + "'";
+ reason.append("field '").append(field.getName()).append("' has invalid value '")
+ .append(value).append("'");
}
}
}
log.append(log.length() == 0 ? builder.getClass().getSimpleName() + "()" : ")");
LOGGER.debug(log.toString());
if (invalid) {
- throw new ConfigurationException("Arguments given for element " + node.getName() + " are invalid: " + reason);
+ throw new ConfigurationException(reason.toString());
}
checkForRemainingAttributes();
verifyNodeChildrenUsed();
@@ -248,15 +255,14 @@ public class PluginBuilder implements Builder<Object> {
if (a instanceof PluginAliases) {
continue; // already processed
}
- final PluginVisitor<? extends Annotation> visitor = PluginVisitors.findVisitor(
+ final PluginVisitor<? extends Annotation, Configuration> visitor = PluginVisitors.findVisitor(
a.annotationType());
if (visitor != null) {
final Object value = visitor.setAliases(aliases)
.setAnnotation(a)
.setConversionType(types[i])
- .setStrSubstitutor(configuration.getStrSubstitutor())
.setMember(factory)
- .visit(configuration, node, event, log);
+ .visit(configuration, node, substitutor, log);
// don't overwrite existing values if the visitor gives us no value to inject
if (value != null) {
args[i] = value;
@@ -325,4 +331,19 @@ public class PluginBuilder implements Builder<Object> {
}
}
}
+
+ private class Substitutor implements Function<String, String> {
+ private final LogEvent event;
+ private final StrSubstitutor strSubstitutor;
+
+ Substitutor(LogEvent event) {
+ this.event = event;
+ this.strSubstitutor = configuration.getStrSubstitutor();
+ }
+
+ @Override
+ public String apply(String str) {
+ return strSubstitutor.replace(event, str);
+ }
+ }
}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginConfigurationVisitor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginConfigurationVisitor.java
index a5a896f..4ff709f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginConfigurationVisitor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginConfigurationVisitor.java
@@ -17,21 +17,23 @@
package org.apache.logging.log4j.core.config.plugins.visitors;
-import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
+import org.apache.logging.log4j.plugins.visitors.AbstractPluginVisitor;
+import org.apache.logging.log4j.plugins.Node;
+
+import java.util.function.Function;
/**
* PluginVisitor implementation for {@link PluginConfiguration}.
*/
-public class PluginConfigurationVisitor extends AbstractPluginVisitor<PluginConfiguration> {
+public class PluginConfigurationVisitor extends AbstractPluginVisitor<PluginConfiguration, Configuration> {
public PluginConfigurationVisitor() {
super(PluginConfiguration.class);
}
@Override
- public Object visit(final Configuration configuration, final Node node, final LogEvent event,
+ public Object visit(final Configuration configuration, final Node node, final Function<String, String> substitutor,
final StringBuilder log) {
if (this.conversionType.isInstance(configuration)) {
log.append("Configuration");
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/package-info.java
index eae8603..eb5ed62 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/package-info.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/package-info.java
@@ -17,8 +17,8 @@
/**
* Visitor classes for extracting values from a Configuration or Node corresponding to a plugin annotation.
- * Visitor implementations must implement {@link org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor},
+ * Visitor implementations must implement {@link org.apache.logging.log4j.plugins.visitors.PluginVisitor},
* and the corresponding annotation must be annotated with
- * {@link org.apache.logging.log4j.core.config.plugins.PluginVisitorStrategy}.
+ * {@link org.apache.logging.log4j.plugins.PluginVisitorStrategy}.
*/
package org.apache.logging.log4j.core.config.plugins.visitors;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
index 3143259..6d52329 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
@@ -41,7 +41,7 @@ import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuild
import org.apache.logging.log4j.core.config.builder.api.ScriptComponentBuilder;
import org.apache.logging.log4j.core.config.builder.api.ScriptFileComponentBuilder;
import org.apache.logging.log4j.core.filter.AbstractFilter.AbstractFilterBuilder;
-import org.apache.logging.log4j.core.util.Builder;
+import org.apache.logging.log4j.plugins.util.Builder;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationFactory.java
index d5e1aa9..cb687e3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationFactory.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Order;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
* Creates a PropertiesConfiguration from a properties file.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
index 5c70cbe..ca053ce 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
@@ -37,15 +37,15 @@ import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationSource;
-import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.Reconfigurable;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.config.plugins.util.ResolverUtil;
import org.apache.logging.log4j.core.config.status.StatusConfiguration;
import org.apache.logging.log4j.core.util.Closer;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.core.util.Patterns;
import org.apache.logging.log4j.core.util.Throwables;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.util.ResolverUtil;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfigurationFactory.java
index a37718f..29f21c2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfigurationFactory.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Order;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
* Factory to construct an XmlConfiguration.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/yaml/YamlConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/yaml/YamlConfigurationFactory.java
index c8f4560..cc25ce4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/yaml/YamlConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/yaml/YamlConfigurationFactory.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Order;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.Loader;
@Plugin(name = "YamlConfigurationFactory", category = ConfigurationFactory.CATEGORY)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilter.java
index 5e3c133..0df9957 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilter.java
@@ -22,7 +22,7 @@ import org.apache.logging.log4j.core.AbstractLifeCycle;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.message.Message;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
index 0a393f2..e8f68cd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LifeCycle2;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginElement;
/**
* Enhances a Class by allowing it to contain Filters.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/BurstFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/BurstFilter.java
index c2326ad..8edae28 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/BurstFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/BurstFilter.java
@@ -28,10 +28,10 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.message.Message;
/**
@@ -290,7 +290,7 @@ public final class BurstFilter extends AbstractFilter {
return new Builder();
}
- public static class Builder extends AbstractFilterBuilder<Builder> implements org.apache.logging.log4j.core.util.Builder<BurstFilter> {
+ public static class Builder extends AbstractFilterBuilder<Builder> implements org.apache.logging.log4j.plugins.util.Builder<BurstFilter> {
@PluginBuilderAttribute
private Level level = Level.WARN;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
index 3fcc1c1..fe40d74 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
@@ -30,10 +30,10 @@ import org.apache.logging.log4j.core.LifeCycle;
import org.apache.logging.log4j.core.LifeCycle2;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.ObjectArrayIterator;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java
index 923a39c..738f49a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java
@@ -26,11 +26,11 @@ import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.ContextDataInjector;
import org.apache.logging.log4j.core.impl.ContextDataInjectorFactory;
import org.apache.logging.log4j.core.util.KeyValuePair;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
index 0e79b85..983873c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
@@ -21,10 +21,10 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
index f53cd84..7f64384 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
@@ -27,11 +27,11 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.message.MapMessage;
import org.apache.logging.log4j.message.Message;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
index b828e31..5d63518 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
@@ -21,10 +21,10 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java
index 6b18b6b..d7ab68a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java
@@ -27,11 +27,11 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.message.Message;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ScriptFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ScriptFilter.java
index 1e47d4e..31086e0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ScriptFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ScriptFilter.java
@@ -24,12 +24,12 @@ import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.script.AbstractScript;
import org.apache.logging.log4j.core.script.ScriptRef;
import org.apache.logging.log4j.message.Message;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StructuredDataFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StructuredDataFilter.java
index 91a9924..d806869 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StructuredDataFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StructuredDataFilter.java
@@ -26,11 +26,11 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.StructuredDataMessage;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java
index 7f11e32..22b2f94 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java
@@ -28,12 +28,12 @@ import org.apache.logging.log4j.core.ContextDataInjector;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-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.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.impl.ContextDataInjectorFactory;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.message.Message;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
index ae9d126..db6f99a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
@@ -21,10 +21,10 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
index ba3f609..1fe61d3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
@@ -26,10 +26,10 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.message.Message;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/package-info.java
index 8c4d417..07d1cee 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/package-info.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/package-info.java
@@ -16,9 +16,9 @@
*/
/**
* Log4j 2 Filter support. {@link org.apache.logging.log4j.core.Filter} plugins should use the
- * {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#category() plugin category}
- * {@link org.apache.logging.log4j.core.config.Node#CATEGORY Core} and the
- * {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#elementType() element type}
+ * {@linkplain org.apache.logging.log4j.plugins.Plugin#category() plugin category}
+ * {@link org.apache.logging.log4j.plugins.Node#CATEGORY Core} and the
+ * {@linkplain org.apache.logging.log4j.plugins.Plugin#elementType() element type}
* {@link org.apache.logging.log4j.core.Filter#ELEMENT_TYPE filter}.
*/
package org.apache.logging.log4j.core.filter;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ExtendedClassInfo.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ExtendedClassInfo.java
index 44d42f9..0ab9a8d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ExtendedClassInfo.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ExtendedClassInfo.java
@@ -120,4 +120,4 @@ public final class ExtendedClassInfo implements Serializable {
return sb.toString();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
index 5a8402b..1090399 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
@@ -77,7 +77,7 @@ public class Log4jLogEvent implements LogEvent {
private final transient long nanoTime;
/** LogEvent Builder helper class. */
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<LogEvent> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<LogEvent> {
private String loggerFqcn;
private Marker marker;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java
index 3f44749..65bcc52 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
index 3b9eb61..9ff44ae 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
@@ -24,8 +24,8 @@ import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.StringLayout;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.impl.DefaultLogEventFactory;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.core.util.StringEncoder;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index 3158fa1..2f5c5e9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -31,12 +31,11 @@ import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.core.net.Severity;
import org.apache.logging.log4j.core.util.JsonUtils;
@@ -100,7 +99,7 @@ public final class GelfLayout extends AbstractStringLayout {
private final boolean includeNullDelimiter;
public static class Builder<B extends Builder<B>> extends AbstractStringLayout.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<GelfLayout> {
+ implements org.apache.logging.log4j.plugins.util.Builder<GelfLayout> {
@PluginBuilderAttribute
private String host;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/HtmlLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/HtmlLayout.java
index 24a8170..accbb6e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/HtmlLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/HtmlLayout.java
@@ -31,12 +31,12 @@ import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.LoggerConfig;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.Transform;
import org.apache.logging.log4j.util.Strings;
@@ -365,7 +365,7 @@ public final class HtmlLayout extends AbstractStringLayout {
return new Builder();
}
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<HtmlLayout> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<HtmlLayout> {
@PluginBuilderAttribute
private boolean locationInfo = false;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java
index b01dc5e..0995c69 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java
@@ -20,11 +20,11 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.message.StructuredDataId;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
index d319940..54e6f5d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
@@ -24,12 +24,12 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.pattern.PatternFormatter;
import org.apache.logging.log4j.core.pattern.PatternParser;
import org.apache.logging.log4j.status.StatusLogger;
@@ -43,7 +43,7 @@ public class MarkerPatternSelector implements PatternSelector {
/**
* Custom MarkerPatternSelector builder. Use the {@link MarkerPatternSelector#newBuilder() builder factory method} to create this.
*/
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<MarkerPatternSelector> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<MarkerPatternSelector> {
@PluginElement("PatternMatch")
private PatternMatch[] properties;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MessageLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MessageLayout.java
index 2a8296c..64d116e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MessageLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MessageLayout.java
@@ -20,9 +20,9 @@ package org.apache.logging.log4j.core.layout;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.message.Message;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index 5a259d6..097ab6c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -26,14 +26,12 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import org.apache.logging.log4j.core.pattern.PatternFormatter;
import org.apache.logging.log4j.core.pattern.PatternParser;
@@ -277,7 +275,7 @@ public final class PatternLayout extends AbstractStringLayout {
}
}
- public static class SerializerBuilder implements org.apache.logging.log4j.core.util.Builder<Serializer> {
+ public static class SerializerBuilder implements org.apache.logging.log4j.plugins.util.Builder<Serializer> {
private Configuration configuration;
private RegexReplacement replace;
@@ -436,7 +434,7 @@ public final class PatternLayout extends AbstractStringLayout {
/**
* Custom PatternLayout builder. Use the {@link PatternLayout#newBuilder() builder factory method} to create this.
*/
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<PatternLayout> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<PatternLayout> {
@PluginBuilderAttribute
private String pattern = PatternLayout.DEFAULT_CONVERSION_PATTERN;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternMatch.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternMatch.java
index 2c6803d..d1b7504 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternMatch.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternMatch.java
@@ -20,10 +20,10 @@ package org.apache.logging.log4j.core.layout;
import java.io.ObjectStreamException;
import java.io.Serializable;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
/**
* PatternMatch configuration item.
@@ -72,7 +72,7 @@ public final class PatternMatch {
return new Builder();
}
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<PatternMatch>, Serializable {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<PatternMatch>, Serializable {
private static final long serialVersionUID = 1L;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
index bd5fb95..5c47326 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
@@ -35,12 +35,12 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.TlsSyslogFrame;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.net.Facility;
import org.apache.logging.log4j.core.net.Priority;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
index 0b48bd3..e65d762 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
@@ -25,12 +25,12 @@ import javax.script.SimpleBindings;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.pattern.PatternFormatter;
import org.apache.logging.log4j.core.pattern.PatternParser;
import org.apache.logging.log4j.core.script.AbstractScript;
@@ -46,7 +46,7 @@ public class ScriptPatternSelector implements PatternSelector {
/**
* Custom ScriptPatternSelector builder. Use the {@link #newBuilder() builder factory method} to create this.
*/
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<ScriptPatternSelector> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<ScriptPatternSelector> {
@PluginElement("Script")
private AbstractScript script;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
index 0e01674..2fcb52f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
@@ -28,10 +28,10 @@ import java.util.regex.Pattern;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.net.Facility;
import org.apache.logging.log4j.core.net.Priority;
import org.apache.logging.log4j.core.util.NetUtils;
@@ -55,7 +55,7 @@ public final class SyslogLayout extends AbstractStringLayout {
* @param <B> the builder type
*/
public static class Builder<B extends Builder<B>> extends AbstractStringLayout.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<SyslogLayout> {
+ implements org.apache.logging.log4j.plugins.util.Builder<SyslogLayout> {
public Builder() {
super();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/package-info.java
index 581c139..58c4503 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/package-info.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/package-info.java
@@ -16,9 +16,9 @@
*/
/**
* Log4j 2 Layout support. {@link org.apache.logging.log4j.core.Layout} plugins should use the
- * {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#category() plugin category}
- * {@link org.apache.logging.log4j.core.config.Node#CATEGORY Core} and the
- * {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#elementType() element type}
+ * {@linkplain org.apache.logging.log4j.plugins.Plugin#category() plugin category}
+ * {@link org.apache.logging.log4j.plugins.Node#CATEGORY Core} and the
+ * {@linkplain org.apache.logging.log4j.plugins.Plugin#elementType() element type}
* {@link org.apache.logging.log4j.core.Layout#ELEMENT_TYPE layout}.
*/
package org.apache.logging.log4j.core.layout;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ContextMapLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ContextMapLookup.java
index 220d17a..d8a6310 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ContextMapLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ContextMapLookup.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.lookup;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.ContextDataInjector;
import org.apache.logging.log4j.core.impl.ContextDataInjectorFactory;
import org.apache.logging.log4j.util.ReadOnlyStringMap;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/DateLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/DateLookup.java
index 3e630b0..2db4e68 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/DateLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/DateLookup.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/EnvironmentLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/EnvironmentLookup.java
index 7f0d935..5ea8657 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/EnvironmentLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/EnvironmentLookup.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.lookup;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
* Looks up keys from environment variables.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
index 53dcffc..c57bdc8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
@@ -24,10 +24,10 @@ import java.util.Map;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.ConfigurationAware;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
import org.apache.logging.log4j.core.util.Loader;
-import org.apache.logging.log4j.core.util.ReflectionUtil;
+import org.apache.logging.log4j.util.ReflectionUtil;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Constants;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JavaLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JavaLookup.java
index 4b230f9..af3f094 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JavaLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JavaLookup.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.lookup;
import java.util.Locale;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.Strings;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JmxRuntimeInputArgumentsLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JmxRuntimeInputArgumentsLookup.java
index 3dc2e5d..e1cec53 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JmxRuntimeInputArgumentsLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JmxRuntimeInputArgumentsLookup.java
@@ -20,7 +20,7 @@ import java.lang.management.ManagementFactory;
import java.util.List;
import java.util.Map;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
* Maps JVM input arguments (but not main arguments) using JMX to acquire JVM arguments.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java
index 30e65ad..be0174e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.net.JndiManager;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Log4jLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Log4jLookup.java
index 2f1ef67..a405687 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Log4jLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Log4jLookup.java
@@ -23,7 +23,7 @@ import java.net.URL;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.ConfigurationSource;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MainMapLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MainMapLookup.java
index a50de0d..adddd53 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MainMapLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MainMapLookup.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.lookup;
import java.util.Map;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
* A map-based lookup for main arguments.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MapLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MapLookup.java
index ae2f7ec..7d60979 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MapLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MapLookup.java
@@ -21,7 +21,7 @@ import java.util.List;
import java.util.Map;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.message.MapMessage;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MarkerLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MarkerLookup.java
index 320db49..bdf71f2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MarkerLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MarkerLookup.java
@@ -20,7 +20,7 @@ package org.apache.logging.log4j.core.lookup;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
* Looks-up markers.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ResourceBundleLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ResourceBundleLookup.java
index 83187c2..ff5ebab 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ResourceBundleLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/ResourceBundleLookup.java
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StructuredDataLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StructuredDataLookup.java
index 379d6a9..cf12cf9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StructuredDataLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StructuredDataLookup.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.lookup;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.message.StructuredDataMessage;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/SystemPropertiesLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/SystemPropertiesLookup.java
index b74569a..3f35608 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/SystemPropertiesLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/SystemPropertiesLookup.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/package-info.java
index 87010c4..a5081ba 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/package-info.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/package-info.java
@@ -17,7 +17,7 @@
/**
* Log4j 2 Lookups. These are used in variable interpolation in various configuration attributes.
* {@link org.apache.logging.log4j.core.lookup.StrLookup} plugins should use the
- * {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#category() plugin category}
+ * {@linkplain org.apache.logging.log4j.plugins.Plugin#category() plugin category}
* {@link org.apache.logging.log4j.core.lookup.StrLookup#CATEGORY Lookup}.
*/
package org.apache.logging.log4j.core.lookup;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/MulticastDnsAdvertiser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/MulticastDnsAdvertiser.java
index 3d610bf..757758f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/MulticastDnsAdvertiser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/MulticastDnsAdvertiser.java
@@ -24,7 +24,7 @@ import java.util.Map;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.Integers;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.LoaderUtil;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketAddress.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketAddress.java
index ef3ff05..e771dc0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketAddress.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketAddress.java
@@ -19,12 +19,12 @@ package org.apache.logging.log4j.core.net;
import java.net.InetAddress;
import java.net.InetSocketAddress;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
/**
* Plugin to hold a hostname and port (socket address).
@@ -71,7 +71,7 @@ public class SocketAddress {
return new Builder();
}
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<SocketAddress> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<SocketAddress> {
@PluginBuilderAttribute
@ValidHost
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
index 711d044..afad2b3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
@@ -20,11 +20,11 @@ import java.net.Socket;
import java.net.SocketException;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.util.Builder;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.util.Builder;
/**
* Holds all socket options settable via {@link Socket} methods.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketPerformancePreferences.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketPerformancePreferences.java
index 8a7e1b0..3ba8d09 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketPerformancePreferences.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketPerformancePreferences.java
@@ -18,11 +18,11 @@ package org.apache.logging.log4j.core.net;
import java.net.Socket;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.util.Builder;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.util.Builder;
/**
* Holds all socket options settable via {@link Socket#setPerformancePreferences(int, int, int)}.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/KeyStoreConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/KeyStoreConfiguration.java
index dfc3750..b58c91d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/KeyStoreConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/KeyStoreConfiguration.java
@@ -24,9 +24,9 @@ import java.util.Arrays;
import javax.net.ssl.KeyManagerFactory;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Configuration of the KeyStore
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfiguration.java
index 872bf2e..c39db8d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfiguration.java
@@ -30,10 +30,10 @@ import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/TrustStoreConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/TrustStoreConfiguration.java
index d386b61..d64dcca 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/TrustStoreConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/TrustStoreConfiguration.java
@@ -23,9 +23,9 @@ import java.util.Arrays;
import javax.net.ssl.TrustManagerFactory;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Configuration of the TrustStore
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/package-info.java
index 8424471..93e6359 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/package-info.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/package-info.java
@@ -17,4 +17,4 @@
/**
* Log4j 2 SSL support
*/
-package org.apache.logging.log4j.core.net.ssl;
\ No newline at end of file
+package org.apache.logging.log4j.core.net.ssl;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/Activator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/Activator.java
index 816ce37..afbefa5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/Activator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/Activator.java
@@ -22,7 +22,7 @@ import java.util.concurrent.atomic.AtomicReference;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.util.PluginRegistry;
+import org.apache.logging.log4j.plugins.util.PluginRegistry;
import org.apache.logging.log4j.core.impl.Log4jProvider;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.spi.Provider;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/package-info.java
index d7963e5..7c7e8ce 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/package-info.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/package-info.java
@@ -18,4 +18,4 @@
/**
* Collection of OSGi-specific classes for bundles.
*/
-package org.apache.logging.log4j.core.osgi;
\ No newline at end of file
+package org.apache.logging.log4j.core.osgi;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AbstractStyleNameConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AbstractStyleNameConverter.java
index 2e1db29..a82aa1f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AbstractStyleNameConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AbstractStyleNameConverter.java
@@ -23,7 +23,7 @@ import java.util.List;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ClassNamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ClassNamePatternConverter.java
index 30f580f..f02b5be 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ClassNamePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ClassNamePatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
index c1799d9..fa7edfe 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
@@ -23,7 +23,7 @@ import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.core.time.MutableInstant;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
index 941ecca..c1b83c3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
@@ -20,7 +20,7 @@ import java.util.List;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.util.EnglishEnums;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java
index bf62768..bff1c7d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
index 8e30ac5..cc97ad1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
import java.util.List;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.StringBuilders;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
index da2938a..e266b41 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
import java.util.List;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.StringBuilders;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java
index 8ec9b7d..d078a5e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
index c9eb039..8aef658 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
@@ -16,7 +16,7 @@
*/
package org.apache.logging.log4j.core.pattern;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileLocationPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileLocationPatternConverter.java
index 7fcd33d..047bf08 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileLocationPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileLocationPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FullLocationPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FullLocationPatternConverter.java
index 120a671..e41f980 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FullLocationPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FullLocationPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
index 1146cdb..5ac11eb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
@@ -25,7 +25,7 @@ import java.util.Map;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
index 4a41da4..8096530 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pattern;
import java.util.Date;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
index debee5a..46b448c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
@@ -22,7 +22,7 @@ import java.util.Map;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.Patterns;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineLocationPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineLocationPatternConverter.java
index 2b912d7..fa753b4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineLocationPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineLocationPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
* Returns the event's line location information in a StringBuilder.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
index 1d7b022..103e87a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java
index cba32c9..e6efe24 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
index 609af7a..ec140eb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MapPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MapPatternConverter.java
index 05bbcdf..8b684a4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MapPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MapPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.message.MapMessage;
import org.apache.logging.log4j.message.MapMessage.MapFormat;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
index dde5502..9b3e4c9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.StringBuilders;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
index b274eb1..341885c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
index 1a59a4b..4f301c2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
@@ -22,7 +22,7 @@ import java.util.List;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
index b39c15e..b7b3c1b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.TriConsumer;
import org.apache.logging.log4j.util.StringBuilders;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
index 92d75a2..d76388d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
@@ -20,7 +20,7 @@ import java.util.Locale;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.ArrayUtils;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.core.util.Loader;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MethodLocationPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MethodLocationPatternConverter.java
index 457b7a6..0c17950 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MethodLocationPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MethodLocationPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
index ba6186b..6fc3c0f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NdcPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NdcPatternConverter.java
index 754ea9a..7749c03 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NdcPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NdcPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
index 813c4b2..c52caea 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
@@ -27,9 +27,9 @@ import java.util.Objects;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
import org.apache.logging.log4j.core.time.SystemNanoClock;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ProcessIdPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ProcessIdPatternConverter.java
index d182dc0..d3d8bc4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ProcessIdPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ProcessIdPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.ProcessIdUtil;
@Plugin(name = "ProcessIdPatternConverter", category = "Converter")
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RegexReplacement.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RegexReplacement.java
index 47ce355..602048a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RegexReplacement.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RegexReplacement.java
@@ -20,9 +20,9 @@ import java.util.regex.Pattern;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RegexReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RegexReplacementConverter.java
index f7c4697..28e07bb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RegexReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RegexReplacementConverter.java
@@ -21,7 +21,7 @@ import java.util.regex.Pattern;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
index ffc1ed4..3d575fb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
import java.lang.management.ManagementFactory;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java
index 33bc095..46e09d1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
index b607cbf..202070f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
index acbf2b6..1c35676 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
@@ -21,7 +21,7 @@ import java.util.List;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.Patterns;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
index 1f5bc12..85752ab 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
index de3e824..060df3d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
index b520892..72fc77a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.core.pattern;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PerformanceSensitive;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java
index 7b9679c..5de51d8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverter.java
@@ -24,7 +24,7 @@ import java.util.List;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.impl.ThrowableFormatOptions;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.StringBuilderWriter;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/UuidPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/UuidPatternConverter.java
index 439935b..d82fed1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/UuidPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/UuidPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
import java.util.UUID;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.UuidUtil;
/**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/VariablesNotEmptyReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/VariablesNotEmptyReplacementConverter.java
index 1f0d827..8d24a2d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/VariablesNotEmptyReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/VariablesNotEmptyReplacementConverter.java
@@ -20,7 +20,7 @@ import java.util.List;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.util.PerformanceSensitive;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/Script.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/Script.java
index b33b1f2..15b2096 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/Script.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/Script.java
@@ -16,11 +16,11 @@
*/
package org.apache.logging.log4j.core.script;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginValue;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginValue;
/**
* Container for the language and body of a script.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptFile.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptFile.java
index 9bb2a1d..d2a5863a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptFile.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptFile.java
@@ -26,10 +26,10 @@ import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.ExtensionLanguageMapping;
import org.apache.logging.log4j.core.util.FileUtils;
import org.apache.logging.log4j.core.util.IOUtils;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java
index 9fe074b..abec150 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java
@@ -17,11 +17,11 @@
package org.apache.logging.log4j.core.script;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
/**
* Contains a reference to a script defined elsewhere in the configuration.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CloseShieldOutputStream.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CloseShieldOutputStream.java
index f04b4d3..1139bd2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CloseShieldOutputStream.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CloseShieldOutputStream.java
@@ -57,4 +57,4 @@ public class CloseShieldOutputStream extends OutputStream {
public void write(final int b) throws IOException {
delegate.write(b);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/KeyValuePair.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/KeyValuePair.java
index 6eae7de..39fa707 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/KeyValuePair.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/KeyValuePair.java
@@ -17,10 +17,10 @@
package org.apache.logging.log4j.core.util;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
/**
* Key/Value pair configuration item.
@@ -69,7 +69,7 @@ public final class KeyValuePair {
return new Builder();
}
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<KeyValuePair> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<KeyValuePair> {
@PluginBuilderAttribute
private String key;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java
index 1380b7a..009116d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java
@@ -42,7 +42,12 @@ public final class Loader {
* @return the ClassLoader.
*/
public static ClassLoader getClassLoader() {
- return getClassLoader(Loader.class, null);
+ return LoaderUtil.getClassLoader(LoaderUtil.class, null);
+ }
+
+ // TODO: this method could use some explanation
+ public static ClassLoader getClassLoader(final Class<?> class1, final Class<?> class2) {
+ return LoaderUtil.getClassLoader(class1, class2);
}
/**
@@ -56,18 +61,6 @@ public final class Loader {
return LoaderUtil.getThreadContextClassLoader();
}
- // TODO: this method could use some explanation
- public static ClassLoader getClassLoader(final Class<?> class1, final Class<?> class2) {
- final ClassLoader threadContextClassLoader = getThreadContextClassLoader();
- final ClassLoader loader1 = class1 == null ? null : class1.getClassLoader();
- final ClassLoader loader2 = class2 == null ? null : class2.getClassLoader();
-
- if (isChild(threadContextClassLoader, loader1)) {
- return isChild(threadContextClassLoader, loader2) ? threadContextClassLoader : loader2;
- }
- return isChild(loader1, loader2) ? loader1 : loader2;
- }
-
/**
* This method will search for {@code resource} in different
* places. The search order is as follows:
@@ -196,26 +189,6 @@ public final class Loader {
}
/**
- * Determines if one ClassLoader is a child of another ClassLoader. Note that a {@code null} ClassLoader is
- * interpreted as the system ClassLoader as per convention.
- *
- * @param loader1 the ClassLoader to check for childhood.
- * @param loader2 the ClassLoader to check for parenthood.
- * @return {@code true} if the first ClassLoader is a strict descendant of the second ClassLoader.
- */
- private static boolean isChild(final ClassLoader loader1, final ClassLoader loader2) {
- if (loader1 != null && loader2 != null) {
- ClassLoader parent = loader1.getParent();
- while (parent != null && parent != loader2) {
- parent = parent.getParent();
- }
- // once parent is null, we're at the system CL, which would indicate they have separate ancestry
- return parent != null;
- }
- return loader1 != null;
- }
-
- /**
* Loads and initializes a named Class using a given ClassLoader.
*
* @param className The class name.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatcherFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatcherFactory.java
index 7671353..f7d5785 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatcherFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatcherFactory.java
@@ -27,8 +27,8 @@ import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFileWatcher;
import org.apache.logging.log4j.core.config.ConfigurationListener;
import org.apache.logging.log4j.core.config.Reconfigurable;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/categories/package-info.java b/log4j-core/src/test/java/org/apache/logging/log4j/categories/package-info.java
index 8b59f59..82d3474 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/categories/package-info.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/categories/package-info.java
@@ -19,4 +19,4 @@
* JUnit test categories. Unit tests should not specify a category as most tests are unit tests. For performance and
* integration tests, an appropriate category interface should be specified.
*/
-package org.apache.logging.log4j.categories;
\ No newline at end of file
+package org.apache.logging.log4j.categories;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java
index 5cba8e0..e70d7e8 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java
@@ -16,7 +16,7 @@
*/
package org.apache.logging.log4j.core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import org.apache.logging.log4j.util.StringBuilders;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsXmlConfigTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsXmlConfigTest.java
index b041aa6..dd1dc81 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsXmlConfigTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsXmlConfigTest.java
@@ -63,4 +63,4 @@ public class FileAppenderPermissionsXmlConfigTest {
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HangingAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HangingAppender.java
index 93e5014..785e9a5 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HangingAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HangingAppender.java
@@ -25,11 +25,11 @@ import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
@Plugin(name = "Hanging", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
public class HangingAppender extends AbstractAppender {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManagerTest.java
index 84f7a4e..0e04699 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManagerTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManagerTest.java
@@ -88,4 +88,4 @@ public class MemoryMappedFileManagerTest {
final int expected = initialLength * 2;
assertEquals("appended, not overwritten", expected, file.length());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
index 884d6b8..e13e075 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
@@ -55,4 +55,4 @@ public class OutputStreamManagerTest {
data.getThrowable().toString());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ReconfigureAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ReconfigureAppenderTest.java
index 357b27f..01c5869 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ReconfigureAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ReconfigureAppenderTest.java
@@ -31,7 +31,7 @@ import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.layout.PatternLayout;
-import org.apache.logging.log4j.core.util.Builder;
+import org.apache.logging.log4j.plugins.util.Builder;
import org.junit.Test;
/**
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogFrameTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogFrameTest.java
index 887ba99..32ad5a9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogFrameTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogFrameTest.java
@@ -48,4 +48,4 @@ public class TlsSyslogFrameTest {
final String expected = Integer.toString(length) + Chars.SPACE + TEST_MESSAGE;
Assert.assertEquals(expected, frame.toString());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/TestRewritePolicy.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/TestRewritePolicy.java
index 4380f98..3013a3f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/TestRewritePolicy.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/TestRewritePolicy.java
@@ -18,8 +18,8 @@ package org.apache.logging.log4j.core.appender.rewrite;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
/**
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
index 6d8622f..cd5e461 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
@@ -118,4 +118,4 @@ public class AsyncQueueFullPolicyFactoryTest {
DoesNotImplementInterface.class.getName());
assertEquals(DefaultAsyncQueueFullPolicy.class, AsyncQueueFullPolicyFactory.create().getClass());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java
index 6c8423f..209dbe8 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java
@@ -29,11 +29,11 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
/**
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/DefaultAsyncQueueFullPolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/DefaultAsyncQueueFullPolicyTest.java
index d6d2b56..63379ee 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/DefaultAsyncQueueFullPolicyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/DefaultAsyncQueueFullPolicyTest.java
@@ -50,4 +50,4 @@ public class DefaultAsyncQueueFullPolicyTest {
assertEquals(EventRoute.SYNCHRONOUS, router.getRoute(currentThreadId(), Level.ALL));
assertEquals(EventRoute.SYNCHRONOUS, router.getRoute(currentThreadId(), Level.OFF));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/DiscardingAsyncQueueFullPolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/DiscardingAsyncQueueFullPolicyTest.java
index 8c5ef5a..ddcb2b6 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/DiscardingAsyncQueueFullPolicyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/DiscardingAsyncQueueFullPolicyTest.java
@@ -117,4 +117,4 @@ public class DiscardingAsyncQueueFullPolicyTest {
assertEquals(EventRoute.DISCARD, router.getRoute(-1L, Level.INFO));
assertEquals("increase", 3, DiscardingAsyncQueueFullPolicy.getDiscardCount(router));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java
index f63e816..d4de80a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java
@@ -93,4 +93,4 @@ public class Log4j2Jira1688AsyncTest {
Assert.assertArrayEquals(Arrays.toString(args), originalArgs, args);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688Test.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688Test.java
index 57d9247..5fda3d0 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688Test.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688Test.java
@@ -91,4 +91,4 @@ public class Log4j2Jira1688Test {
Assert.assertArrayEquals(Arrays.toString(args), originalArgs, args);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java
index d0542dc..10c0f2a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java
@@ -126,4 +126,4 @@ public abstract class QueueFullAbstractTest {
f.setAccessible(true);
return f;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest.java
index dae5095..b0aa3ea 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest.java
@@ -90,4 +90,4 @@ public class QueueFullAsyncAppenderTest extends QueueFullAbstractTest {
}
assertTrue(actual.isEmpty());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest2.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest2.java
index d8ce85c..b592dc8 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest2.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest2.java
@@ -67,4 +67,4 @@ public class QueueFullAsyncAppenderTest2 extends QueueFullAbstractTest {
QueueFullAsyncAppenderTest.asyncAppenderTest(logger, unlocker, blockingAppender);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java
index 307a93d..b13bbd3 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java
@@ -109,4 +109,4 @@ public class QueueFullAsyncLoggerConfigLoggingFromToStringTest extends QueueFull
assertEquals("logging naughty object #0 Who's bad?!", actual.pop());
assertTrue(actual.isEmpty());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest2.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest2.java
index ee11629..c248d99 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest2.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest2.java
@@ -70,4 +70,4 @@ public class QueueFullAsyncLoggerConfigLoggingFromToStringTest2 extends QueueFul
QueueFullAsyncLoggerConfigLoggingFromToStringTest.asyncLoggerConfigRecursiveTest(logger, unlocker, blockingAppender, this);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java
index 7d68582..28e6659 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java
@@ -91,4 +91,4 @@ public class QueueFullAsyncLoggerConfigTest extends QueueFullAbstractTest {
}
assertTrue(actual.isEmpty());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest2.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest2.java
index ff5ce7c..6e38421 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest2.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest2.java
@@ -68,4 +68,4 @@ public class QueueFullAsyncLoggerConfigTest2 extends QueueFullAbstractTest {
QueueFullAsyncLoggerConfigTest.asyncLoggerConfigTest(logger, unlocker, blockingAppender);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java
index 5c12502..3909914 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java
@@ -105,4 +105,4 @@ public class QueueFullAsyncLoggerLoggingFromToStringTest extends QueueFullAbstra
}
assertTrue(actual.isEmpty());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest2.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest2.java
index 1691838..0ff31af 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest2.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest2.java
@@ -105,4 +105,4 @@ public class QueueFullAsyncLoggerLoggingFromToStringTest2 extends QueueFullAbstr
}
assertTrue(actual.isEmpty());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java
index e5ba78d..3bc8be4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java
@@ -99,4 +99,4 @@ public class QueueFullAsyncLoggerTest extends QueueFullAbstractTest {
}
assertTrue(actual.isEmpty());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest2.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest2.java
index 022e295..3f06a5c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest2.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest2.java
@@ -76,4 +76,4 @@ public class QueueFullAsyncLoggerTest2 extends QueueFullAbstractTest {
QueueFullAsyncLoggerTest.asyncLoggerTest(logger, unlocker, blockingAppender);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/MultiThreadPerfTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/MultiThreadPerfTest.java
index 7b10b34..77f3fc1 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/MultiThreadPerfTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/MultiThreadPerfTest.java
@@ -107,4 +107,4 @@ public class MultiThreadPerfTest extends PerfTest {
PerfTest.reportResult(resultFile, name, histogram);
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/AppenderControlArraySetTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/AppenderControlArraySetTest.java
index 58ac9ea..ac5679a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/AppenderControlArraySetTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/AppenderControlArraySetTest.java
@@ -188,4 +188,4 @@ public class AppenderControlArraySetTest {
assertEquals(3, set.get().length);
assertArrayEquals(controls, set.get());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/InMemoryAdvertiser.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/InMemoryAdvertiser.java
index d0823d3..875ec5f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/InMemoryAdvertiser.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/InMemoryAdvertiser.java
@@ -20,7 +20,7 @@ import java.util.HashMap;
import java.util.Map;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.net.Advertiser;
@Plugin(name = "memory", category = Core.CATEGORY_NAME, elementType = "advertiser", printObject = false)
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/LoggersPluginTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/LoggersPluginTest.java
index 27c903f..dd9e1f6 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/LoggersPluginTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/LoggersPluginTest.java
@@ -47,4 +47,4 @@ public class LoggersPluginTest {
assertEquals(Level.ERROR, data.getLevel());
assertTrue(data.getMessage().getFormattedMessage().contains("multiple root loggers"));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConvertersTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConvertersTest.java
index 35a3855..37a66f5 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConvertersTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConvertersTest.java
@@ -38,6 +38,7 @@ import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.appender.rolling.action.Duration;
import org.apache.logging.log4j.core.layout.GelfLayout;
import org.apache.logging.log4j.core.net.Facility;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -45,7 +46,7 @@ import org.junit.runners.Parameterized;
import static org.junit.Assert.*;
/**
- * Tests {@link TypeConverters}.
+ * Tests {@link CoreTypeConverters}.
*/
@RunWith(Parameterized.class)
public class TypeConvertersTest {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/PluginManagerPackagesTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/PluginManagerPackagesTest.java
index c97643f..c55b45e 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/PluginManagerPackagesTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/PluginManagerPackagesTest.java
@@ -64,9 +64,9 @@ public class PluginManagerPackagesTest {
// So we don't create the custom plugin class until this test is run.
final File orig = new File("target/test-classes/customplugin/FixedStringLayout.java.source");
final File f = new File(orig.getParentFile(), "FixedStringLayout.java");
- assertTrue("renamed source file OK", orig.renameTo(f));
+ assertTrue("renamed source file failed", orig.renameTo(f));
compile(f);
- assertTrue("reverted source file OK", f.renameTo(orig));
+ assertTrue("reverted source file failed", f.renameTo(orig));
// load the compiled class
Class.forName("customplugin.FixedStringLayout");
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
index 684a4c8..f5de649 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
@@ -16,12 +16,12 @@
*/
package org.apache.logging.log4j.core.config.plugins.validation.validators;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.NullConfiguration;
import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.config.plugins.validation.ValidatingPlugin;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.validation.ValidatingPlugin;
import org.junit.Before;
import org.junit.Test;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java
index 7885a1f..049cc23 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidHostValidatorTest.java
@@ -17,12 +17,12 @@
package org.apache.logging.log4j.core.config.plugins.validation.validators;
import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.NullConfiguration;
import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.config.plugins.validation.HostAndPort;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.validation.HostAndPort;
import org.apache.logging.log4j.junit.StatusLoggerRule;
import org.junit.Before;
import org.junit.Rule;
@@ -76,4 +76,4 @@ public class ValidHostValidatorTest {
.setConfigurationNode(node)
.build();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java
index 53d3172..208010a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidPortValidatorTest.java
@@ -16,12 +16,12 @@
*/
package org.apache.logging.log4j.core.config.plugins.validation.validators;
-import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.NullConfiguration;
import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.config.plugins.validation.HostAndPort;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.validation.HostAndPort;
import org.junit.Before;
import org.junit.Test;
@@ -67,4 +67,4 @@ public class ValidPortValidatorTest {
.build();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithFailoverTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithFailoverTest.java
index 2579c2e..744231f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithFailoverTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithFailoverTest.java
@@ -21,11 +21,11 @@ import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.appender.FailoverAppender;
import org.apache.logging.log4j.core.appender.FailoversPlugin;
import org.apache.logging.log4j.core.config.AppenderRef;
-import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.NullConfiguration;
import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
import org.apache.logging.log4j.status.StatusData;
import org.apache.logging.log4j.status.StatusListener;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
index 27ac5fe..d70f358 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
@@ -22,7 +22,7 @@ import static org.junit.Assert.assertNull;
import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.NullConfiguration;
-import org.apache.logging.log4j.plugins.util.PluginBuilder;
+import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
import org.apache.logging.log4j.plugins.util.PluginManager;
import org.apache.logging.log4j.plugins.util.PluginType;
import org.apache.logging.log4j.plugins.validation.ValidatingPluginWithGenericBuilder;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericSubclassFoo1BuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericSubclassFoo1BuilderTest.java
index f255526..d567a40 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericSubclassFoo1BuilderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericSubclassFoo1BuilderTest.java
@@ -20,12 +20,12 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.NullConfiguration;
import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.config.plugins.validation.PluginWithGenericSubclassFoo1Builder;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.validation.PluginWithGenericSubclassFoo1Builder;
import org.junit.Before;
import org.junit.Test;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithTypedBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithTypedBuilderTest.java
index 84de5c4..839bcaf 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithTypedBuilderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithTypedBuilderTest.java
@@ -20,12 +20,12 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.NullConfiguration;
import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
-import org.apache.logging.log4j.core.config.plugins.validation.ValidatingPluginWithTypedBuilder;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
+import org.apache.logging.log4j.plugins.validation.ValidatingPluginWithTypedBuilder;
import org.junit.Before;
import org.junit.Test;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterTest.java
index 077e2b1..0285239 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/AbstractFilterTest.java
@@ -85,4 +85,4 @@ public class AbstractFilterTest {
return testResult;
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
index 47c9c14..b86588f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
@@ -38,4 +38,4 @@ public class ContextDataFactoryPropertySetMissingConstructorTest {
assertEquals(2, thresholdField.getInt(actual));
System.clearProperty("log4j2.ContextData");
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetTest.java
index dc308dc..484923e 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetTest.java
@@ -46,4 +46,4 @@ public class ContextDataFactoryPropertySetTest {
assertEquals(2, actual.initialCapacity);
System.clearProperty("log4j2.ContextData");
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
index 5da1267..10a2e96 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
@@ -44,4 +44,4 @@ public class ContextDataFactoryTest {
thresholdField.setAccessible(true);
assertEquals(2, thresholdField.getInt(actual));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
index c8c8db1..c3cc13f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
@@ -880,4 +880,4 @@ public class JdkMapAdapterStringMapTest {
assertEquals(state.count, original.size());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
index 59a223e..0f406cd 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
@@ -30,6 +30,7 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
+import java.util.Base64;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
@@ -37,7 +38,6 @@ import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.ThreadContext.ContextStack;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.convert.Base64Converter;
import org.apache.logging.log4j.core.time.Clock;
import org.apache.logging.log4j.core.time.ClockFactory;
import org.apache.logging.log4j.core.time.ClockFactoryTest;
@@ -58,6 +58,8 @@ import org.junit.Test;
public class Log4jLogEventTest {
+ private static final Base64.Decoder decoder = Base64.getDecoder();
+
/** Helper class */
public static class FixedTimeClock implements Clock {
public static final long FIXED_TIME = 1234567890L;
@@ -199,7 +201,7 @@ public class Log4jLogEventTest {
final String base64 = "rO0ABXNyAD5vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLkxvZzRqTG9nRXZlbnQkTG9nRXZlbnRQcm94eYgtmn+yXsP9AwAQWgAMaXNFbmRPZkJhdGNoWgASaXNMb2NhdGlvblJlcXVpcmVkSgAIdGhyZWFkSWRJAA50aHJlYWRQcmlvcml0eUoACnRpbWVNaWxsaXNMAAtjb250ZXh0RGF0YXQAKUxvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovdXRpbC9TdHJpbmdNYXA7TAAMY29udGV4dFN0YWNrdAA1TG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9UaHJlYWRDb250ZXh0JENvbnRleHRTdGFjaztMAAVsZXZlbHQAIExvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovTGV2ZWw7TAAKbG9nZ2VyRlFDTnQAE [...]
- final byte[] binaryDecoded = Base64Converter.parseBase64Binary(base64);
+ final byte[] binaryDecoded = decoder.decode(base64);
final Log4jLogEvent evt2 = deserialize(binaryDecoded);
assertEquals(loggerFQN, evt2.getLoggerFqcn());
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
index e8544bc..a1f4f91 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
@@ -370,4 +370,4 @@ public class MutableLogEventTest {
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/NestedLoggingFromToStringTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/NestedLoggingFromToStringTest.java
index d0c35cb..30dbef9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/NestedLoggingFromToStringTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/NestedLoggingFromToStringTest.java
@@ -135,4 +135,4 @@ public class NestedLoggingFromToStringTest {
assertEquals(expect4, list.get(3));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
index c11f92e..75b9287 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
@@ -130,4 +130,4 @@ public class ReusableLogEventFactoryTest {
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
index 8a9b83e..ea22e02 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ThrowableProxyTest.java
@@ -32,6 +32,7 @@ import java.net.InetSocketAddress;
import java.nio.channels.ServerSocketChannel;
import java.security.Permission;
import java.security.SecureRandom;
+import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
@@ -43,7 +44,6 @@ import javax.crypto.spec.IvParameterSpec;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.convert.Base64Converter;
import org.apache.logging.log4j.core.pattern.PlainTextRenderer;
import org.apache.logging.log4j.util.Strings;
import org.junit.Test;
@@ -56,6 +56,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
*/
public class ThrowableProxyTest {
+ private static final Base64.Decoder decoder = Base64.getDecoder();
+
public static class AlwaysThrowsError {
static {
if (true) {
@@ -283,7 +285,7 @@ public class ThrowableProxyTest {
final String base64 = "rO0ABXNyADFvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5pbXBsLlRocm93YWJsZVByb3h52cww1Zp7rPoCAAdJABJjb21tb25FbGVtZW50Q291bnRMAApjYXVzZVByb3h5dAAzTG9yZy9hcGFjaGUvbG9nZ2luZy9sb2c0ai9jb3JlL2ltcGwvVGhyb3dhYmxlUHJveHk7WwASZXh0ZW5kZWRTdGFja1RyYWNldAA/W0xvcmcvYXBhY2hlL2xvZ2dpbmcvbG9nNGovY29yZS9pbXBsL0V4dGVuZGVkU3RhY2tUcmFjZUVsZW1lbnQ7TAAQbG9jYWxpemVkTWVzc2FnZXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wAB21lc3NhZ2VxAH4AA0wABG5hbWVxAH4AA1sAEXN1cHByZXNzZWRQcm94aWVzdAA0W0xvcmcvYXBhY2hlL [...]
- final byte[] binaryDecoded = Base64Converter.parseBase64Binary(base64);
+ final byte[] binaryDecoded = decoder.decode(base64);
final ThrowableProxy proxy2 = deserialize(binaryDecoded);
assertEquals(this.getClass().getName() + "$DeletedException", proxy2.getName());
@@ -382,8 +384,7 @@ public class ThrowableProxyTest {
final Map<String, ThrowableProxyHelper.CacheEntry> map = new HashMap<>();
final String runtimeExceptionThrownAtUnloadableClass_base64 = "rO0ABXNyABpqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbp5fBkcKNIPlAgAAeHIAE2phdmEubGFuZy5FeGNlcHRpb27Q/R8+GjscxAIAAHhyABNqYXZhLmxhbmcuVGhyb3dhYmxl1cY1Jzl3uMsDAANMAAVjYXVzZXQAFUxqYXZhL2xhbmcvVGhyb3dhYmxlO0wADWRldGFpbE1lc3NhZ2V0ABJMamF2YS9sYW5nL1N0cmluZztbAApzdGFja1RyYWNldAAeW0xqYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnQ7eHBxAH4ABnB1cgAeW0xqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQ7AkYqPDz9IjkCAAB4cAAAAAFzcgAbamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZ [...]
- final byte[] binaryDecoded = Base64Converter
- .parseBase64Binary(runtimeExceptionThrownAtUnloadableClass_base64);
+ final byte[] binaryDecoded = decoder.decode(runtimeExceptionThrownAtUnloadableClass_base64);
final ByteArrayInputStream inArr = new ByteArrayInputStream(binaryDecoded);
final ObjectInputStream in = new ObjectInputStream(inArr);
final Throwable throwable = (Throwable) in.readObject();
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java
index add4387..7b14556 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java
@@ -75,4 +75,4 @@ public class AbstractStringLayoutTest {
assertEquals("empty, ready for use", 0, sb3.length());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_Test.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_Test.java
index abd1852..9ef0487 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_Test.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Log4j2_1482_Test.java
@@ -89,4 +89,4 @@ public abstract class Log4j2_1482_Test {
loopingRun(1);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/StringBuilderEncoderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/StringBuilderEncoderTest.java
index 51faed9..5958c22 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/StringBuilderEncoderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/StringBuilderEncoderTest.java
@@ -307,4 +307,4 @@ public class StringBuilderEncoderTest {
}
return result;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/MarkerLookupTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/MarkerLookupTest.java
index d26f895..4bad20e 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/MarkerLookupTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/MarkerLookupTest.java
@@ -93,4 +93,4 @@ public class MarkerLookupTest {
assertNull(value);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/message/ExtendedThreadInformationTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/message/ExtendedThreadInformationTest.java
index 8333f19..34efb4b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/message/ExtendedThreadInformationTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/message/ExtendedThreadInformationTest.java
@@ -33,4 +33,4 @@ public class ExtendedThreadInformationTest {
//System.out.print(message);
assertTrue("No header", message.contains(" Id="));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/mock/MockTlsSyslogServer.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/mock/MockTlsSyslogServer.java
index a445464..6c028db 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/mock/MockTlsSyslogServer.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/mock/MockTlsSyslogServer.java
@@ -151,4 +151,4 @@ public class MockTlsSyslogServer extends MockSyslogServer {
public List<String> getMessageList() {
return messageList;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/mock/MockUdpSyslogServer.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/mock/MockUdpSyslogServer.java
index a74940b..b9ef199 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/mock/MockUdpSyslogServer.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/mock/MockUdpSyslogServer.java
@@ -67,4 +67,4 @@ public class MockUdpSyslogServer extends MockSyslogServer {
}
System.out.println("Log4j UDP server stopped.");
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/EnvironmentPasswordProviderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/EnvironmentPasswordProviderTest.java
index a9b266f..56676ec 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/EnvironmentPasswordProviderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/EnvironmentPasswordProviderTest.java
@@ -35,4 +35,4 @@ public class EnvironmentPasswordProviderTest {
final char[] actual = new EnvironmentPasswordProvider("PATH").getPassword();
assertArrayEquals(value.toCharArray(), actual);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/TlsSyslogInputStreamReaderBase.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/TlsSyslogInputStreamReaderBase.java
index 5db7224..28699b1 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/TlsSyslogInputStreamReaderBase.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/TlsSyslogInputStreamReaderBase.java
@@ -32,4 +32,4 @@ public abstract class TlsSyslogInputStreamReaderBase {
public String read() throws IOException {
throw new UnsupportedOperationException();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
index 448b56e..1ca8bdb 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
@@ -140,4 +140,4 @@ public class HighlightConverterTest {
.build(), sb);
return sb;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ProcessIdPatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ProcessIdPatternConverterTest.java
index d15221d..05d8db3 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ProcessIdPatternConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ProcessIdPatternConverterTest.java
@@ -29,4 +29,4 @@ public class ProcessIdPatternConverterTest {
final String actual = ProcessIdPatternConverter.newInstance(defaultValue).getProcessId();
assertNotEquals("???", actual);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelectorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelectorTest.java
index 5b7e6ad..0e1460f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelectorTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelectorTest.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.selector;
import java.lang.reflect.Field;
import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.util.ReflectionUtil;
+import org.apache.logging.log4j.util.ReflectionUtil;
import org.junit.Before;
import org.junit.Test;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/MutableInstantTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/MutableInstantTest.java
index 63d3138..cf5d563 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/time/MutableInstantTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/time/MutableInstantTest.java
@@ -229,4 +229,4 @@ public class MutableInstantTest {
instant.initFromEpochMilli(123456, 789012);
assertEquals("MutableInstant[epochSecond=123, nano=456789012]", instant.toString());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/FileUtilsTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/FileUtilsTest.java
index 4294423..06957f9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/FileUtilsTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/FileUtilsTest.java
@@ -62,7 +62,7 @@ public class FileUtilsTest {
final String config = "target/test-classes/log4j+config+with+plus+characters.xml";
final File file = new File(config);
assertEquals(LOG4J_CONFIG_WITH_PLUS, file.getName());
- assertTrue("file exists", file.exists());
+ assertTrue("file does not exist", file.exists());
//
final URI uri1 = new URI(config);
assertNull(uri1.getScheme());
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/LoaderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/LoaderTest.java
index c97d3b6..f2918b6 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/LoaderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/LoaderTest.java
@@ -37,4 +37,4 @@ public class LoaderTest {
assertEquals("Expect Class return value for null ClassLoader.", Loader.class,
Loader.loadClass(Loader.class.getCanonicalName(), Loader.getClassLoader()));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/package-info.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/package-info.java
index 41f4b85..cae1cf7 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/package-info.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/package-info.java
@@ -19,4 +19,4 @@
* JUnit helper classes and TestRules.
* @see org.junit.rules.TestRule
*/
-package org.apache.logging.log4j.junit;
\ No newline at end of file
+package org.apache.logging.log4j.junit;
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/ExtendedLevels.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/ExtendedLevels.java
index d69433e..81a6707 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/ExtendedLevels.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/ExtendedLevels.java
@@ -17,7 +17,7 @@
package org.apache.logging.log4j.test;
import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
*
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/AlwaysFailAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/AlwaysFailAppender.java
index cd080e8..5572605 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/AlwaysFailAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/AlwaysFailAppender.java
@@ -20,10 +20,10 @@ import org.apache.logging.log4j.LoggingException;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
/**
*
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/BlockingAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/BlockingAppender.java
index f42d595..23cd489 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/BlockingAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/BlockingAppender.java
@@ -21,10 +21,10 @@ import java.util.concurrent.TimeUnit;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
/**
*
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/DeadlockAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/DeadlockAppender.java
index d77a72b..34b3b39 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/DeadlockAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/DeadlockAppender.java
@@ -24,10 +24,10 @@ import org.apache.logging.log4j.LoggingException;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
/**
*
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/FailOnceAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/FailOnceAppender.java
index d7a5258..8d77914 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/FailOnceAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/FailOnceAppender.java
@@ -23,10 +23,10 @@ import org.apache.logging.log4j.LoggingException;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
/**
*
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
index ffe4226..150d010 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
@@ -31,11 +31,11 @@ import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.impl.MutableLogEvent;
/**
@@ -228,7 +228,7 @@ public class ListAppender extends AbstractAppender {
return new Builder();
}
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<ListAppender> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<ListAppender> {
@PluginBuilderAttribute
@Required
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/UsesLoggingAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/UsesLoggingAppender.java
index ff43419..da70fcf 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/UsesLoggingAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/UsesLoggingAppender.java
@@ -23,11 +23,11 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.test.SomethingThatUsesLogging;
/**
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/layout/BasicLayout.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/layout/BasicLayout.java
index 7c13ff9..eeae653 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/layout/BasicLayout.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/layout/BasicLayout.java
@@ -21,8 +21,8 @@ import java.nio.charset.StandardCharsets;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.AbstractStringLayout;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-core/src/test/resources/customplugin/FixedStringLayout.java.source b/log4j-core/src/test/resources/customplugin/FixedStringLayout.java.source
index e3049c1..f853a49 100644
--- a/log4j-core/src/test/resources/customplugin/FixedStringLayout.java.source
+++ b/log4j-core/src/test/resources/customplugin/FixedStringLayout.java.source
@@ -21,9 +21,9 @@ import java.util.Collections;
import java.util.Map;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.AbstractStringLayout;
@Plugin(name = "FixedString", category = "Core", elementType = "layout", printObject = true)
diff --git a/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java b/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
index 2b233a8..621a92d 100644
--- a/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
+++ b/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
@@ -19,16 +19,16 @@ package org.apache.logging.log4j.couchdb;
import java.lang.reflect.Method;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
-import org.apache.logging.log4j.core.util.NameUtil;
import org.apache.logging.log4j.core.appender.nosql.NoSqlProvider;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util.NameUtil;
import org.apache.logging.log4j.util.Strings;
import org.lightcouch.CouchDbClient;
import org.lightcouch.CouchDbProperties;
diff --git a/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayout.java b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayout.java
index 123e5a6..b320052 100644
--- a/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayout.java
+++ b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvLogEventLayout.java
@@ -24,11 +24,11 @@ import org.apache.commons.csv.QuoteMode;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvParameterLayout.java b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvParameterLayout.java
index 075c65a..a8eaf0a 100644
--- a/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvParameterLayout.java
+++ b/log4j-csv/src/main/java/org/apache/logging/log4j/csv/layout/CsvParameterLayout.java
@@ -24,11 +24,11 @@ import org.apache.commons.csv.QuoteMode;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java b/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
index 2f0cfb1..8d6255e 100644
--- a/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
+++ b/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
@@ -23,7 +23,7 @@ import java.util.Map;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.AbstractLookup;
import org.apache.logging.log4j.core.lookup.StrLookup;
import org.apache.logging.log4j.core.util.NetUtils;
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/Agent.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/Agent.java
index e8cf2ea..0018c04 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/Agent.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/Agent.java
@@ -17,9 +17,9 @@
package org.apache.logging.log4j.flume.appender;
import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.Integers;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
index d99cbf7..ac9c9a2 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
@@ -26,11 +26,11 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
-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.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.Rfc5424Layout;
import org.apache.logging.log4j.core.net.Facility;
import org.apache.logging.log4j.core.util.Booleans;
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java
index 7c6840a..fc03552 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java
@@ -28,7 +28,7 @@ import org.apache.logging.log4j.LoggingException;
import org.apache.logging.log4j.core.appender.ManagerFactory;
import org.apache.logging.log4j.core.config.ConfigurationException;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.util.NameUtil;
+import org.apache.logging.log4j.util.NameUtil;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
index 76f9165..b2ab8a5 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
@@ -51,13 +51,13 @@ import org.apache.flume.event.SimpleEvent;
import org.apache.logging.log4j.LoggingException;
import org.apache.logging.log4j.core.appender.ManagerFactory;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.util.PluginType;
import org.apache.logging.log4j.core.util.ExecutorServices;
import org.apache.logging.log4j.core.util.FileUtils;
import org.apache.logging.log4j.core.util.Log4jThread;
import org.apache.logging.log4j.core.util.Log4jThreadFactory;
import org.apache.logging.log4j.core.util.SecretKeyProvider;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+import org.apache.logging.log4j.plugins.util.PluginType;
import org.apache.logging.log4j.util.Strings;
/**
diff --git a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAgentTest.java b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAgentTest.java
index 94c4926..1b314df 100644
--- a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAgentTest.java
+++ b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedAgentTest.java
@@ -275,4 +275,4 @@ public class FlumeEmbeddedAgentTest {
}
return stringMap;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
index bdf6d4f..49c0ce0 100644
--- a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
+++ b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
@@ -458,4 +458,4 @@ public class FlumePersistentAppenderTest {
}
return stringMap;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentPerf.java b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentPerf.java
index ec4d7b0..4a3c723 100644
--- a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentPerf.java
+++ b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentPerf.java
@@ -216,4 +216,4 @@ public class FlumePersistentPerf {
}
return stringMap;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/test/FlumeKeyProvider.java b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/test/FlumeKeyProvider.java
index b4a8dbe..b288cdf 100644
--- a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/test/FlumeKeyProvider.java
+++ b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/test/FlumeKeyProvider.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.flume.test;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.util.SecretKeyProvider;
/**
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/package-info.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/package-info.java
index 38f754a..1c390d2 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/package-info.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/package-info.java
@@ -17,4 +17,4 @@
/**
* Internal classes. Should not be used by users.
*/
-package org.apache.logging.log4j.io.internal;
\ No newline at end of file
+package org.apache.logging.log4j.io.internal;
diff --git a/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolableConnectionFactoryConfig.java b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolableConnectionFactoryConfig.java
index 71e2147..9594d60 100644
--- a/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolableConnectionFactoryConfig.java
+++ b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolableConnectionFactoryConfig.java
@@ -24,10 +24,10 @@ import java.util.List;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
@@ -39,7 +39,7 @@ import org.apache.logging.log4j.util.Strings;
@Plugin(name = "PoolableConnectionFactory", category = Core.CATEGORY_NAME, printObject = true)
public class PoolableConnectionFactoryConfig {
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<PoolableConnectionFactoryConfig> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<PoolableConnectionFactoryConfig> {
private static final PoolableConnectionFactory DEFAULT = new PoolableConnectionFactory(null, null);
diff --git a/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolingDriverConnectionSource.java b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolingDriverConnectionSource.java
index f031429..0a38866 100644
--- a/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolingDriverConnectionSource.java
+++ b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/dbcp2/appender/PoolingDriverConnectionSource.java
@@ -30,10 +30,10 @@ import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.jdbc.appender.AbstractDriverManagerConnectionSource;
import org.apache.logging.log4j.jdbc.appender.ConnectionSource;
@@ -52,7 +52,7 @@ public final class PoolingDriverConnectionSource extends AbstractDriverManagerCo
* This builder type or a subclass.
*/
public static class Builder<B extends Builder<B>> extends AbstractDriverManagerConnectionSource.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<PoolingDriverConnectionSource> {
+ implements org.apache.logging.log4j.plugins.util.Builder<PoolingDriverConnectionSource> {
public static final String DEFAULT_POOL_NAME = "example";
diff --git a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractDriverManagerConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractDriverManagerConnectionSource.java
index 6258943..2b442e5 100644
--- a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractDriverManagerConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/AbstractDriverManagerConnectionSource.java
@@ -23,9 +23,9 @@ import java.util.Properties;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.status.StatusLogger;
/**
diff --git a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ColumnConfig.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ColumnConfig.java
index ad64709..afe4f4c 100644
--- a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ColumnConfig.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/ColumnConfig.java
@@ -20,11 +20,11 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.appender.db.ColumnMapping;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
@@ -36,7 +36,7 @@ import org.apache.logging.log4j.util.Strings;
*/
@Plugin(name = "Column", category = Core.CATEGORY_NAME, printObject = true)
public final class ColumnConfig {
- public static class Builder implements org.apache.logging.log4j.core.util.Builder<ColumnConfig> {
+ public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<ColumnConfig> {
@PluginConfiguration
private Configuration configuration;
diff --git a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSource.java
index eaf5750..ab39844 100644
--- a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DataSourceConnectionSource.java
@@ -25,9 +25,9 @@ import javax.sql.DataSource;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSource.java
index 93760d1..bf506b7 100644
--- a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/DriverManagerConnectionSource.java
@@ -20,8 +20,8 @@ import java.sql.DriverManager;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
/**
* A {@link ConnectionSource} that uses a JDBC connection string, a user name, and a password to call
@@ -41,7 +41,7 @@ public class DriverManagerConnectionSource extends AbstractDriverManagerConnecti
* This builder type or a subclass.
*/
public static class Builder<B extends Builder<B>> extends AbstractDriverManagerConnectionSource.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<DriverManagerConnectionSource> {
+ implements org.apache.logging.log4j.plugins.util.Builder<DriverManagerConnectionSource> {
@Override
public DriverManagerConnectionSource build() {
diff --git a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSource.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSource.java
index c759ef4..5e29666 100644
--- a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSource.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/FactoryMethodConnectionSource.java
@@ -24,9 +24,9 @@ import javax.sql.DataSource;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcAppender.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcAppender.java
index 25d7e3e..61dd796 100644
--- a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcAppender.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcAppender.java
@@ -28,13 +28,13 @@ import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
import org.apache.logging.log4j.core.appender.db.ColumnMapping;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverter;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.util.Assert;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.convert.TypeConverter;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.util.Assert;
/**
* This Appender writes logging events to a relational database using standard JDBC mechanisms. It takes a list of
@@ -52,7 +52,7 @@ import org.apache.logging.log4j.core.util.Assert;
public final class JdbcAppender extends AbstractDatabaseAppender<JdbcDatabaseManager> {
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<JdbcAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<JdbcAppender> {
@PluginElement("ConnectionSource")
@Required(message = "No ConnectionSource provided")
diff --git a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
index 6e91f29..7ee06b4 100644
--- a/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
+++ b/log4j-jdbc/src/main/java/org/apache/logging/log4j/jdbc/appender/JdbcDatabaseManager.java
@@ -45,7 +45,7 @@ import org.apache.logging.log4j.core.appender.ManagerFactory;
import org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager;
import org.apache.logging.log4j.core.appender.db.ColumnMapping;
import org.apache.logging.log4j.core.appender.db.DbAppenderLoggingException;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
import org.apache.logging.log4j.core.util.Closer;
import org.apache.logging.log4j.core.util.Log4jThread;
import org.apache.logging.log4j.jdbc.convert.DateTypeConverter;
diff --git a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverterTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverterTest.java
index 494b3dc..1d240c7 100644
--- a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverterTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/convert/DateTypeConverterTest.java
@@ -58,4 +58,4 @@ public class DateTypeConverterTest {
public void testFromMillis() throws Exception {
assertEquals(expected, DateTypeConverter.fromMillis(timestamp, dateClass));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppender.java b/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppender.java
index 36a47d7..424d022 100644
--- a/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppender.java
+++ b/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqAppender.java
@@ -27,13 +27,13 @@ import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqTestClient.java b/log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqTestClient.java
index 494be9d..0746a06 100644
--- a/log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqTestClient.java
+++ b/log4j-jeromq/src/test/java/org/apache/logging/log4j/jeromq/appender/JeroMqTestClient.java
@@ -52,4 +52,4 @@ class JeroMqTestClient implements Callable<List<String>> {
}
return messages;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-jms/src/main/java/org/apache/logging/log4j/jms/appender/JmsAppender.java b/log4j-jms/src/main/java/org/apache/logging/log4j/jms/appender/JmsAppender.java
index e1adf4f..f6c1819 100644
--- a/log4j-jms/src/main/java/org/apache/logging/log4j/jms/appender/JmsAppender.java
+++ b/log4j-jms/src/main/java/org/apache/logging/log4j/jms/appender/JmsAppender.java
@@ -29,13 +29,13 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.appender.AbstractManager;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.Property;
-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.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
import org.apache.logging.log4j.core.net.JndiManager;
import org.apache.logging.log4j.jms.appender.JmsManager.JmsManagerConfiguration;
@@ -48,7 +48,7 @@ import org.apache.logging.log4j.jms.appender.JmsManager.JmsManagerConfiguration;
public class JmsAppender extends AbstractAppender {
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<JmsAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<JmsAppender> {
public static final int DEFAULT_RECONNECT_INTERVAL_MILLIS = 5000;
diff --git a/log4j-jms/src/test/java/org/apache/logging/log4j/jms/appender/JmsAppenderTest.java b/log4j-jms/src/test/java/org/apache/logging/log4j/jms/appender/JmsAppenderTest.java
index b14b1f0..dce981b 100644
--- a/log4j-jms/src/test/java/org/apache/logging/log4j/jms/appender/JmsAppenderTest.java
+++ b/log4j-jms/src/test/java/org/apache/logging/log4j/jms/appender/JmsAppenderTest.java
@@ -185,4 +185,4 @@ public class JmsAppenderTest {
then(connection).should().close();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java
index 6f93f4d..82ef8a3 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java
@@ -25,10 +25,10 @@ import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
import org.apache.logging.log4j.core.util.Booleans;
import org.apache.logging.log4j.util.LoaderUtil;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-jul/src/test/java/org/apache/logging/log4j/jul/CoreLoggerTest.java b/log4j-jul/src/test/java/org/apache/logging/log4j/jul/CoreLoggerTest.java
index fbc17b2..fc9b20f 100644
--- a/log4j-jul/src/test/java/org/apache/logging/log4j/jul/CoreLoggerTest.java
+++ b/log4j-jul/src/test/java/org/apache/logging/log4j/jul/CoreLoggerTest.java
@@ -118,4 +118,4 @@ public class CoreLoggerTest extends AbstractLoggerTest {
assertThat(childLogger.isLoggable(Level.FINE), is(false));
}
-}
\ No newline at end of file
+}
diff --git a/log4j-jul/src/test/java/org/apache/logging/log4j/jul/JavaLevelTranslatorTest.java b/log4j-jul/src/test/java/org/apache/logging/log4j/jul/JavaLevelTranslatorTest.java
index b912257..5ccc9c2 100644
--- a/log4j-jul/src/test/java/org/apache/logging/log4j/jul/JavaLevelTranslatorTest.java
+++ b/log4j-jul/src/test/java/org/apache/logging/log4j/jul/JavaLevelTranslatorTest.java
@@ -70,4 +70,4 @@ public class JavaLevelTranslatorTest {
final java.util.logging.Level actualLevel = LevelTranslator.toJavaLevel(log4jLevel);
assertEquals(javaLevel, actualLevel);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-jul/src/test/java/org/apache/logging/log4j/jul/Log4jLevelTranslatorTest.java b/log4j-jul/src/test/java/org/apache/logging/log4j/jul/Log4jLevelTranslatorTest.java
index e38159a..dd65105 100644
--- a/log4j-jul/src/test/java/org/apache/logging/log4j/jul/Log4jLevelTranslatorTest.java
+++ b/log4j-jul/src/test/java/org/apache/logging/log4j/jul/Log4jLevelTranslatorTest.java
@@ -64,4 +64,4 @@ public class Log4jLevelTranslatorTest {
assertEquals(javaLevel, actualLevel);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaAppender.java b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaAppender.java
index 30f937f..b9b5f5c 100644
--- a/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaAppender.java
+++ b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaAppender.java
@@ -29,11 +29,11 @@ import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
-import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.plugins.Node;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
/**
* Sends log events to an Apache Kafka topic.
@@ -48,7 +48,7 @@ public final class KafkaAppender extends AbstractAppender {
* The type to build
*/
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<KafkaAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<KafkaAppender> {
@PluginAttribute("topic")
private String topic;
diff --git a/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaProducerFactory.java b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaProducerFactory.java
index 2194492..6956323 100644
--- a/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaProducerFactory.java
+++ b/log4j-kafka/src/main/java/org/apache/logging/log4j/kafka/appender/KafkaProducerFactory.java
@@ -36,4 +36,4 @@ public interface KafkaProducerFactory {
*/
Producer<byte[], byte[]> newKafkaProducer(Properties config);
-}
\ No newline at end of file
+}
diff --git a/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderCloseTimeoutTest.java b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderCloseTimeoutTest.java
index 25cdd60..77966fc 100644
--- a/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderCloseTimeoutTest.java
+++ b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderCloseTimeoutTest.java
@@ -77,4 +77,4 @@ public class KafkaAppenderCloseTimeoutTest {
final Appender appender = ctx.getRequiredAppender("KafkaAppender");
appender.stop();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderTest.java b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderTest.java
index 3075f7e..a4da443 100644
--- a/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderTest.java
+++ b/log4j-kafka/src/test/java/org/apache/logging/log4j/kafka/appender/KafkaAppenderTest.java
@@ -155,4 +155,4 @@ public class KafkaAppenderTest {
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/JsonSetupContextInitializer.java b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/JsonSetupContextInitializer.java
index e7c90a2..7e54ae6 100644
--- a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/JsonSetupContextInitializer.java
+++ b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/JsonSetupContextInitializer.java
@@ -48,4 +48,4 @@ public class JsonSetupContextInitializer {
? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringMixIn.class : ThrowableProxyMixIn.class)
: ThrowableProxyWithoutStacktraceMixIn.class);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonJacksonFactory.java b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonJacksonFactory.java
index dd7b789..215db50 100644
--- a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonJacksonFactory.java
+++ b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonJacksonFactory.java
@@ -57,4 +57,4 @@ class JsonJacksonFactory extends AbstractJacksonFactory {
return new DefaultPrettyPrinter();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
index 56e1c25..fffacb5 100644
--- a/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
+++ b/log4j-layout-jackson-json/src/main/java/org/apache/logging/log4j/jackson/json/layout/JsonLayout.java
@@ -27,11 +27,11 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.jackson.AbstractJacksonLayout;
@@ -76,7 +76,7 @@ import com.fasterxml.jackson.annotation.JsonUnwrapped;
public final class JsonLayout extends AbstractJacksonLayout {
public static class Builder<B extends Builder<B>> extends AbstractJacksonLayout.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<JsonLayout> {
+ implements org.apache.logging.log4j.plugins.util.Builder<JsonLayout> {
@PluginBuilderAttribute
private boolean propertiesAsList;
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlMapEntry.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlMapEntry.java
index 2500c11..d4a90ce 100644
--- a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlMapEntry.java
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlMapEntry.java
@@ -38,4 +38,4 @@ class XmlMapEntry extends MapEntry {
super(key, value);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java
index 4cc5124..52f155b 100644
--- a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/XmlSetupContextInitializer.java
@@ -35,4 +35,4 @@ class XmlSetupContextInitializer {
? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringXmlMixIn.class : ThrowableProxyXmlMixIn.class)
: ThrowableProxyWithoutStacktraceXmlMixIn.class);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java
index 6956861..e578e87 100644
--- a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/Log4jXmlPrettyPrinter.java
@@ -38,4 +38,4 @@ class Log4jXmlPrettyPrinter extends DefaultXmlPrettyPrinter {
// nothing
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
index 0cfba5b..d291cd0 100644
--- a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlJacksonFactory.java
@@ -51,4 +51,4 @@ class XmlJacksonFactory extends AbstractJacksonFactory {
protected PrettyPrinter newPrettyPrinter() {
return new Log4jXmlPrettyPrinter(DEFAULT_INDENT);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
index 5eb7df8..2b8326e 100644
--- a/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
+++ b/log4j-layout-jackson-xml/src/main/java/org/apache/logging/log4j/jackson/xml/layout/XmlLayout.java
@@ -24,9 +24,9 @@ import java.util.Map;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.jackson.AbstractJacksonLayout;
import org.apache.logging.log4j.jackson.XmlConstants;
@@ -67,7 +67,7 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
public final class XmlLayout extends AbstractJacksonLayout {
public static class Builder<B extends Builder<B>> extends AbstractJacksonLayout.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<XmlLayout> {
+ implements org.apache.logging.log4j.plugins.util.Builder<XmlLayout> {
public Builder() {
super();
diff --git a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/YamlSetupContextInitializer.java b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/YamlSetupContextInitializer.java
index 67f6fd1..a3c8e4e 100644
--- a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/YamlSetupContextInitializer.java
+++ b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/YamlSetupContextInitializer.java
@@ -44,4 +44,4 @@ class YamlSetupContextInitializer {
: ThrowableProxyWithoutStacktraceMixIn.class);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlJacksonFactory.java b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlJacksonFactory.java
index e32041a..76d1fda 100644
--- a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlJacksonFactory.java
+++ b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlJacksonFactory.java
@@ -65,4 +65,4 @@ class YamlJacksonFactory extends AbstractJacksonFactory {
protected PrettyPrinter newPrettyPrinter() {
return new DefaultPrettyPrinter();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
index 288fd37..9f09713 100644
--- a/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
+++ b/log4j-layout-jackson-yaml/src/main/java/org/apache/logging/log4j/jackson/yaml/layout/YamlLayout.java
@@ -26,9 +26,9 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
-import org.apache.logging.log4j.core.config.Node;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.jackson.AbstractJacksonLayout;
@@ -57,7 +57,7 @@ import com.fasterxml.jackson.annotation.JsonUnwrapped;
public final class YamlLayout extends AbstractJacksonLayout {
public static class Builder<B extends Builder<B>> extends AbstractJacksonLayout.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<YamlLayout> {
+ implements org.apache.logging.log4j.plugins.util.Builder<YamlLayout> {
public Builder() {
super();
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
index 51adfcb..2773fbc 100644
--- a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/AbstractJacksonLayout.java
@@ -28,8 +28,8 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
import org.apache.logging.log4j.core.layout.AbstractStringLayout;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/Log4jStackTraceElementDeserializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/Log4jStackTraceElementDeserializer.java
index 7d03805..f155a49 100644
--- a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/Log4jStackTraceElementDeserializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/Log4jStackTraceElementDeserializer.java
@@ -79,4 +79,4 @@ public final class Log4jStackTraceElementDeserializer extends StdScalarDeseriali
}
throw ctxt.mappingException(this._valueClass, t);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MapEntry.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MapEntry.java
index fc02180..998751e 100644
--- a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MapEntry.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/MapEntry.java
@@ -106,4 +106,4 @@ public class MapEntry {
public String toString() {
return Strings.EMPTY + this.getKey() + "=" + this.getValue();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SetupContextInitializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SetupContextInitializer.java
index 3d73d93..b644a6e 100644
--- a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SetupContextInitializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SetupContextInitializer.java
@@ -35,4 +35,4 @@ public class SetupContextInitializer {
: ThrowableProxyWithoutStacktraceMixIn.class);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SimpleModuleInitializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SimpleModuleInitializer.java
index edae1bc..562f76d 100644
--- a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SimpleModuleInitializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/SimpleModuleInitializer.java
@@ -23,4 +23,4 @@ public class SimpleModuleInitializer {
}
simpleModule.addSerializer(Message.class, new MessageSerializer());
}
-}
\ No newline at end of file
+}
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java
index 8e53c6b..9dd7c83 100644
--- a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/layout/AbstractJacksonLayout.java
@@ -42,8 +42,8 @@ import java.util.Map;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.layout.AbstractStringLayout;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
diff --git a/log4j-mongodb2/src/main/java/org/apache/logging/log4j/mongodb2/MongoDbProvider.java b/log4j-mongodb2/src/main/java/org/apache/logging/log4j/mongodb2/MongoDbProvider.java
index 37af80f..f5d3c08 100644
--- a/log4j-mongodb2/src/main/java/org/apache/logging/log4j/mongodb2/MongoDbProvider.java
+++ b/log4j-mongodb2/src/main/java/org/apache/logging/log4j/mongodb2/MongoDbProvider.java
@@ -24,17 +24,17 @@ import java.util.List;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.appender.nosql.NoSqlProvider;
-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.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
import org.apache.logging.log4j.core.filter.AbstractFilterable;
-import org.apache.logging.log4j.core.util.NameUtil;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAliases;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.NameUtil;
import org.apache.logging.log4j.util.LoaderUtil;
import org.apache.logging.log4j.util.Strings;
@@ -52,7 +52,7 @@ import com.mongodb.WriteConcern;
public final class MongoDbProvider implements NoSqlProvider<MongoDbConnection> {
public static class Builder<B extends Builder<B>> extends AbstractFilterable.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<MongoDbProvider> {
+ implements org.apache.logging.log4j.plugins.util.Builder<MongoDbProvider> {
private static WriteConcern toWriteConcern(final String writeConcernConstant,
final String writeConcernConstantClassName) {
diff --git a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestRule.java b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestRule.java
index 465fa3f..acab7ba 100644
--- a/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestRule.java
+++ b/log4j-mongodb2/src/test/java/org/apache/logging/log4j/mongodb2/MongoDbTestRule.java
@@ -181,4 +181,4 @@ public class MongoDbTestRule implements TestRule {
return builder.toString();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDbProvider.java b/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDbProvider.java
index b5b437c..f16d2d0 100644
--- a/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDbProvider.java
+++ b/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDbProvider.java
@@ -22,17 +22,17 @@ import java.lang.reflect.Method;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.appender.nosql.NoSqlProvider;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.convert.TypeConverters;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidHost;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
import org.apache.logging.log4j.core.filter.AbstractFilterable;
-import org.apache.logging.log4j.core.util.NameUtil;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.convert.TypeConverters;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util.NameUtil;
import org.apache.logging.log4j.util.Strings;
import org.bson.codecs.configuration.CodecRegistries;
@@ -50,7 +50,7 @@ import com.mongodb.client.MongoDatabase;
public final class MongoDbProvider implements NoSqlProvider<MongoDbConnection> {
public static class Builder<B extends Builder<B>> extends AbstractFilterable.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<MongoDbProvider> {
+ implements org.apache.logging.log4j.plugins.util.Builder<MongoDbProvider> {
private static WriteConcern toWriteConcern(final String writeConcernConstant,
final String writeConcernConstantClassName) {
diff --git a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestRule.java b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestRule.java
index 96a903b..51bbcc2 100644
--- a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestRule.java
+++ b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDbTestRule.java
@@ -189,4 +189,4 @@ public class MongoDbTestRule implements TestRule {
return builder.toString();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java
index d951617..81baeda 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java
@@ -236,4 +236,4 @@ public class SortedArrayVsHashMapBenchmark {
map.put("someKey", "someValue");
return map.size();
}
-}
\ No newline at end of file
+}
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadContextBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadContextBenchmark.java
index ed30f58..ff22a47 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadContextBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadContextBenchmark.java
@@ -198,4 +198,4 @@ public class ThreadContextBenchmark {
}
return Collections.unmodifiableMap(map);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsConcurrentHashMapBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsConcurrentHashMapBenchmark.java
index 9755f5a..0941e72 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsConcurrentHashMapBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsConcurrentHashMapBenchmark.java
@@ -91,4 +91,4 @@ public class ThreadLocalVsConcurrentHashMapBenchmark {
buf.setLength(0);
return buf;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcLayout.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcLayout.java
index 81fa861..693b8df 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcLayout.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/NoGcLayout.java
@@ -131,4 +131,4 @@ public class NoGcLayout implements Layout<Serializable>, Encoder<LogEvent> {
public Map<String, String> getContentFormat() {
return null;
}
-}
\ No newline at end of file
+}
diff --git a/log4j-samples/log4j-samples-configuration/src/main/java/org/apache/logging/log4j/configuration/CustomConfigurationFactory.java b/log4j-samples/log4j-samples-configuration/src/main/java/org/apache/logging/log4j/configuration/CustomConfigurationFactory.java
index 53b70c7..8f536fe 100644
--- a/log4j-samples/log4j-samples-configuration/src/main/java/org/apache/logging/log4j/configuration/CustomConfigurationFactory.java
+++ b/log4j-samples/log4j-samples-configuration/src/main/java/org/apache/logging/log4j/configuration/CustomConfigurationFactory.java
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Order;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
/**
* Factory to construct a CustomConfiguration.
diff --git a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Alert.java b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Alert.java
index 532519f..12a3c48 100755
--- a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Alert.java
+++ b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Alert.java
@@ -75,4 +75,4 @@ public interface Alert extends org.apache.logging.log4j.samples.dto.AuditEvent {
*/
@Constraint(required = true)
void setType(String type);
-}
\ No newline at end of file
+}
diff --git a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/ChangePassword.java b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/ChangePassword.java
index 6f725db..b0e7e17 100755
--- a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/ChangePassword.java
+++ b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/ChangePassword.java
@@ -31,4 +31,4 @@ public interface ChangePassword extends org.apache.logging.log4j.samples.dto.Aud
*/
@Constraint(required = true)
void setMember(String member);
-}
\ No newline at end of file
+}
diff --git a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Login.java b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Login.java
index 4cb2d33..2f16043 100755
--- a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Login.java
+++ b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Login.java
@@ -43,4 +43,4 @@ public interface Login extends org.apache.logging.log4j.samples.dto.AuditEvent {
*/
void setStartPageOption(String startPageOption);
-}
\ No newline at end of file
+}
diff --git a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/ScheduledTransaction.java b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/ScheduledTransaction.java
index e231f28..acb03ea 100755
--- a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/ScheduledTransaction.java
+++ b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/ScheduledTransaction.java
@@ -125,4 +125,4 @@ public interface ScheduledTransaction extends org.apache.logging.log4j.samples.d
void setToAccount(String toAccount);
-}
\ No newline at end of file
+}
diff --git a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Transfer.java b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Transfer.java
index 13e5764..17377a9 100755
--- a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Transfer.java
+++ b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/events/Transfer.java
@@ -169,4 +169,4 @@ public interface Transfer extends org.apache.logging.log4j.samples.dto.AuditEven
void setType(String type);
-}
\ No newline at end of file
+}
diff --git a/log4j-samples/log4j-samples-loggerProperties/src/main/java/org/apache/logging/log4j/lookup/CustomLookup.java b/log4j-samples/log4j-samples-loggerProperties/src/main/java/org/apache/logging/log4j/lookup/CustomLookup.java
index 8bd3415..0000f88 100644
--- a/log4j-samples/log4j-samples-loggerProperties/src/main/java/org/apache/logging/log4j/lookup/CustomLookup.java
+++ b/log4j-samples/log4j-samples-loggerProperties/src/main/java/org/apache/logging/log4j/lookup/CustomLookup.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.AbstractLookup;
import org.apache.logging.log4j.core.lookup.StrLookup;
import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-samples/log4j-samples-loggerProperties/src/main/java/org/apache/logging/log4j/lookup/MapMessageLookup.java b/log4j-samples/log4j-samples-loggerProperties/src/main/java/org/apache/logging/log4j/lookup/MapMessageLookup.java
index 5c444cb..a800a21 100644
--- a/log4j-samples/log4j-samples-loggerProperties/src/main/java/org/apache/logging/log4j/lookup/MapMessageLookup.java
+++ b/log4j-samples/log4j-samples-loggerProperties/src/main/java/org/apache/logging/log4j/lookup/MapMessageLookup.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.AbstractLookup;
import org.apache.logging.log4j.core.lookup.StrLookup;
import org.apache.logging.log4j.message.MapMessage;
diff --git a/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
index 8934f29..e04cbaf 100644
--- a/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
+++ b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
@@ -38,4 +38,4 @@ public class Log4j2_1482_Slf4jTest extends Log4j2_1482_Test {
logger.info("Info Message!", val1, val2, val3);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/OverflowTest.java b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/OverflowTest.java
index ffd9459b..10e683e 100644
--- a/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/OverflowTest.java
+++ b/log4j-slf4j-impl/src/test/java/org/apache/logging/slf4j/OverflowTest.java
@@ -41,4 +41,4 @@ public class OverflowTest {
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-slf4j18-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java b/log4j-slf4j18-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
index 8934f29..e04cbaf 100644
--- a/log4j-slf4j18-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
+++ b/log4j-slf4j18-impl/src/test/java/org/apache/logging/slf4j/Log4j2_1482_Slf4jTest.java
@@ -38,4 +38,4 @@ public class Log4j2_1482_Slf4jTest extends Log4j2_1482_Test {
logger.info("Info Message!", val1, val2, val3);
}
-}
\ No newline at end of file
+}
diff --git a/log4j-slf4j18-impl/src/test/java/org/apache/logging/slf4j/OverflowTest.java b/log4j-slf4j18-impl/src/test/java/org/apache/logging/slf4j/OverflowTest.java
index 8682636..b12facb 100644
--- a/log4j-slf4j18-impl/src/test/java/org/apache/logging/slf4j/OverflowTest.java
+++ b/log4j-slf4j18-impl/src/test/java/org/apache/logging/slf4j/OverflowTest.java
@@ -40,4 +40,4 @@ public class OverflowTest {
fail("Failed to detect inclusion of log4j-to-slf4j, caught StackOverflowError");
}
}
-}
\ No newline at end of file
+}
diff --git a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/MimeMessageBuilder.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/MimeMessageBuilder.java
index 30c7ee4..1656bad 100644
--- a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/MimeMessageBuilder.java
+++ b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/MimeMessageBuilder.java
@@ -25,7 +25,7 @@ import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
-import org.apache.logging.log4j.core.util.Builder;
+import org.apache.logging.log4j.plugins.util.Builder;
/**
* Builder for {@link MimeMessage} instances.
diff --git a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpAppender.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpAppender.java
index a96b532..5c52ae8 100644
--- a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpAppender.java
+++ b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpAppender.java
@@ -28,13 +28,13 @@ import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginAttribute;
+import org.apache.logging.log4j.plugins.PluginElement;
+import org.apache.logging.log4j.plugins.PluginFactory;
+import org.apache.logging.log4j.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
import org.apache.logging.log4j.core.filter.ThresholdFilter;
import org.apache.logging.log4j.core.layout.HtmlLayout;
import org.apache.logging.log4j.core.util.Booleans;
diff --git a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
index 4f1c4a1..ccf2c8f 100644
--- a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
+++ b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
@@ -47,7 +47,7 @@ import org.apache.logging.log4j.core.impl.MutableLogEvent;
import org.apache.logging.log4j.core.layout.AbstractStringLayout.Serializer;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.util.CyclicBuffer;
-import org.apache.logging.log4j.core.util.NameUtil;
+import org.apache.logging.log4j.util.NameUtil;
import org.apache.logging.log4j.core.util.NetUtils;
import org.apache.logging.log4j.message.ReusableMessage;
import org.apache.logging.log4j.smtp.MimeMessageBuilder;
diff --git a/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderAsyncTest.java b/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderAsyncTest.java
index e0225cb..d086c73 100644
--- a/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderAsyncTest.java
+++ b/log4j-smtp/src/test/java/org/apache/logging/log4j/smtp/appender/SmtpAppenderAsyncTest.java
@@ -95,4 +95,4 @@ public class SmtpAppenderAsyncTest {
public static void teardownClass() {
System.clearProperty("smtp.port");
}
-}
\ No newline at end of file
+}
diff --git a/log4j-web/src/main/java/org/apache/logging/log4j/web/WebLookup.java b/log4j-web/src/main/java/org/apache/logging/log4j/web/WebLookup.java
index aa6d141..749472a 100644
--- a/log4j-web/src/main/java/org/apache/logging/log4j/web/WebLookup.java
+++ b/log4j-web/src/main/java/org/apache/logging/log4j/web/WebLookup.java
@@ -21,7 +21,7 @@ package org.apache.logging.log4j.web;
import javax.servlet.ServletContext;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.AbstractLookup;
import org.apache.logging.log4j.util.Strings;
diff --git a/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java b/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
index c4e8b90..4c6c332 100644
--- a/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
+++ b/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
@@ -25,9 +25,9 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.logging.log4j.plugins.Plugin;
+import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.layout.AbstractStringLayout;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.web.WebLoggerContextUtils;
@@ -39,7 +39,7 @@ import org.apache.logging.log4j.web.WebLoggerContextUtils;
public class ServletAppender extends AbstractAppender {
public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
- implements org.apache.logging.log4j.core.util.Builder<ServletAppender> {
+ implements org.apache.logging.log4j.plugins.util.Builder<ServletAppender> {
@PluginBuilderAttribute
private boolean logThrowables;
diff --git a/pom.xml b/pom.xml
index 4da39cb..e13f6b8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -219,7 +219,7 @@
<scm.plugin.version>1.9.5</scm.plugin.version>
<jxr.plugin.version>2.5</jxr.plugin.version>
<revapi.plugin.version>0.10.5</revapi.plugin.version>
- <revapi.skip>false</revapi.skip>
+ <revapi.skip>true</revapi.skip>
<!-- Maven site 3.7 uses the wrong stylesheet? -->
<site.plugin.version>3.4</site.plugin.version>
<!-- Maven site depends on Velocity and the escaping rules are different in newer versions. -->
@@ -336,6 +336,24 @@
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-plugins-java9</artifactId>
+ <version>${project.version}</version>
+ <type>zip</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-plugins</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-plugins</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
@@ -1457,6 +1475,8 @@
<modules>
<module>log4j-api-java9</module>
<module>log4j-api</module>
+ <module>log4j-plugins-java9</module>
+ <module>log4j-plugins</module>
<module>log4j-core-java9</module>
<module>log4j-core</module>
<module>log4j-layout-jackson</module>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f44fc99..d85442f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -2164,7 +2164,7 @@
Removed deprecated Core API org.apache.logging.log4j.core.util.Constants.UTF_8.
</action>
<action issue="LOG4J2-1544" dev="ggregory" type="update">
- Removed deprecated Core API org.apache.logging.log4j.core.util.Assert.requireNonNull(T, String).
+ Removed deprecated Core API org.apache.logging.log4j.util.Assert.requireNonNull(T, String).
</action>
<action issue="LOG4J2-1545" dev="ggregory" type="update">
Removed deprecated Web API org.apache.logging.log4j.web.WebLookup.getServletContext().
diff --git a/src/site/asciidoc/manual/extending.adoc b/src/site/asciidoc/manual/extending.adoc
index 6634ddc..7eb0a0a 100644
--- a/src/site/asciidoc/manual/extending.adoc
+++ b/src/site/asciidoc/manual/extending.adoc
@@ -510,7 +510,7 @@ public static Builder newBuilder() {
return new Builder();
}
-public static class Builder implements org.apache.logging.log4j.core.util.Builder<ListAppender> {
+public static class Builder implements org.apache.logging.log4j.plugins.util.Builder<ListAppender> {
@PluginBuilderAttribute
@Required(message = "No name provided for ListAppender")