瀏覽代碼

fix #2791 Updated byte display in log messages for detailed size representation with decimal precision

Shinsuke Sugaya 1 年之前
父節點
當前提交
129418d44c

+ 33 - 4
src/main/java/org/codelibs/fess/util/MemoryUtil.java

@@ -15,14 +15,21 @@
  */
 package org.codelibs.fess.util;
 
+import static org.apache.commons.io.FileUtils.ONE_EB_BI;
+import static org.apache.commons.io.FileUtils.ONE_GB_BI;
+import static org.apache.commons.io.FileUtils.ONE_KB_BI;
+import static org.apache.commons.io.FileUtils.ONE_MB_BI;
+import static org.apache.commons.io.FileUtils.ONE_PB_BI;
+import static org.apache.commons.io.FileUtils.ONE_TB_BI;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.time.LocalDateTime;
 import java.time.ZonedDateTime;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Map;
-
-import org.apache.commons.io.FileUtils;
-import org.codelibs.core.lang.StringUtil;
+import java.util.Objects;
 
 public final class MemoryUtil {
     private MemoryUtil() {
@@ -39,7 +46,29 @@ public final class MemoryUtil {
     }
 
     public static String byteCountToDisplaySize(final long size) {
-        return FileUtils.byteCountToDisplaySize(size).replace(" ", StringUtil.EMPTY);
+        return byteCountToDisplaySize(BigInteger.valueOf(size));
+    }
+
+    private static String byteCountToDisplaySize(final BigInteger size) {
+        Objects.requireNonNull(size, "size");
+        final String displaySize;
+
+        if (size.divide(ONE_EB_BI).compareTo(BigInteger.ZERO) > 0) {
+            displaySize = new BigDecimal(size.divide(ONE_PB_BI)).divide(BigDecimal.valueOf(1000)) + "EB";
+        } else if (size.divide(ONE_PB_BI).compareTo(BigInteger.ZERO) > 0) {
+            displaySize = new BigDecimal(size.divide(ONE_TB_BI)).divide(BigDecimal.valueOf(1000)) + "PB";
+        } else if (size.divide(ONE_TB_BI).compareTo(BigInteger.ZERO) > 0) {
+            displaySize = new BigDecimal(size.divide(ONE_GB_BI)).divide(BigDecimal.valueOf(1000)) + "TB";
+        } else if (size.divide(ONE_GB_BI).compareTo(BigInteger.ZERO) > 0) {
+            displaySize = new BigDecimal(size.divide(ONE_MB_BI)).divide(BigDecimal.valueOf(1000)) + "GB";
+        } else if (size.divide(ONE_MB_BI).compareTo(BigInteger.ZERO) > 0) {
+            displaySize = new BigDecimal(size.divide(ONE_KB_BI)).divide(BigDecimal.valueOf(1000)) + "MB";
+        } else if (size.divide(ONE_KB_BI).compareTo(BigInteger.ZERO) > 0) {
+            displaySize = new BigDecimal(size).divide(BigDecimal.valueOf(1000)) + "KB";
+        } else {
+            displaySize = size + "bytes";
+        }
+        return displaySize;
     }
 
     public static long getUsedMemory() {

+ 23 - 0
src/test/java/org/codelibs/fess/util/MemoryUtilTest.java

@@ -19,6 +19,7 @@ import java.time.LocalDateTime;
 import java.time.ZonedDateTime;
 import java.util.Date;
 
+import org.apache.commons.io.FileUtils;
 import org.codelibs.core.collection.Maps;
 import org.codelibs.fess.unit.UnitFessTestCase;
 import org.codelibs.sai.internal.ir.debug.ObjectSizeCalculator;
@@ -27,6 +28,28 @@ import com.google.common.collect.Lists;
 
 public class MemoryUtilTest extends UnitFessTestCase {
 
+    public void test_byteCountToDisplaySize() {
+        assertEquals("0bytes", MemoryUtil.byteCountToDisplaySize(0L));
+        assertEquals("999bytes", MemoryUtil.byteCountToDisplaySize(999L));
+        assertEquals("1000bytes", MemoryUtil.byteCountToDisplaySize(1000L));
+        assertEquals("1.024KB", MemoryUtil.byteCountToDisplaySize(FileUtils.ONE_KB));
+        assertEquals("999.999KB", MemoryUtil.byteCountToDisplaySize(999_999L));
+        assertEquals("1000KB", MemoryUtil.byteCountToDisplaySize(1000_000L));
+        assertEquals("1.024MB", MemoryUtil.byteCountToDisplaySize(FileUtils.ONE_MB));
+        assertEquals("976.562MB", MemoryUtil.byteCountToDisplaySize(999_999_999L));
+        assertEquals("976.562MB", MemoryUtil.byteCountToDisplaySize(1000_000_000L));
+        assertEquals("1.024GB", MemoryUtil.byteCountToDisplaySize(FileUtils.ONE_GB));
+        assertEquals("953.674GB", MemoryUtil.byteCountToDisplaySize(999_999_999_999L));
+        assertEquals("953.674GB", MemoryUtil.byteCountToDisplaySize(1000_000_000_000L));
+        assertEquals("1.024TB", MemoryUtil.byteCountToDisplaySize(FileUtils.ONE_TB));
+        assertEquals("931.322TB", MemoryUtil.byteCountToDisplaySize(999_999_999_999_999L));
+        assertEquals("931.322TB", MemoryUtil.byteCountToDisplaySize(1000_000_000_000_000L));
+        assertEquals("1.024PB", MemoryUtil.byteCountToDisplaySize(FileUtils.ONE_PB));
+        assertEquals("909.494PB", MemoryUtil.byteCountToDisplaySize(999_999_999_999_999_999L));
+        assertEquals("909.494PB", MemoryUtil.byteCountToDisplaySize(1000_000_000_000_000_000L));
+        assertEquals("1.024EB", MemoryUtil.byteCountToDisplaySize(FileUtils.ONE_EB));
+    }
+
     public void test_getUsedMemory() {
         assertTrue(MemoryUtil.getUsedMemory() >= 0);
     }