From e73abbfceffdab77e1d1cd93f87b65f66f6525df Mon Sep 17 00:00:00 2001 From: azerr Date: Tue, 21 Apr 2026 15:23:58 +0200 Subject: [PATCH] Don't re-trigger Java validation for all opened Java files when a Java file is saved. Signed-off-by: azerr --- .../core/project/AbstractConfigSource.java | 3 +- .../jdt/core/project/IConfigSource.java | 1 + .../core/project/JDTMicroProfileProject.java | 24 ++++++++ .../JDTMicroProfileProjectManager.java | 58 ++----------------- ...MicroProfilePropertiesListenerManager.java | 41 +++++++++++-- 5 files changed, 66 insertions(+), 61 deletions(-) diff --git a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/AbstractConfigSource.java b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/AbstractConfigSource.java index 189b53712..e58107e0d 100644 --- a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/AbstractConfigSource.java +++ b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/AbstractConfigSource.java @@ -218,7 +218,8 @@ public Integer getPropertyAsInt(String key) { return null; } - private void reset() { + @Override + public void reset() { config = null; propertyInformations = null; } diff --git a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/IConfigSource.java b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/IConfigSource.java index e0b7a3771..2796e29e1 100644 --- a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/IConfigSource.java +++ b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/IConfigSource.java @@ -100,4 +100,5 @@ public interface IConfigSource { */ Set getAllKeys(); + void reset(); } diff --git a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/JDTMicroProfileProject.java b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/JDTMicroProfileProject.java index 10f0b790e..9e3780ee3 100644 --- a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/JDTMicroProfileProject.java +++ b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/JDTMicroProfileProject.java @@ -25,6 +25,7 @@ import java.util.logging.Logger; import java.util.stream.Collectors; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IClasspathEntry; @@ -220,6 +221,29 @@ public void evictConfigSourcesCache() { aggregatedPropertiesProvider = null; } + /** + * Try updating the given config source file + * + * @param file + * @return true if the config source file has been updated (ex: + * src/main/resources/microprofile-config.properties) and false + * otherwise (ex: target/classes/microprofile-config.properties) + */ + public boolean updateConfigSource(IFile file) { + if (configSources != null) { + for (IConfigSource configSource : configSources) { + // If file comes from target folder, the file will not be updated. + if (configSource.getSourceConfigFileURI().endsWith(file.getLocation().toString())) { + configSource.reset(); + propertyValueExpander = null; + aggregatedPropertiesProvider = null; + return true; + } + } + } + return false; + } + /** * Load config sources from the given project and sort it by using * {@link IConfigSource#getOrdinal()} diff --git a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/JDTMicroProfileProjectManager.java b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/JDTMicroProfileProjectManager.java index bea046a58..b1680ec10 100644 --- a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/JDTMicroProfileProjectManager.java +++ b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/core/project/JDTMicroProfileProjectManager.java @@ -23,10 +23,7 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; -import org.eclipse.core.resources.IResourceDelta; -import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; @@ -52,7 +49,10 @@ public static JDTMicroProfileProjectManager getInstance() { private final Map projects; private MicroProfileProjectListener microprofileProjectListener; - private class MicroProfileProjectListener implements IResourceChangeListener, IResourceDeltaVisitor { + /** + * Resource Listener to update MicroProfile projects cache. + */ + private class MicroProfileProjectListener implements IResourceChangeListener { @Override public void resourceChanged(IResourceChangeEvent event) { @@ -81,18 +81,6 @@ public void resourceChanged(IResourceChangeEvent event) { } break; } - case IResourceChangeEvent.POST_CHANGE: - IResourceDelta resourceDelta = event.getDelta(); - if (resourceDelta != null) { - try { - resourceDelta.accept(this); - } catch (CoreException e) { - if (LOGGER.isLoggable(Level.SEVERE)) { - LOGGER.log(Level.SEVERE, "Error while tracking MicroProfile properties file", e); - } - } - } - break; } } @@ -104,44 +92,6 @@ private void evict(IProject project) { } } - @Override - public boolean visit(IResourceDelta delta) throws CoreException { - IResource resource = delta.getResource(); - if (resource == null) { - return false; - } - switch (resource.getType()) { - case IResource.ROOT: - case IResource.PROJECT: - case IResource.FOLDER: - return resource.isAccessible(); - case IResource.FILE: - IFile file = (IFile) resource; - if ((isFileDeleted(delta) || isFileContentChanged(delta) || isFileAdded(delta)) - && isConfigSource(file)) { - // it's a config source file (ex : microprofile-config.properties) - JDTMicroProfileProject mpProject = getJDTMicroProfileProject(file); - if (mpProject != null) { - // Evict the properties cache - mpProject.evictConfigSourcesCache(); - } - } - } - return false; - } - - private boolean isFileDeleted(IResourceDelta delta) { - return delta.getKind() == IResourceDelta.REMOVED; - } - - private boolean isFileAdded(IResourceDelta delta) { - return delta.getKind() == IResourceDelta.ADDED; - } - - private boolean isFileContentChanged(IResourceDelta delta) { - return (delta.getKind() == IResourceDelta.CHANGED && (delta.getFlags() & IResourceDelta.CONTENT) != 0); - } - } private JDTMicroProfileProjectManager() { diff --git a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/internal/core/MicroProfilePropertiesListenerManager.java b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/internal/core/MicroProfilePropertiesListenerManager.java index 6e7efc9b1..49a7effbe 100644 --- a/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/internal/core/MicroProfilePropertiesListenerManager.java +++ b/microprofile.jdt/org.eclipse.lsp4mp.jdt.core/src/main/java/org/eclipse/lsp4mp/jdt/internal/core/MicroProfilePropertiesListenerManager.java @@ -189,12 +189,33 @@ public boolean visit(IResourceDelta delta) throws CoreException { mpProject.getProjectRuntime().clearProjectClassCache(); } fireAsyncEvent(event); - } else if (isConfigSource(file) && isFileContentChanged(delta)) { - MicroProfilePropertiesChangeEvent event = new MicroProfilePropertiesChangeEvent(); - event.setType(MicroProfilePropertiesScope.ONLY_CONFIG_FILES); - event.setProjectURIs(new HashSet()); - event.getProjectURIs().add(JDTMicroProfileUtils.getProjectURI(file.getProject())); - fireAsyncEvent(event); + } else if (isConfigSource(file)) { + // Create, delete, update config source file (ex : + // microprofile-config.properties) + + JDTMicroProfileProject mpProject = JDTMicroProfileProjectManager.getInstance() + .getJDTMicroProfileProject(file); + + boolean generateEvent = false; + if (isFileDeleted(delta) || isFileAdded(delta)) { + generateEvent = true; + // Create, delete config source file (ex : microprofile-config.properties) + if (mpProject != null) { + // Evict the properties cache + mpProject.evictConfigSourcesCache(); + } + } else if (isFileContentChanged(delta)) { + // Update config source file (ex : microprofile-config.properties) + generateEvent = mpProject != null ? mpProject.updateConfigSource(file) : true; + } + + if (generateEvent) { + MicroProfilePropertiesChangeEvent event = new MicroProfilePropertiesChangeEvent(); + event.setType(MicroProfilePropertiesScope.ONLY_CONFIG_FILES); + event.setProjectURIs(new HashSet()); + event.getProjectURIs().add(JDTMicroProfileUtils.getProjectURI(file.getProject())); + fireAsyncEvent(event); + } } } return false; @@ -277,6 +298,14 @@ private boolean isConfigSource(IFile file) { return JDTMicroProfileProjectManager.getInstance().isConfigSource(file); } + private boolean isFileDeleted(IResourceDelta delta) { + return delta.getKind() == IResourceDelta.REMOVED; + } + + private boolean isFileAdded(IResourceDelta delta) { + return delta.getKind() == IResourceDelta.ADDED; + } + private boolean isFileContentChanged(IResourceDelta delta) { return (delta.getKind() == IResourceDelta.CHANGED && (delta.getFlags() & IResourceDelta.CONTENT) != 0); }