From d5f0589ae8adf8fc3c7029f7a648febc39cab84a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Dinis=20Ferreira?= Date: Sat, 30 May 2026 18:21:25 +0200 Subject: [PATCH] fix: close IFile.getContents() streams in Toc/Contexts generators CheckTocGenerator.loadTocModel and CheckContextsGenerator.update/removeContexts passed file.getContents() straight to CoreUtility.getTextDocument and model.load, which do not close caller-supplied streams. Wrap each in try-with-resources; since these methods only declare CoreException, the close()-time IOException is caught and wrapped in a CoreException (same pattern as DeployJob in this module). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../ui/builder/CheckContextsGenerator.java | 18 ++++++++++++++++-- .../check/ui/builder/CheckTocGenerator.java | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/com.avaloq.tools.ddk.check.ui/src/com/avaloq/tools/ddk/check/ui/builder/CheckContextsGenerator.java b/com.avaloq.tools.ddk.check.ui/src/com/avaloq/tools/ddk/check/ui/builder/CheckContextsGenerator.java index 374c69c25e..28ff1fdc36 100644 --- a/com.avaloq.tools.ddk.check.ui/src/com/avaloq/tools/ddk/check/ui/builder/CheckContextsGenerator.java +++ b/com.avaloq.tools.ddk.check.ui/src/com/avaloq/tools/ddk/check/ui/builder/CheckContextsGenerator.java @@ -10,6 +10,8 @@ *******************************************************************************/ package com.avaloq.tools.ddk.check.ui.builder; +import java.io.IOException; +import java.io.InputStream; import java.util.List; import java.util.Set; @@ -17,6 +19,7 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.pde.internal.core.util.CoreUtility; import org.eclipse.pde.internal.ua.core.ctxhelp.ICtxHelpConstants; @@ -37,6 +40,7 @@ import com.avaloq.tools.ddk.check.generator.CheckGeneratorNaming; import com.avaloq.tools.ddk.check.ui.builder.util.CheckContextsExtensionHelper; import com.avaloq.tools.ddk.check.ui.builder.util.CheckProjectHelper; +import com.avaloq.tools.ddk.check.ui.internal.Activator; import com.avaloq.tools.ddk.xtext.ui.util.RuntimeProjectUtil; import com.google.common.collect.ComparisonChain; import com.google.common.collect.Iterables; @@ -74,7 +78,12 @@ public class CheckContextsGenerator { public void updateContextsFile(final URI uri, final IBuildContext buildContext) throws CoreException { IFile file = projectHelper.getHelpFile(uri, CheckContextsExtensionHelper.CONTEXTS_FILE_NAME); - CtxHelpModel model = new CtxHelpModel(CoreUtility.getTextDocument(file.getContents()), false); + final CtxHelpModel model; + try (InputStream contents = file.getContents()) { + model = new CtxHelpModel(CoreUtility.getTextDocument(contents), false); + } catch (IOException e) { + throw new CoreException(new Status(Status.ERROR, Activator.getPluginId(), e.getMessage(), e)); + } model.setUnderlyingResource(file); model.load(); @@ -177,7 +186,12 @@ public void removeContexts(final Delta delta) throws CoreException { if (project != null) { IFile file = projectHelper.getHelpFile(project, CheckContextsExtensionHelper.CONTEXTS_FILE_NAME); - CtxHelpModel model = new CtxHelpModel(CoreUtility.getTextDocument(file.getContents()), false); + final CtxHelpModel model; + try (InputStream contents = file.getContents()) { + model = new CtxHelpModel(CoreUtility.getTextDocument(contents), false); + } catch (IOException e) { + throw new CoreException(new Status(Status.ERROR, Activator.getPluginId(), e.getMessage(), e)); + } model.setUnderlyingResource(file); model.load(); diff --git a/com.avaloq.tools.ddk.check.ui/src/com/avaloq/tools/ddk/check/ui/builder/CheckTocGenerator.java b/com.avaloq.tools.ddk.check.ui/src/com/avaloq/tools/ddk/check/ui/builder/CheckTocGenerator.java index a44503e416..17bcd8744e 100644 --- a/com.avaloq.tools.ddk.check.ui/src/com/avaloq/tools/ddk/check/ui/builder/CheckTocGenerator.java +++ b/com.avaloq.tools.ddk.check.ui/src/com/avaloq/tools/ddk/check/ui/builder/CheckTocGenerator.java @@ -10,8 +10,12 @@ *******************************************************************************/ package com.avaloq.tools.ddk.check.ui.builder; +import java.io.IOException; +import java.io.InputStream; + import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.pde.internal.core.text.IDocumentElementNode; import org.eclipse.pde.internal.core.util.CoreUtility; @@ -26,6 +30,7 @@ import com.avaloq.tools.ddk.check.generator.CheckGeneratorNaming; import com.avaloq.tools.ddk.check.ui.builder.util.CheckProjectHelper; import com.avaloq.tools.ddk.check.ui.builder.util.CheckTocExtensionHelper; +import com.avaloq.tools.ddk.check.ui.internal.Activator; import com.avaloq.tools.ddk.xtext.ui.util.RuntimeProjectUtil; import com.google.inject.Inject; @@ -222,9 +227,18 @@ private void updateToc(final TocModel model) throws CoreException { */ private TocModel loadTocModel(final URI uri) throws CoreException { IFile file = projectHelper.getHelpFile(uri, CheckTocExtensionHelper.TOC_FILE_NAME); - TocModel model = new TocModel(CoreUtility.getTextDocument(file.getContents()), false); + final TocModel model; + try (InputStream contents = file.getContents()) { + model = new TocModel(CoreUtility.getTextDocument(contents), false); + } catch (IOException e) { + throw new CoreException(new Status(Status.ERROR, Activator.getPluginId(), e.getMessage(), e)); + } model.setUnderlyingResource(file); - model.load(file.getContents(), false); + try (InputStream contents = file.getContents()) { + model.load(contents, false); + } catch (IOException e) { + throw new CoreException(new Status(Status.ERROR, Activator.getPluginId(), e.getMessage(), e)); + } return model; }