diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index c86b2af6ce..c16fc93e1a 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -40,6 +40,7 @@ import java.io.FileNotFoundException; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.nio.file.Files; @@ -60,7 +61,6 @@ import jenkins.ClassLoaderReflectionToolkit; import jenkins.ExtensionFilter; import jenkins.plugins.DetachedPluginsUtil; import jenkins.util.URLClassLoader2; -import org.apache.commons.io.output.NullOutputStream; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Expand; @@ -503,7 +503,7 @@ public class ClassicPluginStrategy implements PluginStrategy { final long dirTime = archive.lastModified(); // this ZipOutputStream is reused and not created for each directory - try (ZipOutputStream wrappedZOut = new ZipOutputStream(NullOutputStream.NULL_OUTPUT_STREAM) { + try (OutputStream nos = OutputStream.nullOutputStream(); ZipOutputStream wrappedZOut = new ZipOutputStream(nos) { @Override public void putNextEntry(ZipEntry ze) throws IOException { ze.setTime(dirTime + 1999); // roundup diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index 1353b3493e..e6ba431691 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -24,8 +24,6 @@ package hudson; -import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM; - import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -191,7 +189,7 @@ public abstract class Launcher { @CheckForNull protected FilePath pwd; @CheckForNull - protected OutputStream stdout = NULL_OUTPUT_STREAM, stderr; + protected OutputStream stdout = OutputStream.nullOutputStream(), stderr; @CheckForNull private TaskListener stdoutListener; @CheckForNull diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 99c83866df..4b25506fc1 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -56,7 +56,6 @@ import jenkins.security.stapler.StaplerAccessibleType; import jenkins.slaves.RemotingVersionInfo; import jenkins.util.SystemProperties; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.output.NullOutputStream; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -330,7 +329,9 @@ public final class TcpSlaveAgentListener extends Thread { s.shutdownOutput(); InputStream i = s.getInputStream(); - IOUtils.copy(i, NullOutputStream.NULL_OUTPUT_STREAM); + try (OutputStream o = OutputStream.nullOutputStream()) { + IOUtils.copy(i, o); + } s.shutdownInput(); } } diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index 02bb6180de..6adba3022f 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -113,7 +113,6 @@ import jenkins.util.SystemProperties; import jenkins.util.io.PathRemover; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.output.NullOutputStream; import org.apache.commons.lang.time.FastDateFormat; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; @@ -637,10 +636,11 @@ public class Util { public static String getDigestOf(@NonNull InputStream source) throws IOException { try (source) { MessageDigest md5 = getMd5(); - DigestInputStream in = new DigestInputStream(source, md5); - // Note: IOUtils.copy() buffers the input internally, so there is no - // need to use a BufferedInputStream. - IOUtils.copy(in, NullOutputStream.NULL_OUTPUT_STREAM); + try (InputStream in = new DigestInputStream(source, md5); OutputStream out = OutputStream.nullOutputStream()) { + // Note: IOUtils.copy() buffers the input internally, so there is no + // need to use a BufferedInputStream. + IOUtils.copy(in, out); + } return toHexString(md5.digest()); } catch (NoSuchAlgorithmException e) { throw new IOException("MD5 not installed", e); // impossible diff --git a/core/src/main/java/jenkins/util/JSONSignatureValidator.java b/core/src/main/java/jenkins/util/JSONSignatureValidator.java index 955c89168a..3cc10ebd40 100644 --- a/core/src/main/java/jenkins/util/JSONSignatureValidator.java +++ b/core/src/main/java/jenkins/util/JSONSignatureValidator.java @@ -6,6 +6,7 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -34,7 +35,6 @@ import jenkins.model.Jenkins; import net.sf.json.JSONObject; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; -import org.apache.commons.io.output.NullOutputStream; import org.apache.commons.io.output.TeeOutputStream; import org.jvnet.hudson.crypto.CertificateUtil; import org.jvnet.hudson.crypto.SignatureOutputStream; @@ -159,7 +159,8 @@ public class JSONSignatureValidator { */ private FormValidation checkSpecificSignature(JSONObject json, JSONObject signatureJson, MessageDigest digest, String digestEntry, Signature signature, String signatureEntry, String digestName) throws IOException { // this is for computing a digest to check sanity - DigestOutputStream dos = new DigestOutputStream(NullOutputStream.NULL_OUTPUT_STREAM, digest); + OutputStream nos = OutputStream.nullOutputStream(); + DigestOutputStream dos = new DigestOutputStream(nos, digest); SignatureOutputStream sos = new SignatureOutputStream(signature); String providedDigest = signatureJson.optString(digestEntry, null); diff --git a/core/src/test/java/hudson/slaves/ComputerLauncherTest.java b/core/src/test/java/hudson/slaves/ComputerLauncherTest.java index ae2a10005d..25f2c9ca4b 100644 --- a/core/src/test/java/hudson/slaves/ComputerLauncherTest.java +++ b/core/src/test/java/hudson/slaves/ComputerLauncherTest.java @@ -30,10 +30,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.io.PrintStream; import java.io.StringReader; import java.nio.charset.Charset; -import org.apache.commons.io.output.NullOutputStream; import org.junit.jupiter.api.Test; import org.jvnet.hudson.test.Issue; @@ -78,7 +78,7 @@ public class ComputerLauncherTest { IOException.class, () -> ComputerLauncher.checkJavaVersion( - new PrintStream(NullOutputStream.NULL_OUTPUT_STREAM), + new PrintStream(OutputStream.nullOutputStream()), "-", new BufferedReader( new StringReader( @@ -92,7 +92,7 @@ public class ComputerLauncherTest { IOException.class, () -> ComputerLauncher.checkJavaVersion( - new PrintStream(NullOutputStream.NULL_OUTPUT_STREAM), + new PrintStream(OutputStream.nullOutputStream()), "-", new BufferedReader( new StringReader( diff --git a/test/src/test/java/hudson/cli/CLIActionTest.java b/test/src/test/java/hudson/cli/CLIActionTest.java index e5c1f34ac9..57086142bf 100644 --- a/test/src/test/java/hudson/cli/CLIActionTest.java +++ b/test/src/test/java/hudson/cli/CLIActionTest.java @@ -38,7 +38,6 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.NullInputStream; import org.apache.commons.io.output.CountingOutputStream; -import org.apache.commons.io.output.NullOutputStream; import org.apache.commons.io.output.TeeOutputStream; import org.junit.Rule; import org.junit.Test; @@ -223,17 +222,18 @@ public class CLIActionTest { logging.record(CLIAction.class, Level.FINE); File jar = tmp.newFile("jenkins-cli.jar"); FileUtils.copyURLToFile(j.jenkins.getJnlpJars("jenkins-cli.jar").getURL(), jar); - CountingOutputStream cos = new CountingOutputStream(NullOutputStream.NULL_OUTPUT_STREAM); long size = /*999_*/999_999; - // Download: - assertEquals(0, new Launcher.LocalLauncher(StreamTaskListener.fromStderr()).launch().cmds( - "java", "-jar", jar.getAbsolutePath(), - "-webSocket", - "-s", j.getURL().toString(), - "large-download", - "-size", Long.toString(size)). - stdout(cos).stderr(System.err).join()); - assertEquals(size, cos.getByteCount()); + try (OutputStream nos = OutputStream.nullOutputStream(); CountingOutputStream cos = new CountingOutputStream(nos)) { + // Download: + assertEquals(0, new Launcher.LocalLauncher(StreamTaskListener.fromStderr()).launch().cmds( + "java", "-jar", jar.getAbsolutePath(), + "-webSocket", + "-s", j.getURL().toString(), + "large-download", + "-size", Long.toString(size)). + stdout(cos).stderr(System.err).join()); + assertEquals(size, cos.getByteCount()); + } // Upload: ByteArrayOutputStream baos = new ByteArrayOutputStream(); assertEquals(0, new Launcher.LocalLauncher(StreamTaskListener.fromStderr()).launch().cmds( @@ -250,7 +250,7 @@ public class CLIActionTest { public static final class LargeUploadCommand extends CLICommand { @Override protected int run() throws Exception { - try (InputStream is = new BufferedInputStream(stdin); CountingOutputStream cos = new CountingOutputStream(NullOutputStream.NULL_OUTPUT_STREAM)) { + try (InputStream is = new BufferedInputStream(stdin); OutputStream nos = OutputStream.nullOutputStream(); CountingOutputStream cos = new CountingOutputStream(nos)) { System.err.println("starting upload"); long start = System.nanoTime(); IOUtils.copyLarge(is, cos);