This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/master by this push:
     new 94749041b4 [MNG-7899] Various memory usage improvements 4-1 (#1296)
94749041b4 is described below

commit 94749041b421f8e415174deb05e99563d65c25ee
Author: sebastien-doyon <[email protected]>
AuthorDate: Fri Nov 10 00:47:54 2023 +0100

    [MNG-7899] Various memory usage improvements 4-1 (#1296)
    
    * [MNG-7899] Various memory usage improvements
    
    - BatchModeMavenTransferListener removed
    - FileSizeFormat moved to top level class
    - FileSizeFormat.formatProcess() refactored to accept an StringBuilder as 
argument
    - FileSizeFormat refactored format() methods
    - FileSizeFormat refactored, replace DecimalFormat with Math logic to
    reduce memory allocation
    
    ---------
    
    Co-authored-by: Guillaume Nodet <[email protected]>
---
 .../transfer/AbstractMavenTransferListener.java    | 156 +-----------------
 .../transfer/BatchModeMavenTransferListener.java   |  30 ----
 .../cli/transfer/ConsoleMavenTransferListener.java |   2 +-
 .../apache/maven/cli/transfer/FileSizeFormat.java  | 176 +++++++++++++++++++++
 .../cli/transfer/Slf4jMavenTransferListener.java   |  11 +-
 .../maven/cli/transfer/FileSizeFormatTest.java     |   3 +-
 6 files changed, 190 insertions(+), 188 deletions(-)

diff --git 
a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java
 
b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java
index 803c9f9b60..bc6526806c 100644
--- 
a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java
+++ 
b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java
@@ -19,8 +19,6 @@
 package org.apache.maven.cli.transfer;
 
 import java.io.PrintStream;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
 import java.util.Locale;
 
 import org.apache.maven.cli.jansi.MessageUtils;
@@ -38,153 +36,6 @@ public abstract class AbstractMavenTransferListener extends 
AbstractTransferList
     private static final String ANSI_DARK_SET = ESC + "[90m";
     private static final String ANSI_DARK_RESET = ESC + "[0m";
 
-    // CHECKSTYLE_OFF: LineLength
-    /**
-     * Formats file size with the associated <a 
href="https://en.wikipedia.org/wiki/Metric_prefix";>SI</a> prefix
-     * (GB, MB, kB) and using the patterns <code>#0.0</code> for numbers 
between 1 and 10
-     * and <code>###0</code> for numbers between 10 and 1000+ by default.
-     *
-     * @see <a 
href="https://en.wikipedia.org/wiki/Metric_prefix";>https://en.wikipedia.org/wiki/Metric_prefix</a>
-     * @see <a 
href="https://en.wikipedia.org/wiki/Binary_prefix";>https://en.wikipedia.org/wiki/Binary_prefix</a>
-     * @see <a
-     *      
href="https://en.wikipedia.org/wiki/Octet_%28computing%29";>https://en.wikipedia.org/wiki/Octet_(computing)</a>
-     */
-    // CHECKSTYLE_ON: LineLength
-    // TODO Move me to Maven Shared Utils
-    static class FileSizeFormat {
-        enum ScaleUnit {
-            BYTE {
-                @Override
-                public long bytes() {
-                    return 1L;
-                }
-
-                @Override
-                public String symbol() {
-                    return "B";
-                }
-            },
-            KILOBYTE {
-                @Override
-                public long bytes() {
-                    return 1000L;
-                }
-
-                @Override
-                public String symbol() {
-                    return "kB";
-                }
-            },
-            MEGABYTE {
-                @Override
-                public long bytes() {
-                    return KILOBYTE.bytes() * KILOBYTE.bytes();
-                }
-
-                @Override
-                public String symbol() {
-                    return "MB";
-                }
-            },
-            GIGABYTE {
-                @Override
-                public long bytes() {
-                    return MEGABYTE.bytes() * KILOBYTE.bytes();
-                }
-                ;
-
-                @Override
-                public String symbol() {
-                    return "GB";
-                }
-            };
-
-            public abstract long bytes();
-
-            public abstract String symbol();
-
-            public static ScaleUnit getScaleUnit(long size) {
-                if (size < 0L) {
-                    throw new IllegalArgumentException("file size cannot be 
negative: " + size);
-                }
-
-                if (size >= GIGABYTE.bytes()) {
-                    return GIGABYTE;
-                } else if (size >= MEGABYTE.bytes()) {
-                    return MEGABYTE;
-                } else if (size >= KILOBYTE.bytes()) {
-                    return KILOBYTE;
-                } else {
-                    return BYTE;
-                }
-            }
-        }
-
-        private DecimalFormat smallFormat;
-        private DecimalFormat largeFormat;
-
-        FileSizeFormat(Locale locale) {
-            smallFormat = new DecimalFormat("#0.0", new 
DecimalFormatSymbols(locale));
-            largeFormat = new DecimalFormat("###0", new 
DecimalFormatSymbols(locale));
-        }
-
-        public String format(long size) {
-            return format(size, null);
-        }
-
-        public String format(long size, ScaleUnit unit) {
-            return format(size, unit, false);
-        }
-
-        @SuppressWarnings("checkstyle:magicnumber")
-        public String format(long size, ScaleUnit unit, boolean omitSymbol) {
-            if (size < 0L) {
-                throw new IllegalArgumentException("file size cannot be 
negative: " + size);
-            }
-
-            if (unit == null) {
-                unit = ScaleUnit.getScaleUnit(size);
-            }
-
-            double scaledSize = (double) size / unit.bytes();
-            String scaledSymbol = " " + unit.symbol();
-
-            if (omitSymbol) {
-                scaledSymbol = "";
-            }
-
-            if (unit == ScaleUnit.BYTE) {
-                return largeFormat.format(size) + scaledSymbol;
-            }
-
-            if (scaledSize < 0.05 || scaledSize >= 10.0) {
-                return largeFormat.format(scaledSize) + scaledSymbol;
-            } else {
-                return smallFormat.format(scaledSize) + scaledSymbol;
-            }
-        }
-
-        public String formatProgress(long progressedSize, long size) {
-            if (progressedSize < 0L) {
-                throw new IllegalArgumentException("progressed file size 
cannot be negative: " + size);
-            }
-            if (size >= 0 && progressedSize > size) {
-                throw new IllegalArgumentException(
-                        "progressed file size cannot be greater than size: " + 
progressedSize + " > " + size);
-            }
-
-            if (size >= 0L && progressedSize != size) {
-                ScaleUnit unit = ScaleUnit.getScaleUnit(size);
-                String formattedProgressedSize = format(progressedSize, unit, 
true);
-                String formattedSize = format(size, unit);
-
-                return formattedProgressedSize + "/" + formattedSize;
-            } else {
-                return format(progressedSize);
-            }
-        }
-    }
-
     protected PrintStream out;
 
     protected AbstractMavenTransferListener(PrintStream out) {
@@ -234,12 +85,15 @@ public abstract class AbstractMavenTransferListener 
extends AbstractTransferList
         message.append(darkOff).append(resource.getRepositoryId());
         message.append(darkOn).append(": 
").append(resource.getRepositoryUrl());
         message.append(darkOff).append(resource.getResourceName());
-        message.append(darkOn).append(" 
(").append(format.format(contentLength));
+        message.append(darkOn).append(" (");
+        format.format(message, contentLength);
 
         long duration = System.currentTimeMillis() - 
resource.getTransferStartTime();
         if (duration > 0L) {
             double bytesPerSecond = contentLength / (duration / 1000.0);
-            message.append(" at ").append(format.format((long) 
bytesPerSecond)).append("/s");
+            message.append(" at ");
+            format.format(message, (long) bytesPerSecond);
+            message.append("/s");
         }
 
         message.append(')').append(darkOff);
diff --git 
a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/BatchModeMavenTransferListener.java
 
b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/BatchModeMavenTransferListener.java
deleted file mode 100644
index 667df5d958..0000000000
--- 
a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/BatchModeMavenTransferListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.maven.cli.transfer;
-
-import java.io.PrintStream;
-
-/**
- * BatchModeMavenTransferListener
- */
-public class BatchModeMavenTransferListener extends 
AbstractMavenTransferListener {
-    public BatchModeMavenTransferListener(PrintStream out) {
-        super(out);
-    }
-}
diff --git 
a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java
 
b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java
index 04e8bed45f..78addd1349 100644
--- 
a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java
+++ 
b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java
@@ -87,7 +87,7 @@ public class ConsoleMavenTransferListener extends 
AbstractMavenTransferListener
                 buffer.append(" (");
             }
 
-            buffer.append(format.formatProgress(complete, total));
+            format.formatProgress(buffer, complete, total);
 
             if (printResourceNames) {
                 buffer.append(")");
diff --git 
a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/FileSizeFormat.java
 
b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/FileSizeFormat.java
new file mode 100644
index 0000000000..6ae2054e65
--- /dev/null
+++ 
b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/FileSizeFormat.java
@@ -0,0 +1,176 @@
+/*
+ * 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.maven.cli.transfer;
+
+import java.util.Locale;
+
+/**
+ * Formats file size with the associated <a 
href="https://en.wikipedia.org/wiki/Metric_prefix";>SI</a> prefix
+ * (GB, MB, kB) and using the patterns <code>#0.0</code> for numbers between 1 
and 10
+ * and <code>###0</code> for numbers between 10 and 1000+ by default.
+ *
+ * @see <a 
href="https://en.wikipedia.org/wiki/Metric_prefix";>https://en.wikipedia.org/wiki/Metric_prefix</a>
+ * @see <a 
href="https://en.wikipedia.org/wiki/Binary_prefix";>https://en.wikipedia.org/wiki/Binary_prefix</a>
+ * @see <a
+ *      
href="https://en.wikipedia.org/wiki/Octet_%28computing%29";>https://en.wikipedia.org/wiki/Octet_(computing)</a>
+ */
+public class FileSizeFormat {
+    public enum ScaleUnit {
+        BYTE {
+            @Override
+            public long bytes() {
+                return 1L;
+            }
+
+            @Override
+            public String symbol() {
+                return "B";
+            }
+        },
+        KILOBYTE {
+            @Override
+            public long bytes() {
+                return 1000L;
+            }
+
+            @Override
+            public String symbol() {
+                return "kB";
+            }
+        },
+        MEGABYTE {
+            @Override
+            public long bytes() {
+                return KILOBYTE.bytes() * KILOBYTE.bytes();
+            }
+
+            @Override
+            public String symbol() {
+                return "MB";
+            }
+        },
+        GIGABYTE {
+            @Override
+            public long bytes() {
+                return MEGABYTE.bytes() * KILOBYTE.bytes();
+            }
+            ;
+
+            @Override
+            public String symbol() {
+                return "GB";
+            }
+        };
+
+        public abstract long bytes();
+
+        public abstract String symbol();
+
+        public static ScaleUnit getScaleUnit(long size) {
+            if (size < 0L) {
+                throw new IllegalArgumentException("file size cannot be 
negative: " + size);
+            }
+
+            if (size >= GIGABYTE.bytes()) {
+                return GIGABYTE;
+            } else if (size >= MEGABYTE.bytes()) {
+                return MEGABYTE;
+            } else if (size >= KILOBYTE.bytes()) {
+                return KILOBYTE;
+            } else {
+                return BYTE;
+            }
+        }
+    }
+
+    public FileSizeFormat(Locale locale) {}
+
+    public String format(long size) {
+        return format(size, null);
+    }
+
+    public String format(long size, ScaleUnit unit) {
+        return format(size, unit, false);
+    }
+
+    public String format(long size, ScaleUnit unit, boolean omitSymbol) {
+        StringBuilder sb = new StringBuilder();
+        format(sb, size, unit, omitSymbol);
+        return sb.toString();
+    }
+
+    public void format(StringBuilder builder, long size) {
+        format(builder, size, null, false);
+    }
+
+    public void format(StringBuilder builder, long size, ScaleUnit unit) {
+        format(builder, size, unit, false);
+    }
+
+    @SuppressWarnings("checkstyle:magicnumber")
+    private void format(StringBuilder builder, long size, ScaleUnit unit, 
boolean omitSymbol) {
+        if (size < 0L) {
+            throw new IllegalArgumentException("file size cannot be negative: 
" + size);
+        }
+        if (unit == null) {
+            unit = ScaleUnit.getScaleUnit(size);
+        }
+
+        double scaledSize = (double) size / unit.bytes();
+
+        if (unit == ScaleUnit.BYTE) {
+            builder.append(size);
+        } else if (scaledSize < 0.05d || scaledSize >= 10.0d) {
+            builder.append(Math.round(scaledSize));
+        } else {
+            builder.append(Math.round(scaledSize * 10d) / 10d);
+        }
+
+        if (!omitSymbol) {
+            builder.append(" ").append(unit.symbol());
+        }
+    }
+
+    public String formatProgress(long progressedSize, long size) {
+        StringBuilder sb = new StringBuilder();
+        formatProgress(sb, progressedSize, size);
+        return sb.toString();
+    }
+
+    public void formatProgress(StringBuilder builder, long progressedSize, 
long size) {
+        if (progressedSize < 0L) {
+            throw new IllegalArgumentException("progressed file size cannot be 
negative: " + size);
+        }
+        if (size >= 0 && progressedSize > size) {
+            throw new IllegalArgumentException(
+                    "progressed file size cannot be greater than size: " + 
progressedSize + " > " + size);
+        }
+
+        if (size >= 0L && progressedSize != size) {
+            ScaleUnit unit = ScaleUnit.getScaleUnit(size);
+            format(builder, progressedSize, unit, true);
+            builder.append("/");
+            format(builder, size, unit, false);
+        } else {
+            ScaleUnit unit = ScaleUnit.getScaleUnit(progressedSize);
+
+            format(builder, progressedSize, unit, false);
+        }
+    }
+}
diff --git 
a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java
 
b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java
index c5c8f09645..573b6ea7e3 100644
--- 
a/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java
+++ 
b/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java
@@ -20,7 +20,6 @@ package org.apache.maven.cli.transfer;
 
 import java.util.Locale;
 
-import 
org.apache.maven.cli.transfer.AbstractMavenTransferListener.FileSizeFormat;
 import org.eclipse.aether.transfer.AbstractTransferListener;
 import org.eclipse.aether.transfer.TransferCancelledException;
 import org.eclipse.aether.transfer.TransferEvent;
@@ -81,13 +80,17 @@ public class Slf4jMavenTransferListener extends 
AbstractTransferListener {
         StringBuilder message = new StringBuilder();
         message.append(action).append(' ').append(direction).append(' 
').append(resource.getRepositoryId());
         message.append(": ");
-        
message.append(resource.getRepositoryUrl()).append(resource.getResourceName());
-        message.append(" (").append(format.format(contentLength));
+        message.append(resource.getRepositoryUrl())
+                .append(resource.getResourceName())
+                .append(" (");
+        format.format(message, contentLength);
 
         long duration = System.currentTimeMillis() - 
resource.getTransferStartTime();
         if (duration > 0L) {
             double bytesPerSecond = contentLength / (duration / 1000.0);
-            message.append(" at ").append(format.format((long) 
bytesPerSecond)).append("/s");
+            message.append(" at ");
+            format.format(message, (long) bytesPerSecond);
+            message.append("/s");
         }
 
         message.append(')');
diff --git 
a/maven-embedder/src/test/java/org/apache/maven/cli/transfer/FileSizeFormatTest.java
 
b/maven-embedder/src/test/java/org/apache/maven/cli/transfer/FileSizeFormatTest.java
index 5587364035..6f96a59d90 100644
--- 
a/maven-embedder/src/test/java/org/apache/maven/cli/transfer/FileSizeFormatTest.java
+++ 
b/maven-embedder/src/test/java/org/apache/maven/cli/transfer/FileSizeFormatTest.java
@@ -20,8 +20,7 @@ package org.apache.maven.cli.transfer;
 
 import java.util.Locale;
 
-import 
org.apache.maven.cli.transfer.AbstractMavenTransferListener.FileSizeFormat;
-import 
org.apache.maven.cli.transfer.AbstractMavenTransferListener.FileSizeFormat.ScaleUnit;
+import org.apache.maven.cli.transfer.FileSizeFormat.ScaleUnit;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;

Reply via email to