Fix code warnings in `SimpleLogHandler` and test. Use `ProcessHandle` to get the pid, cleaning up a `TODO`.
PiperOrigin-RevId: 407454858
diff --git a/src/main/java/com/google/devtools/build/lib/util/SimpleLogHandler.java b/src/main/java/com/google/devtools/build/lib/util/SimpleLogHandler.java
index e03b871..6f0edb9 100644
--- a/src/main/java/com/google/devtools/build/lib/util/SimpleLogHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/util/SimpleLogHandler.java
@@ -28,7 +28,6 @@
import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.OutputStreamWriter;
-import java.lang.management.ManagementFactory;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.LinkOption;
@@ -90,7 +89,7 @@
*/
private final Optional<Path> symlinkPath;
/** Absolute path to common base name of log files. */
- @VisibleForTesting final Path baseFilePath;
+ private final Path baseFilePath;
/** Log file currently in use. */
@GuardedBy("this")
private final Output output = new Output();
@@ -204,8 +203,8 @@
* <p>If unset, the value of "symlink" from the JVM logging configuration for {@link
* SimpleLogHandler} will be used; and if that's unset, the prefix will be used.
*
- * @param symlink either symlink filename without a directory part, or an absolute path whose
- * directory part matches the prefix
+ * @param symlinkName either symlink filename without a directory part, or an absolute path
+ * whose directory part matches the prefix
* @return this {@code Builder} object
*/
public Builder setSymlinkName(String symlinkName) {
@@ -224,7 +223,7 @@
* @return this {@code Builder} object
*/
public Builder setCreateSymlink(boolean createSymlink) {
- this.createSymlink = Boolean.valueOf(createSymlink);
+ this.createSymlink = createSymlink;
return this;
}
@@ -238,7 +237,7 @@
* @return this {@code Builder} object
*/
public Builder setRotateLimitBytes(int rotateLimitBytes) {
- this.rotateLimitBytes = Integer.valueOf(rotateLimitBytes);
+ this.rotateLimitBytes = rotateLimitBytes;
return this;
}
@@ -256,7 +255,7 @@
* @return this {@code Builder} object
*/
public Builder setTotalLimitBytes(int totalLimitBytes) {
- this.totalLimitBytes = Integer.valueOf(totalLimitBytes);
+ this.totalLimitBytes = totalLimitBytes;
return this;
}
@@ -367,7 +366,9 @@
? Optional.of(
getSymlinkAbsolutePath(this.baseFilePath.getParent(), configuredSymlinkName))
: Optional.empty();
- this.extension = getConfiguredStringProperty(extension, "extension", getPidString());
+ this.extension =
+ getConfiguredStringProperty(
+ extension, "extension", Long.toString(ProcessHandle.current().pid()));
this.isStaticExtension = (getConfiguredStringProperty(extension, "extension", null) != null);
this.rotateLimitBytes = getConfiguredIntProperty(rotateLimitBytes, "rotate_limit_bytes", 0);
checkArgument(this.rotateLimitBytes >= 0, "File size limits cannot be negative");
@@ -524,7 +525,7 @@
/** Matches java.logging.* configuration behavior; configured strings are trimmed. */
private static String getConfiguredStringProperty(
String builderValue, String configuredName, String fallbackValue) {
- return getConfiguredProperty(builderValue, configuredName, val -> val.trim(), fallbackValue);
+ return getConfiguredProperty(builderValue, configuredName, String::trim, fallbackValue);
}
/**
@@ -545,13 +546,13 @@
return true;
} else if ("false".equals(val) || "0".equals(val)) {
return false;
- } else if (val.length() == 0) {
+ } else if (val.isEmpty()) {
return null;
}
throw new IllegalArgumentException("Cannot parse boolean property value");
},
null);
- return value != null ? value.booleanValue() : fallbackValue;
+ return value != null ? value : fallbackValue;
}
/**
@@ -567,10 +568,10 @@
configuredName,
val -> {
val = val.trim();
- return val.length() > 0 ? Integer.parseInt(val) : null;
+ return !val.isEmpty() ? Integer.parseInt(val) : null;
},
null);
- return value != null ? value.intValue() : fallbackValue;
+ return value != null ? value : fallbackValue;
}
/**
@@ -586,7 +587,7 @@
configuredName,
val -> {
val = val.trim();
- return val.length() > 0 ? Level.parse(val) : null;
+ return !val.isEmpty() ? Level.parse(val) : null;
},
null);
return value != null ? value : fallbackValue;
@@ -605,7 +606,7 @@
configuredName,
val -> {
val = val.trim();
- if (val.length() > 0) {
+ if (!val.isEmpty()) {
try {
return (Formatter)
ClassLoader.getSystemClassLoader()
@@ -623,19 +624,6 @@
}
@VisibleForTesting
- static String getPidString() {
- long pid;
- try {
- // TODO(b/78168359): Replace with ProcessHandle.current().pid() in Java 9
- pid = Long.parseLong(ManagementFactory.getRuntimeMXBean().getName().split("@", -1)[0]);
- } catch (NumberFormatException e) {
- // getRuntimeMXBean().getName() output is implementation-specific, may be unparseable.
- pid = 0;
- }
- return Long.toString(pid);
- }
-
- @VisibleForTesting
static String getLocalHostnameFirstComponent() {
String name = NetUtil.getCachedShortHostName();
if (!InetAddresses.isInetAddress(name)) {
@@ -707,7 +695,7 @@
*/
private static Path getSymlinkAbsolutePath(Path logDir, String symlink) {
checkNotNull(symlink);
- checkArgument(symlink.length() > 0);
+ checkArgument(!symlink.isEmpty());
File symlinkFile = new File(symlink);
if (!symlinkFile.isAbsolute()) {
symlinkFile = new File(logDir + File.separator + symlink);
@@ -800,7 +788,7 @@
* @throws NullPointerException if not open
* @throws IOException if an underlying IO operation failed
*/
- public void closeIfByteCountAtleast(int limit) throws IOException {
+ void closeIfByteCountAtleast(int limit) throws IOException {
if (stream.getCount() < limit && stream.getCount() + 8192L >= limit) {
// The writer and its internal encoder buffer output before writing to the output stream.
// The default size of the encoder's buffer is 8192 bytes. To count the bytes in the output
@@ -892,9 +880,7 @@
return timestamp;
}
- /**
- * File path ordered by timestamp.
- */
+ /** File path ordered by timestamp. */
private static final class PathByTimestamp implements Comparable<PathByTimestamp> {
private final Path path;
private final Date timestamp;
diff --git a/src/test/java/com/google/devtools/build/lib/util/SimpleLogHandlerTest.java b/src/test/java/com/google/devtools/build/lib/util/SimpleLogHandlerTest.java
index 5d7f49a..112afc6 100644
--- a/src/test/java/com/google/devtools/build/lib/util/SimpleLogHandlerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/SimpleLogHandlerTest.java
@@ -101,7 +101,7 @@
SimpleLogHandler.builder().setPrefix(tmp.getRoot() + File.separator + "hello").build();
handler.publish(new LogRecord(Level.SEVERE, "Hello world")); // To open the log file.
assertThat(handler.getCurrentLogFilePath().get().toString())
- .endsWith("." + SimpleLogHandler.getPidString());
+ .endsWith("." + ProcessHandle.current().pid());
}
@Test
@@ -179,7 +179,7 @@
Path logPath = handler.getCurrentLogFilePath().get();
handler.close();
- assertThat(new String(Files.readAllBytes(logPath), UTF_8)).isEqualTo("Hello world\n");
+ assertThat(Files.readString(logPath)).isEqualTo("Hello world\n");
}
@Test
@@ -238,7 +238,7 @@
}
@Test
- public void testSymlinkDisabling() throws Exception {
+ public void testSymlinkDisabling() {
SimpleLogHandler handler =
SimpleLogHandler.builder()
.setPrefix(tmp.getRoot() + File.separator + "hello")
@@ -256,7 +256,7 @@
.setPrefix(tmp.getRoot() + File.separator + "hello")
.setSymlinkName("bye" + File.separator + "bye")
.setCreateSymlink(true);
- assertThrows(IllegalArgumentException.class, () -> builder.build());
+ assertThrows(IllegalArgumentException.class, builder::build);
}
@Test