You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2022/06/18 23:48:13 UTC

[logging-log4j2] 01/17: Add parameter resolver for Appender AbstractManager

This is an automated email from the ASF dual-hosted git repository.

mattsicker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 51d865ee79f85a8a5b61cc451e704c53dcbf8a43
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Sat Jun 18 16:25:27 2022 -0500

    Add parameter resolver for Appender AbstractManager
    
    This adds a resolver similar to the one for Appender to obtain its AbstractManager instance.
    
    Signed-off-by: Matt Sicker <ma...@apache.org>
---
 .../core/test/junit/AppenderManagerResolver.java   | 69 ++++++++++++++++++++++
 .../log4j/core/test/junit/AppenderResolver.java    | 10 +++-
 .../log4j/core/test/junit/LoggerContextSource.java |  5 +-
 .../rolling/AbstractRollingListenerTest.java       | 39 ++++++++++++
 4 files changed, 120 insertions(+), 3 deletions(-)

diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderManagerResolver.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderManagerResolver.java
new file mode 100644
index 0000000000..ea5f36e400
--- /dev/null
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderManagerResolver.java
@@ -0,0 +1,69 @@
+/*
+ * 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.test.junit;
+
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.AbstractManager;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.plugins.di.Keys;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.ParameterContext;
+import org.junit.jupiter.api.extension.ParameterResolutionException;
+import org.junit.jupiter.api.extension.ParameterResolver;
+import org.junit.platform.commons.support.ReflectionSupport;
+
+import java.lang.reflect.Parameter;
+
+import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getLoggerContext;
+
+/**
+ * Resolves parameters that extend {@link AbstractManager} and have a {@link org.apache.logging.log4j.plugins.Named}
+ * parameter of the corresponding appender that uses the manager.
+ */
+class AppenderManagerResolver implements ParameterResolver {
+    @Override
+    public boolean supportsParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext) throws ParameterResolutionException {
+        final Parameter parameter = parameterContext.getParameter();
+        return AbstractManager.class.isAssignableFrom(parameter.getType()) && Keys.hasName(parameter);
+    }
+
+    @Override
+    public Object resolveParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext) throws ParameterResolutionException {
+        final LoggerContext loggerContext = getLoggerContext(extensionContext);
+        if (loggerContext == null) {
+            throw new ParameterResolutionException("No LoggerContext defined");
+        }
+        final Configuration configuration = loggerContext.getConfiguration();
+        final Parameter parameter = parameterContext.getParameter();
+        final String name = Keys.getName(parameter);
+        final Appender appender = configuration.getAppender(name);
+        if (appender == null) {
+            throw new ParameterResolutionException("No appender named " + name);
+        }
+        final Class<? extends Appender> appenderClass = appender.getClass();
+        final Object manager = ReflectionSupport.findMethod(appenderClass, "getManager")
+                .map(method -> ReflectionSupport.invokeMethod(method, appender))
+                .orElseThrow(() -> new ParameterResolutionException("Cannot find getManager() on appender " + appenderClass));
+        final Class<?> parameterType = parameter.getType();
+        if (!parameterType.isInstance(manager)) {
+            throw new ParameterResolutionException("Expected type " + parameterType + " but got type " + manager.getClass());
+        }
+        return manager;
+    }
+}
diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderResolver.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderResolver.java
index 99069b8e1d..6e206591a3 100644
--- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderResolver.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderResolver.java
@@ -25,14 +25,20 @@ import org.junit.jupiter.api.extension.ParameterContext;
 import org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.ParameterResolver;
 
+import java.lang.reflect.Parameter;
+
 import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getLoggerContext;
 
+/**
+ * Resolves parameters that implement {@link Appender} and have a {@link org.apache.logging.log4j.plugins.Named}
+ * value of the name of the appender.
+ */
 class AppenderResolver implements ParameterResolver {
     @Override
     public boolean supportsParameter(
             ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return Appender.class.isAssignableFrom(parameterContext.getParameter().getType()) &&
-                Keys.hasName(parameterContext.getParameter());
+        final Parameter parameter = parameterContext.getParameter();
+        return Appender.class.isAssignableFrom(parameter.getType()) && Keys.hasName(parameter);
     }
 
     @Override
diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextSource.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextSource.java
index 6e4bdef993..ccdc502764 100644
--- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextSource.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextSource.java
@@ -20,6 +20,7 @@ package org.apache.logging.log4j.core.test.junit;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.AbstractManager;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -42,7 +43,8 @@ import java.util.concurrent.TimeUnit;
  *     <li>{@link LoggerContext};</li>
  *     <li>{@link Configuration};</li>
  *     <li>{@link Logger} (with a {@link Named} annotation to use a different Logger than the test class;</li>
- *     <li>any subclass of {@link Appender} paired with a {@link Named} annotation to select the appender by name.</li>
+ *     <li>any subclass of {@link Appender} paired with a {@link Named} annotation to select the appender by name;</li>
+ *     <li>any subclass of {@link AbstractManager} paired with a {@link Named} annotation to select the appender by name.</li>
  * </ul>
  *
  * Tests using this extension will automatically be tagged as {@code functional} to indicate they perform functional tests that
@@ -58,6 +60,7 @@ import java.util.concurrent.TimeUnit;
 @ExtendWith(LoggerContextResolver.class)
 @ExtendWith(ConfigurationResolver.class)
 @ExtendWith(AppenderResolver.class)
+@ExtendWith(AppenderManagerResolver.class)
 @ExtendWith(LoggerResolver.class)
 public @interface LoggerContextSource {
     /**
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/AbstractRollingListenerTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/AbstractRollingListenerTest.java
new file mode 100644
index 0000000000..bf8cb2e340
--- /dev/null
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/AbstractRollingListenerTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.appender.rolling;
+
+import org.apache.logging.log4j.core.time.Clock;
+import org.apache.logging.log4j.plugins.Factory;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Provides a controllable clock for rolling appender tests.
+ */
+public abstract class AbstractRollingListenerTest implements RolloverListener {
+    protected final AtomicLong currentTimeMillis = new AtomicLong(System.currentTimeMillis());
+
+    @Factory
+    Clock clock() {
+        return currentTimeMillis::get;
+    }
+
+    @Override
+    public void rolloverTriggered(final String fileName) {
+    }
+}