Skip to content

Commit

Permalink
Change internally created StringBuffer and StringBuilder StringAppend…
Browse files Browse the repository at this point in the history
…erWrapper 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.
  • Loading branch information
jxblum committed Feb 20, 2020
1 parent 562dc6c commit ab03a7c
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,40 +44,62 @@ 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();
protected static StringBufferAppenderWrapper create() {
return new StringBufferAppenderWrapper();
}

private final StringBuffer stringBuffer = new StringBuffer();

@Override
public void append(CharSequence charSequence) {
this.stringBuilder.append(charSequence);
this.stringBuilder.append(NEWLINE);
this.stringBuffer.append(charSequence);
this.stringBuffer.append(NEWLINE);
}

@Override
public void clear() {
this.stringBuffer.delete(0, this.stringBuffer.length());
}

@Override
public java.lang.String toString() {
return this.stringBuilder.toString();
return this.stringBuffer.toString();
}
};
}

protected static final StringAppenderWrapper stringBufferAppenderWrapper = new StringAppenderWrapper() {
protected static class StringBuilderAppenderWrapper implements StringAppenderWrapper {

private final StringBuffer stringBuffer = new StringBuffer();
protected static StringBuilderAppenderWrapper create() {
return new StringBuilderAppenderWrapper();
}

private final StringBuilder stringBuilder = new StringBuilder();

@Override
public void append(CharSequence charSequence) {
this.stringBuffer.append(charSequence);
this.stringBuffer.append(NEWLINE);
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.stringBuffer.toString();
return this.stringBuilder.toString();
}
};
}

@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
public static class Builder {
Expand Down Expand Up @@ -148,7 +170,10 @@ private String resolveName() {
}

private StringAppenderWrapper resolveStringAppenderWrapper() {
return this.useSynchronization ? stringBufferAppenderWrapper : stringBuilderAppenderWrapper;

return this.useSynchronization
? StringBufferAppenderWrapper.create()
: StringBuilderAppenderWrapper.create();
}

public StringAppender build() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ public void buildStringAppender() {
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
Expand Down Expand Up @@ -116,7 +117,8 @@ public void buildAndStartStringAppender() {
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));
Expand Down

0 comments on commit ab03a7c

Please sign in to comment.