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) {
+ }
+}