Skip to content

Commit 13700fc

Browse files
committed
Completely redesign Logging Utils
- A single, static logger wrapped around `System.out` and `System.err`. - The ability to add indentations using `#push` and `#pop`. - A simple level system using `Log.Level`. - Delegate to a `PrintStream` object (for things like `Throwable#printStackTrace`) using `#getLog` or similar. - If a level is not being logged (i.e. lower than `Log.enabled`), an empty print stream is returned that will ignore all method calls. - Each level's `PrintStream` also exists as a public static final field, such as `Log.WARN`. - Java 6. - No config files, no managers, no bullshit.
1 parent f60f307 commit 13700fc

File tree

8 files changed

+398
-201
lines changed

8 files changed

+398
-201
lines changed

download-utils/src/main/java/net/minecraftforge/util/download/DownloadUtils.java

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@
1010
import com.google.gson.stream.JsonReader;
1111
import com.google.gson.stream.JsonToken;
1212
import com.google.gson.stream.JsonWriter;
13-
import net.minecraftforge.util.logging.SimpleLogger;
13+
import net.minecraftforge.util.logging.Log;
1414
import org.jetbrains.annotations.Nullable;
1515

16-
import javax.net.ssl.SSLHandshakeException;
1716
import java.io.ByteArrayOutputStream;
1817
import java.io.File;
1918
import java.io.IOException;
@@ -77,8 +76,8 @@ public String read(final JsonReader in) throws IOException {
7776
uri = new URI(address);
7877
url = uri.toURL();
7978
} catch (MalformedURLException | URISyntaxException e) {
80-
SimpleLogger.getGlobal().error("Malformed URL: " + address);
81-
SimpleLogger.getGlobal().error(e::printStackTrace);
79+
Log.error("Malformed URL: " + address);
80+
e.printStackTrace(Log.ERROR);
8281
return null;
8382
}
8483

@@ -103,7 +102,7 @@ public String read(final JsonReader in) throws IOException {
103102
String location = hcon.getHeaderField("Location");
104103
hcon.disconnect();
105104
if (x == max_redirects - 1) {
106-
SimpleLogger.getGlobal().error("Invalid number of redirects: " + location);
105+
Log.error("Invalid number of redirects: " + location);
107106
return null;
108107
} else {
109108
//System.out.println("Following redirect: " + location);
@@ -122,8 +121,8 @@ public String read(final JsonReader in) throws IOException {
122121
}
123122
return con;
124123
} catch (IOException e) {
125-
SimpleLogger.getGlobal().error("Failed to establish connection to " + address);
126-
SimpleLogger.getGlobal().error(e::printStackTrace);
124+
Log.error("Failed to establish connection to " + address);
125+
e.printStackTrace(Log.ERROR);
127126
return null;
128127
}
129128
}
@@ -151,8 +150,8 @@ public String read(final JsonReader in) throws IOException {
151150
}
152151
}
153152
} catch (IOException e) {
154-
SimpleLogger.getGlobal().warn("Failed to download " + url);
155-
SimpleLogger.getGlobal().warn(e::printStackTrace);
153+
Log.warn("Failed to download " + url);
154+
e.printStackTrace(Log.WARN);
156155
}
157156
return null;
158157
}
@@ -166,24 +165,18 @@ public String read(final JsonReader in) throws IOException {
166165
*/
167166
public static boolean downloadFile(File target, String url) {
168167
try {
169-
ensureParent(target);
170-
SimpleLogger.getGlobal().quiet("Downloading " + url);
168+
Files.createDirectories(target.toPath());
169+
Log.quiet("Downloading " + url);
171170

172171
URLConnection connection = getConnection(url);
173172
if (connection != null) {
174173
Files.copy(connection.getInputStream(), target.toPath(), StandardCopyOption.REPLACE_EXISTING);
175174
return true;
176175
}
177176
} catch (IOException e) {
178-
SimpleLogger.getGlobal().warn("Failed to download " + url);
179-
SimpleLogger.getGlobal().warn(e::printStackTrace);
177+
Log.warn("Failed to download " + url);
178+
e.printStackTrace(Log.WARN);
180179
}
181180
return false;
182181
}
183-
184-
private static void ensureParent(File path) {
185-
File parent = path.getAbsoluteFile().getParentFile();
186-
if (parent != null && !parent.exists())
187-
parent.mkdirs();
188-
}
189182
}

log-utils/README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Logging Utils
2+
3+
Logging Utils uses a single, static logger to log messages to be used primarily by top-level CLIs/programs.
4+
5+
## Features
6+
7+
- A single, static logger wrapped around `System.out` and `System.err`.
8+
- The ability to add indentations using `#push` and `#pop`.
9+
- A simple level system using `Log.Level`.
10+
- Delegate to a `PrintStream` object (for things like `Throwable#printStackTrace`) using `#getLog` or similar.
11+
- If a level is not being logged (i.e. lower than `Log.enabled`), an empty print stream is returned that will ignore all method calls.
12+
- Each level's `PrintStream` also exists as a public static final field, such as `Log.WARN`.
13+
- Java 6.
14+
- No config files, no managers, no bullshit.

log-utils/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ dependencies {
1414
}
1515

1616
java {
17-
toolchain.languageVersion = JavaLanguageVersion.of(8)
17+
toolchain.languageVersion = JavaLanguageVersion.of(6)
1818
withSourcesJar()
1919
}
2020

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
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.IOException;
8+
import java.io.PrintStream;
9+
import java.util.Locale;
10+
11+
final class DelegatePrintStream extends PrintStream {
12+
private final Log.Level level;
13+
private final PrintStream delegate;
14+
private boolean trouble;
15+
16+
DelegatePrintStream(Log.Level level, PrintStream delegate) {
17+
super(System.err);
18+
this.level = level;
19+
this.delegate = delegate;
20+
}
21+
22+
PrintStream getDelegate() {
23+
return Log.enabled != null && this.level.compareTo(Log.enabled) >= 0 ? this.delegate : EmptyPrintStream.INSTANCE;
24+
}
25+
26+
@Override
27+
public void flush() {
28+
this.getDelegate().flush();
29+
}
30+
31+
@Override
32+
public void close() {
33+
this.getDelegate().close();
34+
}
35+
36+
@Override
37+
public boolean checkError() {
38+
return this.getDelegate().checkError() || this.trouble;
39+
}
40+
41+
@Override
42+
protected void setError() {
43+
this.trouble = true;
44+
}
45+
46+
@Override
47+
protected void clearError() {
48+
this.trouble = false;
49+
}
50+
51+
@Override
52+
public void write(int b) {
53+
this.getDelegate().write(b);
54+
}
55+
56+
@Override
57+
public void write(byte[] buf, int off, int len) {
58+
this.getDelegate().write(buf, off, len);
59+
}
60+
61+
@Override
62+
public void print(boolean b) {
63+
this.getDelegate().print(b);
64+
}
65+
66+
@Override
67+
public void print(char c) {
68+
this.getDelegate().print(c);
69+
}
70+
71+
@Override
72+
public void print(int i) {
73+
this.getDelegate().print(i);
74+
}
75+
76+
@Override
77+
public void print(long l) {
78+
this.getDelegate().print(l);
79+
}
80+
81+
@Override
82+
public void print(float f) {
83+
this.getDelegate().print(f);
84+
}
85+
86+
@Override
87+
public void print(double d) {
88+
this.getDelegate().print(d);
89+
}
90+
91+
@Override
92+
public void print(char[] s) {
93+
this.getDelegate().print(s);
94+
}
95+
96+
@Override
97+
public void print(String s) {
98+
this.getDelegate().print(s);
99+
}
100+
101+
@Override
102+
public void print(Object obj) {
103+
this.getDelegate().print(obj);
104+
}
105+
106+
@Override
107+
public void println() {
108+
this.getDelegate().println();
109+
}
110+
111+
@Override
112+
public void println(boolean x) {
113+
this.getDelegate().println(x);
114+
}
115+
116+
@Override
117+
public void println(char x) {
118+
this.getDelegate().println(x);
119+
}
120+
121+
@Override
122+
public void println(int x) {
123+
this.getDelegate().println(x);
124+
}
125+
126+
@Override
127+
public void println(long x) {
128+
this.getDelegate().println(x);
129+
}
130+
131+
@Override
132+
public void println(float x) {
133+
this.getDelegate().println(x);
134+
}
135+
136+
@Override
137+
public void println(double x) {
138+
this.getDelegate().println(x);
139+
}
140+
141+
@Override
142+
public void println(char[] x) {
143+
this.getDelegate().println(x);
144+
}
145+
146+
@Override
147+
public void println(String x) {
148+
this.getDelegate().println(x);
149+
}
150+
151+
@Override
152+
public void println(Object x) {
153+
this.getDelegate().println(x);
154+
}
155+
156+
@Override
157+
public PrintStream printf(String format, Object... args) {
158+
return this.getDelegate().printf(format, args);
159+
}
160+
161+
@Override
162+
public PrintStream printf(Locale l, String format, Object... args) {
163+
return this.getDelegate().printf(l, format, args);
164+
}
165+
166+
@Override
167+
public PrintStream format(String format, Object... args) {
168+
return this.getDelegate().format(format, args);
169+
}
170+
171+
@Override
172+
public PrintStream format(Locale l, String format, Object... args) {
173+
return this.getDelegate().format(l, format, args);
174+
}
175+
176+
@Override
177+
public PrintStream append(CharSequence csq) {
178+
return this.getDelegate().append(csq);
179+
}
180+
181+
@Override
182+
public PrintStream append(CharSequence csq, int start, int end) {
183+
return this.getDelegate().append(csq, start, end);
184+
}
185+
186+
@Override
187+
public PrintStream append(char c) {
188+
return this.getDelegate().append(c);
189+
}
190+
191+
@Override
192+
public void write(byte[] b) throws IOException {
193+
this.getDelegate().write(b);
194+
}
195+
196+
@Override
197+
public int hashCode() {
198+
return this.getDelegate().hashCode();
199+
}
200+
201+
@SuppressWarnings("EqualsDoesntCheckParameterClass")
202+
@Override
203+
public boolean equals(Object obj) {
204+
return this.getDelegate().equals(obj);
205+
}
206+
207+
@Override
208+
public String toString() {
209+
return this.getDelegate().toString();
210+
}
211+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+
import java.util.Locale;
9+
10+
final class EmptyPrintStream extends PrintStream {
11+
static final EmptyPrintStream INSTANCE = new EmptyPrintStream();
12+
13+
private EmptyPrintStream() {
14+
super(System.out);
15+
}
16+
17+
//@formatter:off
18+
@Override public void flush() { }
19+
@Override public void close() { }
20+
@Override public boolean checkError() { return false; }
21+
@Override protected void setError() { }
22+
@Override protected void clearError() { }
23+
@Override public void write(int b) { }
24+
@Override public void write(byte[] b) { }
25+
@Override public void write(byte[] buf, int off, int len) { }
26+
@Override public void print(boolean b) { }
27+
@Override public void print(char c) { }
28+
@Override public void print(int i) { }
29+
@Override public void print(long l) { }
30+
@Override public void print(float f) { }
31+
@Override public void print(double d) { }
32+
@Override public void print(char[] s) { }
33+
@Override public void print(String s) { }
34+
@Override public void print(Object obj) { }
35+
@Override public void println() { }
36+
@Override public void println(boolean x) { }
37+
@Override public void println(char x) { }
38+
@Override public void println(int x) { }
39+
@Override public void println(long x) { }
40+
@Override public void println(float x) { }
41+
@Override public void println(double x) { }
42+
@Override public void println(char[] x) { }
43+
@Override public void println(String x) { }
44+
@Override public void println(Object x) { }
45+
@Override public PrintStream printf(String format, Object... args) { return this; }
46+
@Override public PrintStream printf(Locale l, String format, Object... args) { return this; }
47+
@Override public PrintStream format(String format, Object... args) { return this; }
48+
@Override public PrintStream format(Locale l, String format, Object... args) { return this;}
49+
@Override public PrintStream append(CharSequence csq) { return this; }
50+
@Override public PrintStream append(CharSequence csq, int start, int end) { return this; }
51+
@Override public PrintStream append(char c) { return this; }
52+
//@formatter:on
53+
}

0 commit comments

Comments
 (0)