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!" ) ); + } + +}