Return-Path: X-Original-To: apmail-logging-commits-archive@minotaur.apache.org Delivered-To: apmail-logging-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 5B6FAD530 for ; Fri, 10 Aug 2012 02:15:37 +0000 (UTC) Received: (qmail 25703 invoked by uid 500); 10 Aug 2012 02:15:37 -0000 Delivered-To: apmail-logging-commits-archive@logging.apache.org Received: (qmail 25673 invoked by uid 500); 10 Aug 2012 02:15:37 -0000 Mailing-List: contact commits-help@logging.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@logging.apache.org Delivered-To: mailing list commits@logging.apache.org Received: (qmail 25661 invoked by uid 99); 10 Aug 2012 02:15:36 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Aug 2012 02:15:36 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Aug 2012 02:15:35 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 043F523888FD; Fri, 10 Aug 2012 02:14:52 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1371545 - in /logging/log4j/log4j2/trunk: core/src/main/java/org/apache/logging/log4j/core/config/plugins/ flume-ng/ flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/ src/changes/ Date: Fri, 10 Aug 2012 02:14:51 -0000 To: commits@logging.apache.org From: rgoers@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120810021452.043F523888FD@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: rgoers Date: Fri Aug 10 02:14:51 2012 New Revision: 1371545 URL: http://svn.apache.org/viewvc?rev=1371545&view=rev Log: Fix LOG4J2-67 - Allow Plugins outside of core to use a PluginMap Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java logging/log4j/log4j2/trunk/flume-ng/pom.xml logging/log4j/log4j2/trunk/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAvroAppenderTest.java logging/log4j/log4j2/trunk/src/changes/changes.xml Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java?rev=1371545&r1=1371544&r2=1371545&view=diff ============================================================================== --- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java (original) +++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java Fri Aug 10 02:14:51 2012 @@ -24,9 +24,13 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; +import java.io.File; import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; +import java.net.URL; import java.text.DecimalFormat; +import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -83,7 +87,9 @@ public class PluginManager { rootDir = args[0].endsWith("/") || args[0].endsWith("\\") ? args[0] : args[0] + "/"; PluginManager manager = new PluginManager("Core"); - manager.collectPlugins(false); + String packages = args.length == 2 ? args[1] : null; + + manager.collectPlugins(false, packages); encode(pluginTypeMap); } @@ -116,14 +122,16 @@ public class PluginManager { * Locates all the plugins. */ public void collectPlugins() { - collectPlugins(true); + collectPlugins(true, null); } /** * Collects plugins, optionally obtaining them from a preload map. * @param preLoad if true, plugins will be obtained from the preload map. + * @param pkgs A comma separated list of package names to scan for plugins. If + * null the default Log4j package name will be used. */ - public void collectPlugins(boolean preLoad) { + public void collectPlugins(boolean preLoad, String pkgs) { if (pluginTypeMap.containsKey(type)) { plugins = pluginTypeMap.get(type); preLoad = false; @@ -144,7 +152,14 @@ public class PluginManager { } } if (plugins.size() == 0) { - packages.add(LOG4J_PACKAGES); + if (pkgs == null) { + packages.add(LOG4J_PACKAGES); + } else { + String[] names = pkgs.split(","); + for (String name : names) { + packages.add(name); + } + } } ResolverUtil.Test test = new PluginTest(clazz); for (String pkg : packages) { @@ -174,40 +189,52 @@ public class PluginManager { } private static ConcurrentMap> decode(ClassLoader loader) { - String resource = PATH + FILENAME; + Enumeration resources; try { - InputStream is = loader.getResourceAsStream(resource); - BufferedInputStream bis = new BufferedInputStream(is); - DataInputStream dis = new DataInputStream(bis); - int count = dis.readInt(); - ConcurrentMap> map = - new ConcurrentHashMap>(count); - for (int j = 0; j < count; ++j) { - String type = dis.readUTF(); - int entries = dis.readInt(); - ConcurrentMap types = new ConcurrentHashMap(count); - for (int i = 0; i < entries; ++i) { - String key = dis.readUTF(); - String className = dis.readUTF(); - String name = dis.readUTF(); - boolean printable = dis.readBoolean(); - boolean defer = dis.readBoolean(); - Class clazz = Class.forName(className); - types.put(key, new PluginType(clazz, name, printable, defer)); + resources = loader.getResources(PATH + FILENAME); + } catch (IOException ioe) { + LOGGER.warn("Unable to preload plugins", ioe); + return null; + } + ConcurrentMap> map = + new ConcurrentHashMap>(); + while (resources.hasMoreElements()) { + try { + URL url = resources.nextElement(); + LOGGER.debug("Found Plugin Map at {}", url.toExternalForm()); + InputStream is = url.openStream(); + BufferedInputStream bis = new BufferedInputStream(is); + DataInputStream dis = new DataInputStream(bis); + int count = dis.readInt(); + for (int j = 0; j < count; ++j) { + String type = dis.readUTF(); + int entries = dis.readInt(); + ConcurrentMap types = new ConcurrentHashMap(count); + for (int i = 0; i < entries; ++i) { + String key = dis.readUTF(); + String className = dis.readUTF(); + String name = dis.readUTF(); + boolean printable = dis.readBoolean(); + boolean defer = dis.readBoolean(); + Class clazz = Class.forName(className); + types.put(key, new PluginType(clazz, name, printable, defer)); + } + map.putIfAbsent(type, types); } - map.putIfAbsent(type, types); + dis.close(); + } catch (Exception ex) { + LOGGER.warn("Unable to preload plugins", ex); + return null; } - dis.close(); - return map; - } catch (Exception ex) { - LOGGER.warn("Unable to preload plugins", ex); - return null; } + return map.size() == 0 ? null : map; } private static void encode(ConcurrentMap> map) { String fileName = rootDir + PATH + FILENAME; try { + File file = new File(rootDir + PATH); + file.mkdirs(); FileOutputStream fos = new FileOutputStream(fileName); BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream dos = new DataOutputStream(bos); Modified: logging/log4j/log4j2/trunk/flume-ng/pom.xml URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/flume-ng/pom.xml?rev=1371545&r1=1371544&r2=1371545&view=diff ============================================================================== --- logging/log4j/log4j2/trunk/flume-ng/pom.xml (original) +++ logging/log4j/log4j2/trunk/flume-ng/pom.xml Fri Aug 10 02:14:51 2012 @@ -84,6 +84,26 @@ always + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + process-classes + + java + + + + + org.apache.logging.log4j.core.config.plugins.PluginManager + + ${project.build.outputDirectory} + org.apache.logging.log4j.flume.appender + + + Modified: logging/log4j/log4j2/trunk/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAvroAppenderTest.java URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAvroAppenderTest.java?rev=1371545&r1=1371544&r2=1371545&view=diff ============================================================================== --- logging/log4j/log4j2/trunk/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAvroAppenderTest.java (original) +++ logging/log4j/log4j2/trunk/flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAvroAppenderTest.java Fri Aug 10 02:14:51 2012 @@ -69,7 +69,6 @@ public class FlumeAvroAppenderTest { @BeforeClass public static void setupClass() { - PluginManager.addPackage("org.apache.logging.log4j.flume"); ctx = (LoggerContext) LogManager.getContext(); } Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1371545&r1=1371544&r2=1371545&view=diff ============================================================================== --- logging/log4j/log4j2/trunk/src/changes/changes.xml (original) +++ logging/log4j/log4j2/trunk/src/changes/changes.xml Fri Aug 10 02:14:51 2012 @@ -23,6 +23,10 @@ + + Allow components besides core to create a PluginMap for faster plugin loading and not + having to specify the plugin package in the configuration. + Fix compilation problems in Java 7.