Change internally created StringBuffer and StringBuilder StringAppenderWrapper implementations used by the StringAppender from Singletons to Prototypes.

Fixes bug in StringAppender that maintained stale Log messages in the buffers of the wrappers between tests.

Resolves gh-73.
This commit is contained in:
John Blum
2020-02-14 17:46:14 -08:00
parent 562dc6c6ed
commit ab03a7c3c1
2 changed files with 46 additions and 19 deletions

View File

@@ -44,27 +44,19 @@ public class StringAppender extends AppenderBase<ILoggingEvent> {
@FunctionalInterface
interface StringAppenderWrapper {
void append(CharSequence charSequence);
default void clear() { }
}
protected static final StringAppenderWrapper stringBuilderAppenderWrapper = new StringAppenderWrapper() {
protected static class StringBufferAppenderWrapper implements StringAppenderWrapper {
private final StringBuilder stringBuilder = new StringBuilder();
@Override
public void append(CharSequence charSequence) {
this.stringBuilder.append(charSequence);
this.stringBuilder.append(NEWLINE);
protected static StringBufferAppenderWrapper create() {
return new StringBufferAppenderWrapper();
}
@Override
public java.lang.String toString() {
return this.stringBuilder.toString();
}
};
protected static final StringAppenderWrapper stringBufferAppenderWrapper = new StringAppenderWrapper() {
private final StringBuffer stringBuffer = new StringBuffer();
@Override
@@ -73,11 +65,41 @@ public class StringAppender extends AppenderBase<ILoggingEvent> {
this.stringBuffer.append(NEWLINE);
}
@Override
public void clear() {
this.stringBuffer.delete(0, this.stringBuffer.length());
}
@Override
public java.lang.String toString() {
return this.stringBuffer.toString();
}
};
}
protected static class StringBuilderAppenderWrapper implements StringAppenderWrapper {
protected static StringBuilderAppenderWrapper create() {
return new StringBuilderAppenderWrapper();
}
private final StringBuilder stringBuilder = new StringBuilder();
@Override
public void append(CharSequence charSequence) {
this.stringBuilder.append(charSequence);
this.stringBuilder.append(NEWLINE);
}
@Override
public void clear() {
this.stringBuilder.delete(0, this.stringBuilder.length());
}
@Override
public java.lang.String toString() {
return this.stringBuilder.toString();
}
}
@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
public static class Builder {
@@ -148,7 +170,10 @@ public class StringAppender extends AppenderBase<ILoggingEvent> {
}
private StringAppenderWrapper resolveStringAppenderWrapper() {
return this.useSynchronization ? stringBufferAppenderWrapper : stringBuilderAppenderWrapper;
return this.useSynchronization
? StringBufferAppenderWrapper.create()
: StringBuilderAppenderWrapper.create();
}
public StringAppender build() {

View File

@@ -74,7 +74,8 @@ public class StringAppenderUnitTests {
assertThat(stringAppender.isStarted()).isFalse();
assertThat(stringAppender.getContext()).isEqualTo(LoggerFactory.getILoggerFactory());
assertThat(stringAppender.getName()).isEqualTo(StringAppender.DEFAULT_NAME);
assertThat(stringAppender.getStringAppenderWrapper()).isSameAs(StringAppender.stringBuilderAppenderWrapper);
assertThat(stringAppender.getStringAppenderWrapper())
.isInstanceOf(StringAppender.StringBuilderAppenderWrapper.class);
}
@Test
@@ -116,7 +117,8 @@ public class StringAppenderUnitTests {
assertThat(stringAppender.isStarted()).isTrue();
assertThat(stringAppender.getContext()).isEqualTo(mockContext);
assertThat(stringAppender.getName()).isEqualTo("TestStringAppender");
assertThat(stringAppender.getStringAppenderWrapper()).isEqualTo(StringAppender.stringBufferAppenderWrapper);
assertThat(stringAppender.getStringAppenderWrapper())
.isInstanceOf(StringAppender.StringBufferAppenderWrapper.class);
assertThat(rootLogger.getAppender("TestStringAppender")).isEqualTo(stringAppender);
verify(delegate, times(1)).setAppender(isA(CompositeAppender.class));