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

rfscholte pushed a commit to branch MSHARED-965
in repository https://gitbox.apache.org/repos/asf/maven-shared-utils.git

commit e3e2010240674bfe205d73cb4cd61024d222104a
Author: rfscholte <rfscho...@apache.org>
AuthorDate: Sat Nov 28 18:35:13 2020 +0100

    [MSHARED-965] Support fill-method for MessageBuilder
---
 .../shared/utils/logging/AnsiMessageBuilder.java   |  6 ++
 .../maven/shared/utils/logging/MessageBuilder.java |  2 +
 .../shared/utils/logging/PlainMessageBuilder.java  | 77 ++++++++++++++++++----
 .../utils/logging/PlainMessageBuilderTest.java     | 45 +++++++++++++
 4 files changed, 117 insertions(+), 13 deletions(-)

diff --git 
a/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilder.java 
b/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilder.java
index 2d59bc9..8bc79b4 100644
--- 
a/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilder.java
+++ 
b/src/main/java/org/apache/maven/shared/utils/logging/AnsiMessageBuilder.java
@@ -147,6 +147,12 @@ class AnsiMessageBuilder
         ansi.format( pattern, args );
         return this;
     }
+    
+    @Override
+    public MessageBuilder fill( char c )
+    {
+        throw new UnsupportedOperationException();
+    }
 
     @Override
     public String toString()
diff --git 
a/src/main/java/org/apache/maven/shared/utils/logging/MessageBuilder.java 
b/src/main/java/org/apache/maven/shared/utils/logging/MessageBuilder.java
index 060e824..08671cd 100644
--- a/src/main/java/org/apache/maven/shared/utils/logging/MessageBuilder.java
+++ b/src/main/java/org/apache/maven/shared/utils/logging/MessageBuilder.java
@@ -100,4 +100,6 @@ public interface MessageBuilder
      * @see String#format(String, Object...)
      */
     MessageBuilder format( String pattern, Object... args );
+    
+    MessageBuilder fill( char c );
 }
diff --git 
a/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuilder.java 
b/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuilder.java
index 6a7b56e..cc9c287 100644
--- 
a/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuilder.java
+++ 
b/src/main/java/org/apache/maven/shared/utils/logging/PlainMessageBuilder.java
@@ -19,27 +19,33 @@ package org.apache.maven.shared.utils.logging;
  * under the License.
  */
 
+import java.util.Arrays;
+
 /**
  * Message builder implementation that just ignores styling, for Maven version 
earlier than 3.5.0.
  */
 class PlainMessageBuilder
     implements MessageBuilder, LoggerLevelRenderer
 {
-    private StringBuilder buffer;
+    private StringBuilder prefill;
+    
+    private StringBuilder postFill;
+    
+    private Character fillChar = null;
 
     PlainMessageBuilder()
     {
-        buffer = new StringBuilder();
+        prefill = new StringBuilder();
     }
 
     PlainMessageBuilder( StringBuilder builder )
     {
-        buffer = builder;
+        prefill = builder;
     }
 
-    PlainMessageBuilder( int size )
+    PlainMessageBuilder( int capacity )
     {
-        buffer = new StringBuilder( size );
+        prefill = new StringBuilder( capacity );
     }
 
     public String debug( String level )
@@ -94,49 +100,94 @@ class PlainMessageBuilder
 
     public PlainMessageBuilder a( char[] value, int offset, int len )
     {
-        buffer.append( value, offset, len );
+        
+        buffer().append( value, offset, len );
         return this;
     }
 
     public PlainMessageBuilder a( char[] value )
     {
-        buffer.append( value );
+        buffer().append( value );
         return this;
     }
 
     public PlainMessageBuilder a( CharSequence value, int start, int end )
     {
-        buffer.append( value, start, end );
+        buffer().append( value, start, end );
         return this;
     }
 
     public PlainMessageBuilder a( CharSequence value )
     {
-        buffer.append( value );
+        buffer().append( value );
         return this;
     }
 
     public PlainMessageBuilder a( Object value )
     {
-        buffer.append( value );
+        buffer().append( value );
         return this;
     }
 
     public PlainMessageBuilder newline()
     {
-        buffer.append( System.getProperty( "line.separator" ) );
+        buffer().append( System.getProperty( "line.separator" ) );
         return this;
     }
 
     public PlainMessageBuilder format( String pattern, Object... args )
     {
-        buffer.append( String.format( pattern, args ) );
+        buffer().append( String.format( pattern, args ) );
+        return this;
+    }
+    
+    private StringBuilder buffer() 
+    {
+        return ( fillChar == null ? prefill : postFill );
+    } 
+    
+    /**
+     * When calling {@link #toString()} the result will be filled with c for 
the capacity.
+     * 
+     *  @throws IllegalStateException when called more than once
+     */
+    public PlainMessageBuilder fill( char c )
+    {
+        if ( fillChar != null )
+        {
+            throw new IllegalStateException( "fill can only be called once" );
+        }
+        this.fillChar = c;
+        this.postFill = new StringBuilder();
         return this;
     }
 
     @Override
     public String toString()
     {
-        return buffer.toString();
+        if ( fillChar == null )
+        {
+            return prefill.toString();
+        }
+        else
+        {
+            int capacity = prefill.capacity();
+            int size = prefill.length() + postFill.length();
+
+            char[] fillChars;
+            if ( size >= capacity )
+            {
+                fillChars = new char[] { fillChar };
+            }
+            else
+            {
+                fillChars = new char[( capacity - size )];
+            }
+
+            Arrays.fill( fillChars, 0, fillChars.length, fillChar );
+
+            return prefill.append( fillChars ).append( postFill ).toString();
+
+        }
     }
 }
diff --git 
a/src/test/java/org/apache/maven/shared/utils/logging/PlainMessageBuilderTest.java
 
b/src/test/java/org/apache/maven/shared/utils/logging/PlainMessageBuilderTest.java
new file mode 100644
index 0000000..7d65045
--- /dev/null
+++ 
b/src/test/java/org/apache/maven/shared/utils/logging/PlainMessageBuilderTest.java
@@ -0,0 +1,45 @@
+package org.apache.maven.shared.utils.logging;
+
+/*
+ * 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.
+ */
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+import org.junit.Test;
+
+public class PlainMessageBuilderTest
+{
+    @Test
+    public void fill()
+    {
+        PlainMessageBuilder builder = new PlainMessageBuilder( 8 );
+        builder.a( 'a' ).fill( '.' ).a( "z!" );
+        assertThat( builder.toString(), is( "a.....z!" ) );
+    }
+
+    @Test
+    public void fillOverflow()
+    {
+        PlainMessageBuilder builder = new PlainMessageBuilder( 6 );
+        builder.a( "abc" ).fill( '.' ).a( "xyz!" );
+        assertThat( builder.toString(), is( "abc.xyz!" ) );
+    }
+
+}

Reply via email to