Repository: logging-log4j2
Updated Branches:
  refs/heads/master 69e7981c5 -> 9ca35761c


LOG4J2-1671 make EqualsIgnoreCaseReplacementConverter garbage-free


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

Branch: refs/heads/master
Commit: 9ca35761c2f83f54278a88a881415f9a3ed56187
Parents: 69e7981
Author: rpopma <rpo...@apache.org>
Authored: Sun Nov 6 23:07:48 2016 +0900
Committer: rpopma <rpo...@apache.org>
Committed: Sun Nov 6 23:07:48 2016 +0900

----------------------------------------------------------------------
 .../pattern/EqualsBaseReplacementConverter.java | 97 ++++++++++++++++++++
 .../EqualsIgnoreCaseReplacementConverter.java   | 49 ++++------
 .../pattern/EqualsReplacementConverter.java     | 53 +----------
 3 files changed, 119 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ca35761/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
new file mode 100644
index 0000000..61cb266
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
@@ -0,0 +1,97 @@
+/*
+ * 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.pattern;
+
+import java.util.List;
+
+import org.apache.logging.log4j.core.LogEvent;
+
+/**
+ * Equals pattern converter.
+ */
+public abstract class EqualsBaseReplacementConverter extends 
LogEventPatternConverter {
+    private final List<PatternFormatter> formatters;
+    private final List<PatternFormatter> substitutionFormatters;
+    private final String substitution;
+    private final String testString;
+
+    /**
+     * Construct the converter.
+     *
+     * @param name          converter name
+     * @param style         converter style
+     * @param formatters   The PatternFormatters to generate the text to 
manipulate.
+     * @param testString   The test string.
+     * @param substitution The substitution string.
+     * @param parser        The PatternParser.
+     */
+    protected EqualsBaseReplacementConverter(final String name, final String 
style,
+                                            final List<PatternFormatter> 
formatters, final String testString,
+                                            final String substitution, final 
PatternParser parser) {
+        super(name, style);
+        this.testString = testString;
+        this.substitution = substitution;
+        this.formatters = formatters;
+
+        // check if substitution needs to be parsed
+        substitutionFormatters = substitution.contains("%") ? 
parser.parse(substitution) : null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void format(final LogEvent event, final StringBuilder toAppendTo) {
+        final int initialSize = toAppendTo.length();
+        for (int i = 0; i < formatters.size(); i++) {
+            final PatternFormatter formatter = formatters.get(i);
+            formatter.format(event, toAppendTo);
+        }
+        if (equals(testString, toAppendTo, initialSize, toAppendTo.length() - 
initialSize)) {
+            toAppendTo.setLength(initialSize);
+            parseSubstitution(event, toAppendTo);
+        }
+    }
+
+    /**
+     * Returns true if the specified String equals the specified section of 
the specified StringBuilder.
+     *
+     * @param str the String to compare
+     * @param buff the StringBuilder to compare a section of
+     * @param from start index in the StringBuilder
+     * @param len length of the section in the StringBuilder
+     * @return true if equal, false otherwise
+     */
+    protected abstract boolean equals(String str, StringBuilder buff, int 
from, int len);
+
+    /**
+     * Adds the parsed substitution text to the specified buffer.
+     *
+     * @param event the current log event
+     * @param substitutionBuffer the StringBuilder to append the parsed 
substitution text to
+     */
+    void parseSubstitution(final LogEvent event, final StringBuilder 
substitutionBuffer) {
+        if (substitutionFormatters != null) {
+            for (int i = 0; i < substitutionFormatters.size(); i++) {
+                final PatternFormatter formatter = 
substitutionFormatters.get(i);
+                formatter.format(event, substitutionBuffer);
+            }
+        } else {
+            substitutionBuffer.append(substitution);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ca35761/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
index 1265108..6f46c03 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.core.pattern;
 
 import java.util.List;
 
-import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
@@ -28,7 +27,7 @@ import org.apache.logging.log4j.core.layout.PatternLayout;
  */
 @Plugin(name = "equalsIgnoreCase", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "equalsIgnoreCase" })
-public final class EqualsIgnoreCaseReplacementConverter extends 
LogEventPatternConverter {
+public final class EqualsIgnoreCaseReplacementConverter extends 
EqualsBaseReplacementConverter {
 
     /**
      * Gets an instance of the class.
@@ -59,43 +58,31 @@ public final class EqualsIgnoreCaseReplacementConverter 
extends LogEventPatternC
         final String p = options[1];
         final PatternParser parser = PatternLayout.createPatternParser(config);
         final List<PatternFormatter> formatters = parser.parse(options[0]);
-        return new EqualsIgnoreCaseReplacementConverter(formatters, p, 
options[2]);
+        return new EqualsIgnoreCaseReplacementConverter(formatters, p, 
options[2], parser);
     }
 
-    private final List<PatternFormatter> formatters;
-
-    private final String substitution;
-
-    private final String testString;
-
     /**
      * Construct the converter.
-     * 
-     * @param formatters
-     *            The PatternFormatters to generate the text to manipulate.
-     * @param testString
-     *            The test string.
-     * @param substitution
-     *            The substitution string.
+     *
+     * @param formatters   The PatternFormatters to generate the text to 
manipulate.
+     * @param testString   The test string.
+     * @param substitution The substitution string.
+     * @param parser        The PatternParser.
      */
     private EqualsIgnoreCaseReplacementConverter(final List<PatternFormatter> 
formatters, final String testString,
-            final String substitution) {
-        super("equals", "equals");
-        this.testString = testString;
-        this.substitution = substitution;
-        this.formatters = formatters;
+            final String substitution, final PatternParser parser) {
+        super("equalsIgnoreCase", "equalsIgnoreCase", formatters, testString, 
substitution, parser);
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void format(final LogEvent event, final StringBuilder toAppendTo) {
-        final StringBuilder buf = new StringBuilder();
-        for (final PatternFormatter formatter : formatters) {
-            formatter.format(event, buf);
+    protected boolean equals(String str, StringBuilder buff, int from, int 
len) {
+        if (str.length() == len) {
+            for (int i = 0; i < len; i++) {
+                if (Character.toLowerCase(str.charAt(i)) != 
Character.toLowerCase(buff.charAt(i + from))) {
+                    return false;
+                }
+            }
+            return true;
         }
-        final String string = buf.toString();
-        toAppendTo.append(testString.equalsIgnoreCase(string) ? substitution : 
string);
+        return false;
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ca35761/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
index 7b50d25..4ccb0c5 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.core.pattern;
 
 import java.util.List;
 
-import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
@@ -28,7 +27,7 @@ import org.apache.logging.log4j.core.layout.PatternLayout;
  */
 @Plugin(name = "equals", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "equals" })
-public final class EqualsReplacementConverter extends LogEventPatternConverter 
{
+public final class EqualsReplacementConverter extends 
EqualsBaseReplacementConverter {
 
     /**
      * Gets an instance of the class.
@@ -60,47 +59,20 @@ public final class EqualsReplacementConverter extends 
LogEventPatternConverter {
         return new EqualsReplacementConverter(formatters, p, options[2], 
parser);
     }
 
-    private final List<PatternFormatter> formatters;
-    private final List<PatternFormatter> substitutionFormatters;
-    private final String substitution;
-    private final String testString;
-
     /**
      * Construct the converter.
      *
      * @param formatters   The PatternFormatters to generate the text to 
manipulate.
      * @param testString   The test string.
      * @param substitution The substitution string.
-     * @param parser       The PatternParser.
+     * @param parser        The PatternParser.
      */
     private EqualsReplacementConverter(final List<PatternFormatter> 
formatters, final String testString,
                                        final String substitution, final 
PatternParser parser) {
-        super("equals", "equals");
-        this.testString = testString;
-        this.substitution = substitution;
-        this.formatters = formatters;
-
-        // check if substitution needs to be parsed
-        substitutionFormatters = substitution.contains("%") ? 
parser.parse(substitution) : null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void format(final LogEvent event, final StringBuilder toAppendTo) {
-        final int initialSize = toAppendTo.length();
-        for (int i = 0; i < formatters.size(); i++) {
-            final PatternFormatter formatter = formatters.get(i);
-            formatter.format(event, toAppendTo);
-        }
-        if (equals(testString, toAppendTo, initialSize, toAppendTo.length() - 
initialSize)) {
-            toAppendTo.setLength(initialSize);
-            parseSubstitution(event, toAppendTo);
-        }
+        super("equals", "equals", formatters, testString, substitution, 
parser);
     }
 
-    private static boolean equals(String str, StringBuilder buff, int from, 
int len) {
+    protected boolean equals(String str, StringBuilder buff, int from, int 
len) {
         if (str.length() == len) {
             for (int i = 0; i < len; i++) {
                 if (str.charAt(i) != buff.charAt(i + from)) {
@@ -111,21 +83,4 @@ public final class EqualsReplacementConverter extends 
LogEventPatternConverter {
         }
         return false;
     }
-
-    /**
-     * Adds the parsed substitution text to the specified buffer.
-     *
-     * @param event the current log event
-     * @param substitutionBuffer the StringBuilder to append the parsed 
substitution text to
-     */
-    void parseSubstitution(final LogEvent event, final StringBuilder 
substitutionBuffer) {
-        if (substitutionFormatters != null) {
-            for (int i = 0; i < substitutionFormatters.size(); i++) {
-                final PatternFormatter formatter = 
substitutionFormatters.get(i);
-                formatter.format(event, substitutionBuffer);
-            }
-        } else {
-            substitutionBuffer.append(substitution);
-        }
-    }
 }

Reply via email to