Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-1651 5465f5cf3 -> 5cce8c115


Refactor reading cache files. Extract out SortedProperties class.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/5cce8c11
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/5cce8c11
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/5cce8c11

Branch: refs/heads/LOG4J2-1651
Commit: 5cce8c11560954f283a7a5a721b718104beebd31
Parents: 5465f5c
Author: Gary Gregory <[email protected]>
Authored: Sat Nov 5 19:47:30 2016 -0700
Committer: Gary Gregory <[email protected]>
Committed: Sat Nov 5 19:47:30 2016 -0700

----------------------------------------------------------------------
 .../config/plugins/processor/PluginCache.java   | 195 +++++++++++--------
 .../config/plugins/util/PluginRegistry.java     |   1 +
 .../log4j/core/util/SortedProperties.java       |  47 +++++
 3 files changed, 160 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5cce8c11/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
index 9f73fb3..912f247 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/PluginCache.java
@@ -17,6 +17,7 @@
 
 package org.apache.logging.log4j.core.config.plugins.processor;
 
+import java.beans.XMLDecoder;
 import java.beans.XMLEncoder;
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -38,9 +39,8 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
 
+import org.apache.logging.log4j.core.util.SortedProperties;
 import org.apache.logging.log4j.util.Strings;
 
 /**
@@ -48,23 +48,34 @@ import org.apache.logging.log4j.util.Strings;
  */
 public class PluginCache {
 
-    static class SortedProperties extends Properties {
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        public synchronized Enumeration<Object> keys() {
-            return Collections.enumeration(new TreeSet<>(super.keySet()));
-        }
-
-        @Override
-        public Set<String> stringPropertyNames() {
-            return new TreeSet<>(super.stringPropertyNames());
-        }
-    }
-
     public enum Format {
+
         DAT {
             @Override
+            public void loadCacheFiles(final PluginCache pluginCache, final 
URL url) throws IOException {
+                try (final DataInputStream in = new DataInputStream(new 
BufferedInputStream(url.openStream()))) {
+                    final int count = in.readInt();
+                    for (int i = 0; i < count; i++) {
+                        final String category = in.readUTF();
+                        final Map<String, PluginEntry> m = 
pluginCache.getCategory(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);
+                            if (!m.containsKey(entry.getKey())) {
+                                m.put(entry.getKey(), entry);
+                            }
+                        }
+                    }
+                }
+            }
+
+            @Override
             public void writeCache(final PluginCache pluginCache, final 
OutputStream os) throws IOException {
                 try (final DataOutputStream out = new DataOutputStream(new 
BufferedOutputStream(os))) {
                     // See PluginManager.readFromCacheFiles for the 
corresponding decoder. Format may not be changed
@@ -88,28 +99,13 @@ public class PluginCache {
             }
         },
 
-        XML {
-            @Override
-            public void writeCache(final PluginCache pluginCache, final 
OutputStream os) {
-                try (final XMLEncoder out = new XMLEncoder(os)) {
-                    out.writeObject(pluginCache.categories);
-                }
-            }
-        },
-
-        PROPERTIES_XML {
+        PROPERTIES {
             @Override
-            public String getExtension() {
-                return ".properties.xml";
-            }
+            public void loadCacheFiles(final PluginCache pluginCache, final 
URL url) throws IOException {
+                // TODO Auto-generated method stub
 
-            @Override
-            public void writeCache(final PluginCache pluginCache, final 
OutputStream os) throws IOException {
-                toProperties(pluginCache).storeToXML(os, "Log4j2 plugin cache 
file");
             }
-        },
 
-        PROPERTIES {
             @Override
             public void writeCache(final PluginCache pluginCache, final 
OutputStream os) throws IOException {
                 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -130,13 +126,43 @@ public class PluginCache {
                 }
             }
 
-        };
+        },
 
-        public String getExtension() {
-            return "." + toString().toLowerCase(Locale.ROOT);
-        }
+        PROPERTIES_XML {
+            @Override
+            public String getExtension() {
+                return ".properties.xml";
+            }
+
+            @Override
+            public void loadCacheFiles(final PluginCache pluginCache, final 
URL url) throws IOException {
+                // TODO Auto-generated method stub
+
+            }
+
+            @Override
+            public void writeCache(final PluginCache pluginCache, final 
OutputStream os) throws IOException {
+                toProperties(pluginCache).storeToXML(os, "Log4j2 plugin cache 
file");
+            }
+        },
+
+        XML {
+            @Override
+            public void loadCacheFiles(final PluginCache pluginCache, final 
URL url) throws IOException {
+                try (final XMLDecoder out = new XMLDecoder(url.openStream())) {
+                    @SuppressWarnings("unchecked")
+                    final Map<String, Map<String, PluginEntry>> object = 
(Map<String, Map<String, PluginEntry>>) out.readObject();
+                    pluginCache.getAllCategories().putAll(object);
+                }
+            }
 
-        public abstract void writeCache(PluginCache pluginCache, final 
OutputStream os) throws IOException;
+            @Override
+            public void writeCache(final PluginCache pluginCache, final 
OutputStream os) {
+                try (final XMLEncoder out = new XMLEncoder(os)) {
+                    out.writeObject(pluginCache.categories);
+                }
+            }
+        };
 
         /**
          * Parses a comma-separated list of {@code Format}s.
@@ -174,6 +200,15 @@ public class PluginCache {
             }
             return prop;
         }
+
+        public String getExtension() {
+            return "." + toString().toLowerCase(Locale.ROOT);
+        }
+
+        public abstract void loadCacheFiles(PluginCache pluginCache, URL url) 
throws IOException;
+
+        public abstract void writeCache(PluginCache pluginCache, OutputStream 
os) throws IOException;
+
     }
 
     private final Map<String, Map<String, PluginEntry>> categories = new 
LinkedHashMap<>();
@@ -203,6 +238,44 @@ public class PluginCache {
         return categories.get(key);
     }
 
+    public void loadCacheFiles(final ClassLoader classLoader) throws 
IOException {
+        categories.clear();
+        for (final Format format : Format.values()) {
+            final Enumeration<URL> resources = classLoader
+                    .getResources(PluginProcessor.PLUGIN_CACHE_FILE_BASE + 
format.getExtension());
+            while (resources.hasMoreElements()) {
+                final URL url = resources.nextElement();
+                format.loadCacheFiles(this, url);
+            }
+        }
+    }
+
+    /**
+     * 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
+     *             if an I/O exception occurs.
+     * @deprecated Use {@link #loadCacheFiles(ClassLoader)}.
+     */
+    @Deprecated
+    public void loadCacheFiles(final Enumeration<URL> resources) throws 
IOException {
+        categories.clear();
+        while (resources.hasMoreElements()) {
+            Format.DAT.loadCacheFiles(this, resources.nextElement());
+        }
+    }
+
+    /**
+     * Gets the number of plugin categories registered.
+     *
+     * @return number of plugin categories in cache.
+     */
+    public int size() {
+        return categories.size();
+    }
+
     /**
      * Stores the plugin cache to a given OutputStream.
      *
@@ -237,48 +310,4 @@ public class PluginCache {
             Format.valueOf(formatStr).writeCache(this, os);
         }
     }
-
-    /**
-     * 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
-     *             if an I/O exception occurs.
-     */
-    public void loadCacheFiles(final Enumeration<URL> resources) throws 
IOException {
-        categories.clear();
-        while (resources.hasMoreElements()) {
-            final URL url = resources.nextElement();
-            try (final DataInputStream in = new DataInputStream(new 
BufferedInputStream(url.openStream()))) {
-                final int count = in.readInt();
-                for (int i = 0; i < count; i++) {
-                    final String category = in.readUTF();
-                    final Map<String, PluginEntry> m = getCategory(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);
-                        if (!m.containsKey(entry.getKey())) {
-                            m.put(entry.getKey(), entry);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Gets the number of plugin categories registered.
-     *
-     * @return number of plugin categories in cache.
-     */
-    public int size() {
-        return categories.size();
-    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5cce8c11/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
index a657f1a..71b841f 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginRegistry.java
@@ -164,6 +164,7 @@ public class PluginRegistry {
                 LOGGER.info("Plugin preloads not available from class loader 
{}", loader);
             } else {
                 cache.loadCacheFiles(resources);
+                cache.loadCacheFiles(loader);
             }
         } catch (final IOException ioe) {
             LOGGER.warn("Unable to preload plugins", ioe);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5cce8c11/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SortedProperties.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SortedProperties.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SortedProperties.java
new file mode 100644
index 0000000..156e41e
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/SortedProperties.java
@@ -0,0 +1,47 @@
+/*
+ * 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.util;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * Extends the JRE's {@link Properties} class with sorted keys.
+ */
+public class SortedProperties extends Properties {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public synchronized Enumeration<Object> keys() {
+        return Collections.enumeration(new TreeSet<>(super.keySet()));
+    }
+
+    @Override
+    public Enumeration<?> propertyNames() {
+        // TODO Auto-generated method stub
+        return super.propertyNames();
+    }
+
+    @Override
+    public Set<String> stringPropertyNames() {
+        return new TreeSet<>(super.stringPropertyNames());
+    }
+}
\ No newline at end of file

Reply via email to