Skip to content

Commit aaca627

Browse files
committed
Log Utils 0.4 - Migrate from static to instance loggers (#15)
1 parent 8eaf86f commit aaca627

File tree

7 files changed

+806
-635
lines changed

7 files changed

+806
-635
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
/*
2+
* Copyright (c) Forge Development LLC
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
package net.minecraftforge.util.logging;
6+
7+
import org.jetbrains.annotations.Nullable;
8+
9+
import java.util.AbstractMap;
10+
import java.util.ArrayList;
11+
import java.util.Iterator;
12+
import java.util.List;
13+
import java.util.Map;
14+
import java.util.function.BiConsumer;
15+
import java.util.function.Consumer;
16+
17+
public abstract class AbstractLogger implements Logger {
18+
/* CREATION */
19+
20+
protected AbstractLogger() {
21+
this(Level.INFO, (byte) 0);
22+
}
23+
24+
protected AbstractLogger(byte indentLevel) {
25+
this(Level.INFO, indentLevel);
26+
}
27+
28+
protected AbstractLogger(Level enabled) {
29+
this(enabled, (byte) 0);
30+
}
31+
32+
protected AbstractLogger(Level enabled, byte indentLevel) {
33+
this.enabled = enabled;
34+
this.indentLevel = indentLevel;
35+
}
36+
37+
/* LOG LEVELS */
38+
39+
private @Nullable Level enabled;
40+
41+
@Override
42+
public final @Nullable Level getEnabled() {
43+
return this.enabled;
44+
}
45+
46+
@Override
47+
public final void setEnabled(@Nullable Level level) {
48+
this.enabled = level;
49+
}
50+
51+
/* INDENTATIONS */
52+
53+
private static final String INDENT_STRING = " ";
54+
private static final String[] INDENT_CACHE = new String[Byte.MAX_VALUE];
55+
private byte indentLevel;
56+
57+
static {
58+
INDENT_CACHE[0] = "";
59+
INDENT_CACHE[1] = INDENT_STRING;
60+
}
61+
62+
@Override
63+
public final byte push() {
64+
return indentLevel++;
65+
}
66+
67+
@Override
68+
public final byte pop() {
69+
if (--indentLevel < 0)
70+
throw new IllegalStateException("Cannot pop Log below 0");
71+
72+
return indentLevel;
73+
}
74+
75+
@Override
76+
public final byte pop(byte indent) {
77+
if (indent < 0)
78+
throw new IllegalArgumentException("Cannot pop Log below 0");
79+
80+
return indentLevel = indent;
81+
}
82+
83+
@Override
84+
public final String getIndentation() {
85+
String ret = INDENT_CACHE[indentLevel];
86+
//noinspection ConstantValue -- IntelliJ skill issue
87+
return ret == null ? INDENT_CACHE[indentLevel] = getIndentation(indentLevel) : ret;
88+
}
89+
90+
private static String getIndentation(byte indent) {
91+
StringBuilder builder = new StringBuilder(INDENT_STRING.length() * indent);
92+
for (int i = 0; i < indent; i++)
93+
builder.append(INDENT_STRING);
94+
return builder.toString();
95+
}
96+
97+
/* CAPTURING */
98+
99+
private @Nullable List<Map.Entry<Level, String>> captured;
100+
101+
@Override
102+
public final boolean isCapturing() {
103+
return captured != null;
104+
}
105+
106+
@Override
107+
public final void capture() {
108+
if (captured != null) return;
109+
captured = new ArrayList<>(128);
110+
}
111+
112+
final void tryCapture(Consumer<? super String> logger, Level level, String message) {
113+
if (captured != null)
114+
captured.add(new AbstractMap.SimpleImmutableEntry<>(level, message));
115+
else
116+
logger.accept(message);
117+
}
118+
119+
@Override
120+
public final void drop() {
121+
captured = null;
122+
}
123+
124+
@Override
125+
public final void release() {
126+
release(this::logDirectly);
127+
}
128+
129+
@Override
130+
public final void release(BiConsumer<Level, String> consumer) {
131+
if (captured == null) return;
132+
133+
Iterator<Map.Entry<Level, String>> itor = captured.iterator();
134+
captured = null;
135+
while (itor.hasNext()) {
136+
Map.Entry<Level, String> capture = itor.next();
137+
consumer.accept(capture.getKey(), capture.getValue());
138+
}
139+
}
140+
141+
/* LOGGING */
142+
143+
static final DelegatePrintStream.Empty EMPTY = DelegatePrintStream.EMPTY;
144+
145+
private void logDirectly(Level level, String message) {
146+
((DelegatePrintStream) this.getLog(level)).getDelegate().accept(message);
147+
}
148+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright (c) Forge Development LLC
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
package net.minecraftforge.util.logging;
6+
7+
import java.io.PrintStream;
8+
9+
final class DefaultLogger extends AbstractLogger {
10+
DefaultLogger() {
11+
super();
12+
}
13+
14+
DefaultLogger(byte indentLevel) {
15+
super(indentLevel);
16+
}
17+
18+
DefaultLogger(Level enabled) {
19+
super(enabled);
20+
}
21+
22+
DefaultLogger(Level enabled, byte indentLevel) {
23+
super(enabled, indentLevel);
24+
}
25+
26+
private final DelegatePrintStream.Capturing debug = new DelegatePrintStream.Capturing(this, Level.DEBUG, System.out::println);
27+
private final DelegatePrintStream.Capturing quiet = new DelegatePrintStream.Capturing(this, Level.QUIET, System.out::println);
28+
private final DelegatePrintStream.Capturing info = new DelegatePrintStream.Capturing(this, Level.INFO, System.out::println);
29+
private final DelegatePrintStream.Capturing warn = new DelegatePrintStream.Capturing(this, Level.WARN, System.out::println);
30+
private final DelegatePrintStream.Capturing error = new DelegatePrintStream.Capturing(this, Level.ERROR, System.err::println);
31+
private final DelegatePrintStream.Capturing fatal = new DelegatePrintStream.Capturing(this, Level.FATAL, System.err::println);
32+
33+
@Override
34+
public PrintStream getDebug() {
35+
return this.debug;
36+
}
37+
38+
@Override
39+
public PrintStream getQuiet() {
40+
return this.quiet;
41+
}
42+
43+
@Override
44+
public PrintStream getInfo() {
45+
return this.info;
46+
}
47+
48+
@Override
49+
public PrintStream getWarn() {
50+
return this.warn;
51+
}
52+
53+
@Override
54+
public PrintStream getError() {
55+
return this.error;
56+
}
57+
58+
@Override
59+
public PrintStream getFatal() {
60+
return this.fatal;
61+
}
62+
}

log-utils/src/main/java/net/minecraftforge/util/logging/DelegatePrintStream.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99
import java.util.function.Consumer;
1010

1111
interface DelegatePrintStream {
12-
PrintStream EMPTY = new Empty();
12+
DelegatePrintStream.Empty EMPTY = new Empty();
1313

14-
PrintStream getDelegate();
14+
Consumer<? super String> getDelegate();
1515

1616
final class Capturing extends PrintStream implements DelegatePrintStream {
17-
private final PrintStream raw;
17+
private final Consumer<? super String> delegate;
1818

19-
public Capturing(Log.Level level, PrintStream stream) {
19+
public Capturing(AbstractLogger logger, Logger.Level level, Consumer<? super String> output) {
2020
super(new OutputStream() {
21-
private final Consumer<String> logger = new LogConsumer(level, stream::println);
21+
private final Consumer<? super String> consumer = new LogConsumer(logger, level, output);
2222
private StringBuffer buffer = new StringBuffer(512);
2323

2424
@Override
@@ -29,7 +29,7 @@ public void write(int b) {
2929
private void write(char c) {
3030
if (c == '\n' || c == '\r') {
3131
if (this.buffer.length() != 0) {
32-
logger.accept(this.buffer.insert(0, Log.getIndentation()).toString());
32+
consumer.accept(this.buffer.insert(0, logger.getIndentation()).toString());
3333
this.buffer = new StringBuffer(512);
3434
}
3535
} else {
@@ -38,12 +38,12 @@ private void write(char c) {
3838
}
3939
});
4040

41-
this.raw = stream;
41+
this.delegate = output;
4242
}
4343

4444
@Override
45-
public PrintStream getDelegate() {
46-
return this.raw;
45+
public Consumer<? super String> getDelegate() {
46+
return this.delegate;
4747
}
4848
}
4949

@@ -64,8 +64,8 @@ public boolean checkError() {
6464
protected void clearError() { }
6565

6666
@Override
67-
public PrintStream getDelegate() {
68-
return this;
67+
public Consumer<? super String> getDelegate() {
68+
return s -> {};
6969
}
7070
}
7171
}

0 commit comments

Comments
 (0)