diff --git a/src/java.compiler/share/classes/javax/tools/ForwardingJavaFileManager.java b/src/java.compiler/share/classes/javax/tools/ForwardingJavaFileManager.java index 1cff1c35770..a323025ab58 100644 --- a/src/java.compiler/share/classes/javax/tools/ForwardingJavaFileManager.java +++ b/src/java.compiler/share/classes/javax/tools/ForwardingJavaFileManager.java @@ -52,11 +52,34 @@ public class ForwardingJavaFileManager implements Jav protected final M fileManager; /** - * Creates a new instance of {@code ForwardingJavaFileManager}. + * Whether the delegate is owned by this instance and should be closed when + * this instance is closed. + */ + private final boolean shouldClose; + + /** + * Creates a new instance of {@code ForwardingJavaFileManager} which takes + * ownership of the given delegate, and will close it when this instance is + * closed. + * * @param fileManager delegate to this file manager */ protected ForwardingJavaFileManager(M fileManager) { + this(fileManager, true); + } + + /** + * Creates a new instance of {@code ForwardingJavaFileManager}. + * + * @param fileManager delegate to this file manager + * @param shouldClose whether the delegate should be closed when this + * instance is closed. + * + * @since 26 + */ + protected ForwardingJavaFileManager(M fileManager, boolean shouldClose) { this.fileManager = Objects.requireNonNull(fileManager); + this.shouldClose = shouldClose; } /** @@ -247,7 +270,9 @@ public void flush() throws IOException { @Override public void close() throws IOException { - fileManager.close(); + if (shouldClose) { + fileManager.close(); + } } /** diff --git a/test/langtools/tools/javac/classfiles/InnerClasses/T8068517.java b/test/langtools/tools/javac/classfiles/InnerClasses/T8068517.java index edb760757f6..52f43856220 100644 --- a/test/langtools/tools/javac/classfiles/InnerClasses/T8068517.java +++ b/test/langtools/tools/javac/classfiles/InnerClasses/T8068517.java @@ -107,17 +107,18 @@ void run() throws Exception { void runTest(String aJava, String bJava) throws Exception { try (JavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)) { ToolBox tb = new ToolBox(); - ToolBox.MemoryFileManager memoryFM1 = new ToolBox.MemoryFileManager(fm); - new JavacTask(tb).fileManager(memoryFM1) - .sources(aJava, bJava) - .run(); - ToolBox.MemoryFileManager memoryFM2 = new ToolBox.MemoryFileManager(fm); - new JavacTask(tb).fileManager(memoryFM2) - .sources(bJava, aJava) - .run(); + try (var memoryFM1 = new ToolBox.MemoryFileManager(fm, false); + var memoryFM2 = new ToolBox.MemoryFileManager(fm, false)) { + new JavacTask(tb).fileManager(memoryFM1) + .sources(aJava, bJava) + .run(); + new JavacTask(tb).fileManager(memoryFM2) + .sources(bJava, aJava) + .run(); - Assert.check(Arrays.equals(memoryFM1.getFileBytes(StandardLocation.CLASS_OUTPUT, "B"), - memoryFM2.getFileBytes(StandardLocation.CLASS_OUTPUT, "B"))); + Assert.check(Arrays.equals(memoryFM1.getFileBytes(StandardLocation.CLASS_OUTPUT, "B"), + memoryFM2.getFileBytes(StandardLocation.CLASS_OUTPUT, "B"))); + } } } } diff --git a/test/langtools/tools/javac/processing/filer/TestOriginatingElements.java b/test/langtools/tools/javac/processing/filer/TestOriginatingElements.java index a936c0bb554..82602bd464f 100644 --- a/test/langtools/tools/javac/processing/filer/TestOriginatingElements.java +++ b/test/langtools/tools/javac/processing/filer/TestOriginatingElements.java @@ -67,7 +67,6 @@ import javax.tools.StandardLocation; import toolbox.JavacTask; import toolbox.TestRunner; -import toolbox.TestRunner.Test; import toolbox.ToolBox; import toolbox.ToolBox.MemoryFileManager; @@ -174,7 +173,7 @@ private String getInfo(FileObject fo) { }; try { String generatedData; - try (MemoryFileManager mfm = new MemoryFileManager(sjfm)) { + try (MemoryFileManager mfm = new MemoryFileManager(sjfm, /* shouldClose */ false)) { compiler.getTask(null, mfm, null, null, null, List.of(new ToolBox.JavaSource("package test; public class Generated2 {}"))) .call(); diff --git a/test/langtools/tools/lib/toolbox/ToolBox.java b/test/langtools/tools/lib/toolbox/ToolBox.java index ee217ab2c0c..c30dac5d2c5 100644 --- a/test/langtools/tools/lib/toolbox/ToolBox.java +++ b/test/langtools/tools/lib/toolbox/ToolBox.java @@ -856,7 +856,7 @@ private interface Content { * and delegates to a default file manager for input files. */ public MemoryFileManager() { - this(ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)); + this(ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null), true); } /** @@ -864,9 +864,11 @@ public MemoryFileManager() { * and delegates to a specified file manager for input files. * * @param fileManager the file manager to be used for input files + * @param shouldClose whether the delegate file manager should be closed + * when this instance is closed */ - public MemoryFileManager(JavaFileManager fileManager) { - super(fileManager); + public MemoryFileManager(JavaFileManager fileManager, boolean shouldClose) { + super(fileManager, shouldClose); files = new HashMap<>(); }