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


The following commit(s) were added to refs/heads/master by this push:
     new deea4d4  Make KeyProvider plugins injectable
deea4d4 is described below

commit deea4d46f6bbe1081f1fdfc961ac7c672ec5eadf
Author: Matt Sicker <[email protected]>
AuthorDate: Sun Mar 27 20:57:53 2022 -0500

    Make KeyProvider plugins injectable
    
    Signed-off-by: Matt Sicker <[email protected]>
---
 .../logging/log4j/core/util/SecretKeyProvider.java |  8 +++
 .../log4j/flume/appender/FlumeAppender.java        | 74 +++++++++++-----------
 .../flume/appender/FlumePersistentManager.java     | 30 +++++----
 .../log4j/flume/appender/FlumeAppenderTest.java    | 47 ++++++++------
 .../logging/log4j/flume/test/FlumeKeyProvider.java |  8 +--
 5 files changed, 94 insertions(+), 73 deletions(-)

diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SecretKeyProvider.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SecretKeyProvider.java
index 3f38f87..58dae4b 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SecretKeyProvider.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SecretKeyProvider.java
@@ -16,6 +16,10 @@
  */
 package org.apache.logging.log4j.core.util;
 
+import org.apache.logging.log4j.plugins.Named;
+import org.apache.logging.log4j.plugins.di.Key;
+import org.apache.logging.log4j.plugins.util.PluginManager;
+
 import javax.crypto.SecretKey;
 
 /**
@@ -23,6 +27,10 @@ import javax.crypto.SecretKey;
  */
 public interface SecretKeyProvider {
 
+    String CATEGORY = "KeyProvider";
+
+    Key<PluginManager> PLUGIN_MANAGER_KEY = new @Named(CATEGORY) Key<>() {};
+
     /**
      * Returns this SecretKey.
      *
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 c2e7a2e..33a12ea 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
@@ -16,27 +16,28 @@
  */
 package org.apache.logging.log4j.flume.appender;
 
-import java.io.Serializable;
-import java.util.Locale;
-import java.util.concurrent.TimeUnit;
-
 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.appender.AbstractAppender;
 import org.apache.logging.log4j.core.config.Property;
+import org.apache.logging.log4j.core.layout.Rfc5424Layout;
+import org.apache.logging.log4j.core.net.Facility;
+import org.apache.logging.log4j.core.util.Booleans;
+import org.apache.logging.log4j.core.util.Integers;
 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;
-import org.apache.logging.log4j.core.util.Integers;
+import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.util.Timer;
 
+import java.io.Serializable;
+import java.util.Locale;
+import java.util.concurrent.TimeUnit;
+
 /**
  * An Appender that uses the Avro protocol to route events to Flume.
  */
@@ -181,36 +182,37 @@ public final class FlumeAppender extends AbstractAppender 
implements FlumeEventF
      * @param factory The factory to use to create Flume events.
      * @param layout The layout to format the event.
      * @param filter A Filter to filter events.
-     *
      * @return A Flume Avro Appender.
      */
     @PluginFactory
-    public static FlumeAppender createAppender(@PluginElement final Agent[] 
agents,
-                                               @PluginElement final Property[] 
properties,
-                                               @PluginAttribute final String 
hosts,
-                                               @PluginAttribute final String 
embedded,
-                                               @PluginAttribute final String 
type,
-                                               @PluginAttribute final String 
dataDir,
-                                               @PluginAliases("connectTimeout")
-                                               
@PluginAttribute("connectTimeoutMillis") final String connectionTimeoutMillis,
-                                               @PluginAliases("requestTimeout")
-                                               @PluginAttribute final String 
requestTimeoutMillis,
-                                               @PluginAttribute final String 
agentRetries,
-                                               @PluginAliases("maxDelay") // 
deprecated
-                                               @PluginAttribute final String 
maxDelayMillis,
-                                               @PluginAttribute final String 
name,
-                                               
@PluginAttribute("ignoreExceptions") final String ignore,
-                                               @PluginAttribute("mdcExcludes") 
final String excludes,
-                                               @PluginAttribute("mdcIncludes") 
final String includes,
-                                               @PluginAttribute("mdcRequired") 
final String required,
-                                               @PluginAttribute final String 
mdcPrefix,
-                                               @PluginAttribute final String 
eventPrefix,
-                                               @PluginAttribute("compress") 
final String compressBody,
-                                               @PluginAttribute final String 
batchSize,
-                                               @PluginAttribute final String 
lockTimeoutRetries,
-                                               @PluginElement final 
FlumeEventFactory factory,
-                                               @PluginElement Layout<? extends 
Serializable> layout,
-                                               @PluginElement final Filter 
filter) {
+    public static FlumeAppender createAppender(
+            @PluginElement final Agent[] agents,
+            @PluginElement final Property[] properties,
+            @PluginAttribute final String hosts,
+            @PluginAttribute final String embedded,
+            @PluginAttribute final String type,
+            @PluginAttribute final String dataDir,
+            @PluginAliases("connectTimeout")
+            @PluginAttribute("connectTimeoutMillis") final String 
connectionTimeoutMillis,
+            @PluginAliases("requestTimeout")
+            @PluginAttribute final String requestTimeoutMillis,
+            @PluginAttribute final String agentRetries,
+            @PluginAliases("maxDelay") // deprecated
+            @PluginAttribute final String maxDelayMillis,
+            @PluginAttribute final String name,
+            @PluginAttribute("ignoreExceptions") final String ignore,
+            @PluginAttribute("mdcExcludes") final String excludes,
+            @PluginAttribute("mdcIncludes") final String includes,
+            @PluginAttribute("mdcRequired") final String required,
+            @PluginAttribute final String mdcPrefix,
+            @PluginAttribute final String eventPrefix,
+            @PluginAttribute("compress") final String compressBody,
+            @PluginAttribute final String batchSize,
+            @PluginAttribute final String lockTimeoutRetries,
+            @PluginElement final FlumeEventFactory factory,
+            @PluginElement Layout<? extends Serializable> layout,
+            @PluginElement final Filter filter,
+            final Injector injector) {
 
         final boolean embed = embedded != null ? 
Boolean.parseBoolean(embedded) :
             (agents == null || agents.length == 0 || hosts == null || 
hosts.isEmpty()) && properties != null && properties.length > 0;
@@ -271,7 +273,7 @@ public final class FlumeAppender extends AbstractAppender 
implements FlumeEventF
                 break;
             case PERSISTENT:
                 manager = FlumePersistentManager.getManager(name, 
getAgents(agents, hosts), properties, batchCount, retries,
-                    connectTimeoutMillis, reqTimeoutMillis, delayMillis, 
lockTimeoutRetryCount, dataDir);
+                        connectTimeoutMillis, reqTimeoutMillis, delayMillis, 
lockTimeoutRetryCount, dataDir, injector);
                 break;
             default:
                 LOGGER.debug("No manager type specified. Defaulting to AVRO");
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 8219779..b802f0c 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
@@ -38,8 +38,9 @@ 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.di.Injector;
+import org.apache.logging.log4j.plugins.util.PluginManager;
 import org.apache.logging.log4j.plugins.util.PluginType;
-import org.apache.logging.log4j.plugins.util.PluginUtil;
 import org.apache.logging.log4j.util.Strings;
 
 import javax.crypto.Cipher;
@@ -141,11 +142,10 @@ public class FlumePersistentManager extends 
FlumeAvroManager {
      * @param dataDir The location of the Berkeley database.
      * @return A FlumeAvroManager.
      */
-    public static FlumePersistentManager getManager(final String name, final 
Agent[] agents,
-                                                    final Property[] 
properties, int batchSize, final int retries,
-                                                    final int 
connectionTimeout, final int requestTimeout,
-                                                    final int delayMillis, 
final int lockTimeoutRetryCount,
-                                                    final String dataDir) {
+    public static FlumePersistentManager getManager(
+            final String name, final Agent[] agents, final Property[] 
properties, int batchSize, final int retries,
+            final int connectionTimeout, final int requestTimeout, final int 
delayMillis, final int lockTimeoutRetryCount,
+            final String dataDir, final Injector injector) {
         if (agents == null || agents.length == 0) {
             throw new IllegalArgumentException("At least one agent is 
required");
         }
@@ -167,7 +167,7 @@ public class FlumePersistentManager extends 
FlumeAvroManager {
         sb.append(']');
         sb.append(' ').append(dataDirectory);
         return getManager(sb.toString(), factory, new FactoryData(name, 
agents, batchSize, retries,
-            connectionTimeout, requestTimeout, delayMillis, 
lockTimeoutRetryCount, dataDir, properties));
+            connectionTimeout, requestTimeout, delayMillis, 
lockTimeoutRetryCount, dataDir, properties, injector));
     }
 
     @Override
@@ -344,6 +344,7 @@ public class FlumePersistentManager extends 
FlumeAvroManager {
         private final int delayMillis;
         private final int lockTimeoutRetryCount;
         private final Property[] properties;
+        private final Injector injector;
 
         /**
          * Constructor.
@@ -352,9 +353,11 @@ public class FlumePersistentManager extends 
FlumeAvroManager {
          * @param batchSize The number of events to include in a batch.
          * @param dataDir The directory for data.
          */
-        public FactoryData(final String name, final Agent[] agents, final int 
batchSize, final int retries,
-                           final int connectionTimeout, final int 
requestTimeout, final int delayMillis,
-                           final int lockTimeoutRetryCount, final String 
dataDir, final Property[] properties) {
+        public FactoryData(
+                final String name, final Agent[] agents, final int batchSize, 
final int retries,
+                final int connectionTimeout, final int requestTimeout, final 
int delayMillis,
+                final int lockTimeoutRetryCount, final String dataDir, final 
Property[] properties,
+                final Injector injector) {
             this.name = name;
             this.agents = agents;
             this.batchSize = batchSize;
@@ -365,6 +368,7 @@ public class FlumePersistentManager extends 
FlumeAvroManager {
             this.delayMillis = delayMillis;
             this.lockTimeoutRetryCount = lockTimeoutRetryCount;
             this.properties = properties;
+            this.injector = injector;
         }
     }
 
@@ -429,7 +433,9 @@ public class FlumePersistentManager extends 
FlumeAvroManager {
                     }
                 }
                 if (key != null) {
-                    final Map<String, PluginType<?>> plugins = 
PluginUtil.collectPluginsByCategory("KeyProvider");
+                    final PluginManager pluginManager = 
data.injector.getInstance(SecretKeyProvider.PLUGIN_MANAGER_KEY);
+                    pluginManager.collectPlugins();
+                    final Map<String, PluginType<?>> plugins = 
pluginManager.getPlugins();
                     if (plugins != null) {
                         boolean found = false;
                         for (final Map.Entry<String, PluginType<?>> entry : 
plugins.entrySet()) {
@@ -437,7 +443,7 @@ public class FlumePersistentManager extends 
FlumeAvroManager {
                                 found = true;
                                 final Class<?> cl = 
entry.getValue().getPluginClass();
                                 try {
-                                    final SecretKeyProvider provider = 
(SecretKeyProvider) cl.newInstance();
+                                    final SecretKeyProvider provider = 
data.injector.getInstance(cl.asSubclass(SecretKeyProvider.class));
                                     secretKey = provider.getSecretKey();
                                     LOGGER.debug("Persisting events using 
SecretKeyProvider {}", cl.getName());
                                 } catch (final Exception ex) {
diff --git 
a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
 
b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
index 95c9c56..401f6d5 100644
--- 
a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
+++ 
b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
@@ -16,16 +16,6 @@
  */
 package org.apache.logging.log4j.flume.appender;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.zip.GZIPInputStream;
-
 import org.apache.flume.Channel;
 import org.apache.flume.ChannelException;
 import org.apache.flume.ChannelSelector;
@@ -45,15 +35,27 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.core.test.AvailablePortFinder;
 import org.apache.logging.log4j.message.StructuredDataMessage;
+import org.apache.logging.log4j.plugins.di.DI;
+import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.core.test.AvailablePortFinder;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.zip.GZIPInputStream;
+
 /**
  *
  */
@@ -63,6 +65,7 @@ public class FlumeAppenderTest {
     private Channel channel;
     private Logger avroLogger;
     private String testPort;
+    private Injector injector;
 
     @BeforeClass
     public static void setupClass() {
@@ -71,6 +74,8 @@ public class FlumeAppenderTest {
 
     @Before
     public void setUp() throws Exception {
+        injector = DI.createInjector();
+        injector.init();
         eventSource = new AvroSource();
         channel = new MemoryChannel();
 
@@ -121,7 +126,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
                 null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
                 "avro", "false", null, null, null, null, null, "true", "1",
-                null, null, null, null);
+                null, null, null, null, injector);
         avroAppender.start();
         avroLogger.addAppender(avroAppender);
         avroLogger.setLevel(Level.ALL);
@@ -149,7 +154,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(null,
                 null, hosts, "false", "Avro", null, "1000", "1000", "1", 
"1000",
                 "avro", "false", null, null, null, null, null, "true", "1",
-                null, null, null, null);
+                null, null, null, null, injector);
         avroAppender.start();
         avroLogger.addAppender(avroAppender);
         avroLogger.setLevel(Level.ALL);
@@ -178,7 +183,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
                 null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
                 "avro", "false", null, null, null, "ReqCtx_", null, "true",
-                "1", null, null, null, null);
+                "1", null, null, null, null, injector);
         avroAppender.start();
         final Logger eventLogger = (Logger) 
LogManager.getLogger("EventLogger");
         Assert.assertNotNull(eventLogger);
@@ -217,7 +222,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
                 null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
                 "avro", "false", null, null, null, null, null, "true", "1",
-                null, null, null, null);
+                null, null, null, null, injector);
         avroAppender.start();
         avroLogger.addAppender(avroAppender);
         avroLogger.setLevel(Level.ALL);
@@ -252,7 +257,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
                 null, null, "false", "Avro", null, "1000", "1000", "1", "500",
                 "avro", "false", null, null, null, null, null, "true", "10",
-                null, null, null, null);
+                null, null, null, null, injector);
         avroAppender.start();
         avroLogger.addAppender(avroAppender);
         avroLogger.setLevel(Level.ALL);
@@ -292,7 +297,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
                 null, null, "false", "Avro", null, "1000", "1000", "1", "500",
                 "avro", "false", null, null, null, null, null, "true", "10",
-                null, null, null, null);
+                null, null, null, null, injector);
         avroAppender.start();
         avroLogger.addAppender(avroAppender);
         avroLogger.setLevel(Level.ALL);
@@ -326,7 +331,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
                 null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
                 "avro", "false", null, null, null, null, null, "true", "10",
-                null, null, null, null);
+                null, null, null, null, injector);
         avroAppender.start();
         avroLogger.addAppender(avroAppender);
         avroLogger.setLevel(Level.ALL);
@@ -360,7 +365,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
                 null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
                 "avro", "false", null, null, null, null, null, "true", "1",
-                null, null, null, null);
+                null, null, null, null, injector);
         avroAppender.start();
         avroLogger.addAppender(avroAppender);
         avroLogger.setLevel(Level.ALL);
@@ -390,7 +395,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
                 null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
                 "avro", "false", null, null, null, null, null, "true", "1",
-                null, null, null, null);
+                null, null, null, null, injector);
         avroAppender.start();
         Assert.assertTrue("Appender Not started", avroAppender.isStarted());
         avroLogger.addAppender(avroAppender);
@@ -438,7 +443,7 @@ public class FlumeAppenderTest {
         final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
                 null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
                 "avro", "false", null, null, null, null, null, "true", "1",
-                null, null, null, null);
+                null, null, null, null, injector);
         avroAppender.start();
         avroLogger.addAppender(avroAppender);
         avroLogger.setLevel(Level.ALL);
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 b288cdf..e680f19 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
@@ -16,16 +16,16 @@
  */
 package org.apache.logging.log4j.flume.test;
 
+import org.apache.logging.log4j.core.util.SecretKeyProvider;
+import org.apache.logging.log4j.plugins.Plugin;
+
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
 
-import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.core.util.SecretKeyProvider;
-
 /**
  *
  */
-@Plugin(name = "FlumeKeyProvider", category = "KeyProvider", elementType = 
"SecretKeyProvider", printObject = true)
+@Plugin(name = "FlumeKeyProvider", category = SecretKeyProvider.CATEGORY, 
elementType = "SecretKeyProvider", printObject = true)
 public class FlumeKeyProvider implements SecretKeyProvider {
 
     private static final byte[] key = new byte[] {-7, -21, -118, -25, -79, 73, 
72, -64, 0, 127, -93, -13, -38,

Reply via email to