LOG4J2-1858 create trimToMaxSize utility method in StringBuilders, with test


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

Branch: refs/heads/master
Commit: f1b71ea775e04731f3a03c2657474fcda205987a
Parents: 11fb367
Author: rpopma <rpo...@apache.org>
Authored: Sun Apr 16 16:49:04 2017 +0900
Committer: rpopma <rpo...@apache.org>
Committed: Sun Apr 16 16:49:04 2017 +0900

----------------------------------------------------------------------
 .../logging/log4j/util/StringBuilders.java      | 14 ++++++++
 .../logging/log4j/util/StringBuildersTest.java  | 37 ++++++++++++++++++++
 2 files changed, 51 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f1b71ea7/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
index a67bfb2..23d7b65 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
@@ -143,4 +143,18 @@ public final class StringBuilders {
         }
         return false;
     }
+
+    /**
+     * Ensures that the char[] array of the specified StringBuilder does not 
exceed the specified number of characters.
+     * This method is useful to ensure that excessively long char[] arrays are 
not kept in memory forever.
+     *
+     * @param stringBuilder the StringBuilder to check
+     * @param maxSize the maximum number of characters the StringBuilder is 
allowed to have
+     */
+    public static void trimToMaxSize(final StringBuilder stringBuilder, final 
int maxSize) {
+        if (stringBuilder != null && stringBuilder.length() > maxSize) {
+            stringBuilder.setLength(maxSize);
+            stringBuilder.trimToSize();
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f1b71ea7/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java 
b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java
new file mode 100644
index 0000000..061cb8c
--- /dev/null
+++ 
b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java
@@ -0,0 +1,37 @@
+/*
+ * 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.util;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests the StringBuilders class.
+ */
+public class StringBuildersTest {
+    @Test
+    public void trimToMaxSize() throws Exception {
+        StringBuilder sb = new StringBuilder();
+        char[] value = new char[4 * 1024];
+        sb.append(value);
+
+        assertTrue("needs trimming", sb.length() > 
Constants.MAX_REUSABLE_MESSAGE_SIZE);
+        StringBuilders.trimToMaxSize(sb, Constants.MAX_REUSABLE_MESSAGE_SIZE);
+        assertTrue("trimmed OK", sb.length() <= 
Constants.MAX_REUSABLE_MESSAGE_SIZE);
+    }
+}
\ No newline at end of file

Reply via email to