Repository: logging-log4j2
Updated Branches:
  refs/heads/master 337941cc7 -> 9ff9be2e4


LOG4J2-1296 Simplified implementation of ReusableParameterizedMessage: no need 
to manage state in a ThreadLocal since ReusableMessageFactory will manage 
instances of this class in a ThreadLocal already


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

Branch: refs/heads/master
Commit: 9ff9be2e46651f1bfdd83ab04bfd9543141d9cea
Parents: 337941c
Author: rpopma <[email protected]>
Authored: Tue Mar 8 20:34:14 2016 +1100
Committer: rpopma <[email protected]>
Committed: Tue Mar 8 20:34:14 2016 +1100

----------------------------------------------------------------------
 .../message/ReusableParameterizedMessage.java   | 231 ++++++++-----------
 1 file changed, 102 insertions(+), 129 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ff9be2e/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
index 6ed4cb9..7d2b1d5 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
@@ -21,7 +21,9 @@ import java.util.Arrays;
 import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
- * Reusable parameterized message.
+ * Reusable parameterized message. This message is mutable and is not safe to 
be accessed or modified by multiple
+ * threads concurrently.
+ *
  * @see ParameterizedMessage
  * @since 2.6
  */
@@ -30,186 +32,160 @@ public class ReusableParameterizedMessage implements 
ReusableMessage {
 
     private static final long serialVersionUID = 7800075879295123856L;
 
-    static class InternalState {
-        private final StringBuilder buffer = new StringBuilder(2048);
-        private String messagePattern;
-        private int argCount;
-        private transient Object[] varargs;
-        private transient Object[] params = new Object[10];
-        private transient Throwable throwable;
-
-        private Object[] getTrimmedParams() {
-            return varargs == null ? Arrays.copyOf(params, argCount) : varargs;
-        }
-
-        private Object[] getParams() {
-            return varargs == null ? params : varargs;
-        }
+    private final StringBuilder buffer = new StringBuilder(2048);
+    private String messagePattern;
+    private int argCount;
+    private transient Object[] varargs;
+    private transient Object[] params = new Object[10];
+    private transient Throwable throwable;
 
-        private void init(String messagePattern, int argCount, Object[] 
paramArray) {
-            this.varargs = null;
-            this.buffer.setLength(0);
+    /**
+     * Creates a reusable message.
+     */
+    public ReusableParameterizedMessage() {
+    }
 
-            this.messagePattern = messagePattern;
-            this.argCount= argCount;
-            //this.formattedMessage = null;
-            int usedCount = 
ParameterFormatter.countArgumentPlaceholders(messagePattern);
-            initThrowable(paramArray, usedCount);
-        }
+    private Object[] getTrimmedParams() {
+        return varargs == null ? Arrays.copyOf(params, argCount) : varargs;
+    }
 
-        private void initThrowable(final Object[] params, final int 
usedParams) {
-            if (usedParams < argCount && this.throwable == null && 
params[argCount - 1] instanceof Throwable) {
-                this.throwable = (Throwable) params[argCount - 1];
-                argCount--;
-            }
-        }
+    private Object[] getParams() {
+        return varargs == null ? params : varargs;
     }
 
-    // storing non-JDK classes in ThreadLocals causes memory leaks in web 
apps, do not use in web apps!
-    private static ThreadLocal<InternalState> state = new ThreadLocal<>();
+    private void init(String messagePattern, int argCount, Object[] 
paramArray) {
+        this.varargs = null;
+        this.buffer.setLength(0);
 
-    /**
-     * Creates a reusable message.
-     */
-    public ReusableParameterizedMessage() {
+        this.messagePattern = messagePattern;
+        this.argCount= argCount;
+        int usedCount = 
ParameterFormatter.countArgumentPlaceholders(messagePattern);
+        initThrowable(paramArray, usedCount);
     }
 
-    private InternalState getState() {
-        InternalState result = state.get();
-        if (result == null) {
-            result = new InternalState();
-            state.set(result);
+    private void initThrowable(final Object[] params, final int usedParams) {
+        if (usedParams < argCount && this.throwable == null && params[argCount 
- 1] instanceof Throwable) {
+            this.throwable = (Throwable) params[argCount - 1];
+            argCount--;
         }
-        return result;
     }
 
     public StringBuilder get() {
-        return getState().buffer;
+        return buffer;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object... 
arguments) {
-        InternalState state = getState();
-        state.init(messagePattern, arguments == null ? 0 : arguments.length, 
arguments);
-        state.varargs = arguments;
+        init(messagePattern, arguments == null ? 0 : arguments.length, 
arguments);
+        varargs = arguments;
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.init(messagePattern, 1, state.params);
+        params[0] = p0;
+        init(messagePattern, 1, params);
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0, Object 
p1) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.params[1] = p1;
-        state.init(messagePattern, 2, state.params);
+        params[0] = p0;
+        params[1] = p1;
+        init(messagePattern, 2, params);
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0, Object 
p1, Object p2) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.params[1] = p1;
-        state.params[2] = p2;
-        state.init(messagePattern, 3, state.params);
+        params[0] = p0;
+        params[1] = p1;
+        params[2] = p2;
+        init(messagePattern, 3, params);
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0, Object 
p1, Object p2, Object p3) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.params[1] = p1;
-        state.params[2] = p2;
-        state.params[3] = p3;
-        state.init(messagePattern, 4, state.params);
+        params[0] = p0;
+        params[1] = p1;
+        params[2] = p2;
+        params[3] = p3;
+        init(messagePattern, 4, params);
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0, Object 
p1, Object p2, Object p3, Object p4) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.params[1] = p1;
-        state.params[2] = p2;
-        state.params[3] = p3;
-        state.params[4] = p4;
-        state.init(messagePattern, 5, state.params);
+        params[0] = p0;
+        params[1] = p1;
+        params[2] = p2;
+        params[3] = p3;
+        params[4] = p4;
+        init(messagePattern, 5, params);
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0, Object 
p1, Object p2, Object p3, Object p4, Object p5) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.params[1] = p1;
-        state.params[2] = p2;
-        state.params[3] = p3;
-        state.params[4] = p4;
-        state.params[5] = p5;
-        state.init(messagePattern, 6, state.params);
+        params[0] = p0;
+        params[1] = p1;
+        params[2] = p2;
+        params[3] = p3;
+        params[4] = p4;
+        params[5] = p5;
+        init(messagePattern, 6, params);
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0, Object 
p1, Object p2, Object p3, Object p4, Object p5,
             Object p6) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.params[1] = p1;
-        state.params[2] = p2;
-        state.params[3] = p3;
-        state.params[4] = p4;
-        state.params[5] = p5;
-        state.params[6] = p6;
-        state.init(messagePattern, 7, state.params);
+        params[0] = p0;
+        params[1] = p1;
+        params[2] = p2;
+        params[3] = p3;
+        params[4] = p4;
+        params[5] = p5;
+        params[6] = p6;
+        init(messagePattern, 7, params);
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0, Object 
p1, Object p2, Object p3, Object p4, Object p5,
             Object p6, Object p7) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.params[1] = p1;
-        state.params[2] = p2;
-        state.params[3] = p3;
-        state.params[4] = p4;
-        state.params[5] = p5;
-        state.params[6] = p6;
-        state.params[7] = p7;
-        state.init(messagePattern, 8, state.params);
+        params[0] = p0;
+        params[1] = p1;
+        params[2] = p2;
+        params[3] = p3;
+        params[4] = p4;
+        params[5] = p5;
+        params[6] = p6;
+        params[7] = p7;
+        init(messagePattern, 8, params);
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0, Object 
p1, Object p2, Object p3, Object p4, Object p5,
             Object p6, Object p7, Object p8) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.params[1] = p1;
-        state.params[2] = p2;
-        state.params[3] = p3;
-        state.params[4] = p4;
-        state.params[5] = p5;
-        state.params[6] = p6;
-        state.params[7] = p7;
-        state.params[8] = p8;
-        state.init(messagePattern, 9, state.params);
+        params[0] = p0;
+        params[1] = p1;
+        params[2] = p2;
+        params[3] = p3;
+        params[4] = p4;
+        params[5] = p5;
+        params[6] = p6;
+        params[7] = p7;
+        params[8] = p8;
+        init(messagePattern, 9, params);
         return this;
     }
 
     ReusableParameterizedMessage set(String messagePattern, Object p0, Object 
p1, Object p2, Object p3, Object p4, Object p5,
             Object p6, Object p7, Object p8, Object p9) {
-        InternalState state = getState();
-        state.params[0] = p0;
-        state.params[1] = p1;
-        state.params[2] = p2;
-        state.params[3] = p3;
-        state.params[4] = p4;
-        state.params[5] = p5;
-        state.params[6] = p6;
-        state.params[7] = p7;
-        state.params[8] = p8;
-        state.params[9] = p9;
-        state.init(messagePattern, 10, state.params);
+        params[0] = p0;
+        params[1] = p1;
+        params[2] = p2;
+        params[3] = p3;
+        params[4] = p4;
+        params[5] = p5;
+        params[6] = p6;
+        params[7] = p7;
+        params[8] = p8;
+        params[9] = p9;
+        init(messagePattern, 10, params);
         return this;
     }
 
@@ -219,7 +195,7 @@ public class ReusableParameterizedMessage implements 
ReusableMessage {
      */
     @Override
     public String getFormat() {
-        return getState().messagePattern;
+        return messagePattern;
     }
 
     /**
@@ -228,7 +204,7 @@ public class ReusableParameterizedMessage implements 
ReusableMessage {
      */
     @Override
     public Object[] getParameters() {
-        return getState().getTrimmedParams();
+        return getTrimmedParams();
     }
 
     /**
@@ -242,7 +218,7 @@ public class ReusableParameterizedMessage implements 
ReusableMessage {
      */
     @Override
     public Throwable getThrowable() {
-        return getState().throwable;
+        return throwable;
     }
 
     /**
@@ -251,16 +227,13 @@ public class ReusableParameterizedMessage implements 
ReusableMessage {
      */
     @Override
     public String getFormattedMessage() {
-        final InternalState state = getState();
-        final StringBuilder buffer = state.buffer;
         formatTo(buffer);
         return buffer.toString();
     }
 
     @Override
     public void formatTo(final StringBuilder buffer) {
-        InternalState state = getState();
-        ParameterFormatter.formatMessage(buffer, state.messagePattern, 
state.getParams(), state.argCount);
+        ParameterFormatter.formatMessage(buffer, messagePattern, getParams(), 
argCount);
     }
 
 

Reply via email to