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 2014/04/08 00:06:30 UTC

svn commit: r1585603 - in /logging/log4j/log4j2/trunk/log4j-plugin-processor/src: main/java/org/apache/logging/log4j/core/config/plugins/processor/ test/java/org/apache/logging/log4j/core/config/plugins/processor/

Author: mattsicker
Date: Mon Apr  7 22:06:29 2014
New Revision: 1585603

URL: http://svn.apache.org/r1585603
Log:
Refactor plugin cache to its own class.

Added:
    logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java   (with props)
Modified:
    logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
    logging/log4j/log4j2/trunk/log4j-plugin-processor/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java

Added: logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java?rev=1585603&view=auto
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java (added)
+++ logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java Mon Apr  7 22:06:29 2014
@@ -0,0 +1,122 @@
+/*
+ * 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.processor;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ *
+ */
+public class PluginCache {
+    private final ConcurrentMap<String, ConcurrentMap<String, PluginEntry>> pluginCategories =
+            new ConcurrentHashMap<String, ConcurrentMap<String, PluginEntry>>();
+
+    /**
+     * Gets or creates a category of plugins.
+     *
+     * @param category name of category to look up.
+     * @return plugin mapping of names to plugin entries.
+     */
+    public ConcurrentMap<String, PluginEntry> getCategory(final String category) {
+        pluginCategories.putIfAbsent(category, new ConcurrentHashMap<String, PluginEntry>());
+        return pluginCategories.get(category);
+    }
+
+    /**
+     * Stores the plugin cache to a given OutputStream.
+     *
+     * @param os destination to save cache to.
+     * @throws IOException
+     */
+    public void writeCache(final OutputStream os) throws IOException {
+        final DataOutputStream out = new DataOutputStream(new BufferedOutputStream(os));
+        try {
+            out.writeInt(pluginCategories.size());
+            for (final Map.Entry<String, ConcurrentMap<String, PluginEntry>> category : pluginCategories.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());
+                }
+            }
+        } finally {
+            out.close();
+        }
+    }
+
+    /**
+     * 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.
+     * @throws IOException
+     */
+    public void loadCacheFiles(final Enumeration<URL> resources) throws IOException {
+        pluginCategories.clear();
+        while (resources.hasMoreElements()) {
+            final URL url = resources.nextElement();
+            final DataInputStream in = new DataInputStream(new BufferedInputStream(url.openStream()));
+            try {
+                final int count = in.readInt();
+                for (int i = 0; i < count; i++) {
+                    final String category = in.readUTF();
+                    pluginCategories.putIfAbsent(category, new ConcurrentHashMap<String, PluginEntry>());
+                    final ConcurrentMap<String, PluginEntry> m = pluginCategories.get(category);
+                    final int entries = in.readInt();
+                    for (int j = 0; j < entries; j++) {
+                        final PluginEntry entry = new PluginEntry();
+                        entry.setKey(in.readUTF());
+                        entry.setClassName(in.readUTF());
+                        entry.setName(in.readUTF());
+                        entry.setPrintable(in.readBoolean());
+                        entry.setDefer(in.readBoolean());
+                        entry.setCategory(category);
+                        m.putIfAbsent(entry.getKey(), entry);
+                    }
+                    pluginCategories.putIfAbsent(category, m);
+                }
+            } finally {
+                in.close();
+            }
+        }
+    }
+
+    /**
+     * Gets the number of plugin categories registered.
+     *
+     * @return number of plugin categories in cache.
+     */
+    public int size() {
+        return pluginCategories.size();
+    }
+}

Propchange: logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java?rev=1585603&r1=1585602&r2=1585603&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java (original)
+++ logging/log4j/log4j2/trunk/log4j-plugin-processor/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor.java Mon Apr  7 22:06:29 2014
@@ -17,15 +17,12 @@
 
 package org.apache.logging.log4j.core.config.plugins.processor;
 
-import java.io.BufferedOutputStream;
-import java.io.DataOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import javax.annotation.processing.AbstractProcessor;
 import javax.annotation.processing.RoundEnvironment;
@@ -61,8 +58,7 @@ public class PluginProcessor extends Abs
      */
     public static final String FILENAME = "Log4j2Plugins.dat";
 
-    private final ConcurrentMap<String, ConcurrentMap<String, PluginEntry>> pluginCategories =
-            new ConcurrentHashMap<String, ConcurrentMap<String, PluginEntry>>();
+    private final PluginCache pluginCache = new PluginCache();
 
     @Override
     public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
@@ -93,8 +89,7 @@ public class PluginProcessor extends Abs
         for (final Element element : elements) {
             final Plugin plugin = element.getAnnotation(Plugin.class);
             final PluginEntry entry = element.accept(pluginVisitor, plugin);
-            pluginCategories.putIfAbsent(entry.getCategory(), new ConcurrentHashMap<String, PluginEntry>());
-            final ConcurrentMap<String, PluginEntry> category = pluginCategories.get(entry.getCategory());
+            final ConcurrentMap<String, PluginEntry> category = pluginCache.getCategory(entry.getCategory());
             category.put(entry.getKey(), entry);
             final Collection<PluginEntry> entries = element.accept(pluginAliasesVisitor, plugin);
             for (final PluginEntry pluginEntry : entries) {
@@ -105,22 +100,9 @@ public class PluginProcessor extends Abs
 
     private void writeCacheFile(final Element... elements) throws IOException {
         final FileObject fo = processingEnv.getFiler().createResource(CLASS_OUTPUT, PLUGINS_PACKAGE_NAME, FILENAME, elements);
-        final DataOutputStream out = new DataOutputStream(new BufferedOutputStream(fo.openOutputStream()));
+        final OutputStream out = fo.openOutputStream();
         try {
-            out.writeInt(pluginCategories.size());
-            for (final Map.Entry<String, ConcurrentMap<String, PluginEntry>> category : pluginCategories.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());
-                }
-            }
+            pluginCache.writeCache(out);
         } finally {
             out.close();
         }

Modified: logging/log4j/log4j2/trunk/log4j-plugin-processor/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-plugin-processor/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java?rev=1585603&r1=1585602&r2=1585603&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-plugin-processor/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java (original)
+++ logging/log4j/log4j2/trunk/log4j-plugin-processor/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/PluginProcessorTest.java Mon Apr  7 22:06:29 2014
@@ -17,11 +17,8 @@
 
 package org.apache.logging.log4j.core.config.plugins.processor;
 
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
 import java.net.URL;
 import java.util.Enumeration;
-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.PluginAliases;
@@ -30,63 +27,35 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.*;
 
 @RunWith(JUnit4.class)
 public class PluginProcessorTest {
 
     private static final String CACHE_FILE = "org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat";
 
-    private static ConcurrentMap<String, ConcurrentMap<String, PluginEntry>> pluginCategories;
+    private static final PluginCache pluginCache = new PluginCache();
 
     private final Plugin p = FakePlugin.class.getAnnotation(Plugin.class);
 
     @BeforeClass
     public static void setUpClass() throws Exception {
-        // TODO: refactor PluginManager.decode() into this module?
-        pluginCategories = new ConcurrentHashMap<String, ConcurrentMap<String, PluginEntry>>();
         final Enumeration<URL> resources = PluginProcessor.class.getClassLoader().getResources(CACHE_FILE);
-        while (resources.hasMoreElements()) {
-            final URL url = resources.nextElement();
-            final DataInputStream in = new DataInputStream(new BufferedInputStream(url.openStream()));
-            try {
-                final int count = in.readInt();
-                for (int i = 0; i < count; i++) {
-                    final String category = in.readUTF();
-                    pluginCategories.putIfAbsent(category, new ConcurrentHashMap<String, PluginEntry>());
-                    final ConcurrentMap<String, PluginEntry> m = pluginCategories.get(category);
-                    final int entries = in.readInt();
-                    for (int j = 0; j < entries; j++) {
-                        final PluginEntry entry = new PluginEntry();
-                        entry.setKey(in.readUTF());
-                        entry.setClassName(in.readUTF());
-                        entry.setName(in.readUTF());
-                        entry.setPrintable(in.readBoolean());
-                        entry.setDefer(in.readBoolean());
-                        entry.setCategory(category);
-                        m.putIfAbsent(entry.getKey(), entry);
-                    }
-                    pluginCategories.putIfAbsent(category, m);
-                }
-            } finally {
-                in.close();
-            }
-        }
+        pluginCache.loadCacheFiles(resources);
     }
 
     @Test
     public void testTestCategoryFound() throws Exception {
         assertNotNull("No plugin annotation on FakePlugin.", p);
-        final ConcurrentMap<String, PluginEntry> testCategory = pluginCategories.get(p.category());
-        assertNotEquals("No plugins were found.", 0, pluginCategories.size());
+        final ConcurrentMap<String, PluginEntry> testCategory = pluginCache.getCategory(p.category());
+        assertNotEquals("No plugins were found.", 0, pluginCache.size());
         assertNotNull("The category '" + p.category() + "' was not found.", testCategory);
+        assertFalse(testCategory.isEmpty());
     }
 
     @Test
     public void testFakePluginFoundWithCorrectInformation() throws Exception {
-        final PluginEntry fake = pluginCategories.get(p.category()).get(p.name().toLowerCase());
+        final PluginEntry fake = pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
         verifyFakePluginEntry(p.name(), fake);
     }
 
@@ -94,7 +63,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 = pluginCategories.get(p.category()).get(alias.toLowerCase());
+            final PluginEntry fake = pluginCache.getCategory(p.category()).get(alias.toLowerCase());
             verifyFakePluginEntry(alias, fake);
         }
     }
@@ -112,7 +81,7 @@ public class PluginProcessorTest {
     @Test
     public void testNestedPlugin() throws Exception {
         final Plugin p = FakePlugin.Nested.class.getAnnotation(Plugin.class);
-        final PluginEntry nested = pluginCategories.get(p.category()).get(p.name().toLowerCase());
+        final PluginEntry nested = pluginCache.getCategory(p.category()).get(p.name().toLowerCase());
         assertNotNull(nested);
         assertEquals(p.name().toLowerCase(), nested.getKey());
         assertEquals(FakePlugin.Nested.class.getName(), nested.getClassName());