From eccdf02e83c9a7d3ad54c2ba38ddfae65db73c38 Mon Sep 17 00:00:00 2001 From: Victor Rubezhny Date: Thu, 20 Jul 2023 18:26:55 +0200 Subject: [PATCH] Fix 'MavenPluginUtils.getContainingPluginDescriptor' error processing A different kind of exceptions may occur when trying to get a plugin descriptor and, if not caught and corectly processed, may break the normal functionality ``` Jul 20, 2023 5:23:08 PM org.eclipse.lemminx.extensions.maven.participants.diagnostics.PluginValidator validatePluginResolution WARNING: Could not resolve plugin description org.apache.maven.plugin.PluginDescriptorParsingException: Failed to parse plugin descriptor for org.eclipse.tycho:tycho-repository-plugin:5.0.0-SNAPSHOT (/home/jeremy/projects/eclipse/source/tycho/tycho-repository-plugin/pom.xml): zip END header not found at org.apache.maven.plugin.internal.DefaultMavenPluginManager.extractPluginDescriptor(DefaultMavenPluginManager.java:228) at org.apache.maven.plugin.internal.DefaultMavenPluginManager.lambda$getPluginDescriptor$0(DefaultMavenPluginManager.java:182) at org.apache.maven.plugin.DefaultPluginDescriptorCache.lambda$get$0(DefaultPluginDescriptorCache.java:72) at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) at org.apache.maven.plugin.DefaultPluginDescriptorCache.get(DefaultPluginDescriptorCache.java:70) at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getPluginDescriptor(DefaultMavenPluginManager.java:176) at org.eclipse.lemminx.extensions.maven.utils.MavenPluginUtils.getContainingPluginDescriptor(MavenPluginUtils.java:192) at org.eclipse.lemminx.extensions.maven.participants.diagnostics.PluginValidator.validatePluginResolution(PluginValidator.java:45) at org.eclipse.lemminx.extensions.maven.participants.diagnostics.PluginValidator.validateGoal(PluginValidator.java:107) at org.eclipse.lemminx.extensions.maven.participants.diagnostics.MavenDiagnosticParticipant.lambda$doDiagnostics$3(MavenDiagnosticParticipant.java:84) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1850) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at org.eclipse.lemminx.extensions.maven.participants.diagnostics.MavenDiagnosticParticipant.doDiagnostics(MavenDiagnosticParticipant.java:85) at org.eclipse.lemminx.services.XMLDiagnostics.doExtensionsDiagnostics(XMLDiagnostics.java:67) at org.eclipse.lemminx.services.XMLDiagnostics.doDiagnostics(XMLDiagnostics.java:49) at org.eclipse.lemminx.services.XMLLanguageService.doDiagnostics(XMLLanguageService.java:190) at org.eclipse.lemminx.services.XMLLanguageService.publishDiagnostics(XMLLanguageService.java:204) at org.eclipse.lemminx.XMLTextDocumentService.validate(XMLTextDocumentService.java:716) at org.eclipse.lemminx.XMLTextDocumentService.lambda$new$2(XMLTextDocumentService.java:207) at org.eclipse.lemminx.commons.ModelValidatorDelayer.lambda$validateWithDelay$0(ModelValidatorDelayer.java:69) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.util.zip.ZipException: zip END header not found at java.base/java.util.zip.ZipFile$Source.findEND(ZipFile.java:1469) at java.base/java.util.zip.ZipFile$Source.initCEN(ZipFile.java:1477) at java.base/java.util.zip.ZipFile$Source.(ZipFile.java:1315) at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1277) at java.base/java.util.zip.ZipFile$CleanableResource.(ZipFile.java:709) at java.base/java.util.zip.ZipFile.(ZipFile.java:243) at java.base/java.util.zip.ZipFile.(ZipFile.java:172) at java.base/java.util.jar.JarFile.(JarFile.java:347) at java.base/java.util.jar.JarFile.(JarFile.java:318) at java.base/java.util.jar.JarFile.(JarFile.java:298) at org.apache.maven.plugin.internal.DefaultMavenPluginManager.extractPluginDescriptor(DefaultMavenPluginManager.java:205) ... 32 more ``` --- .../maven/MavenLemminxWorkspaceReader.java | 2 +- .../diagnostics/PluginValidator.java | 2 +- .../maven/utils/MavenPluginUtils.java | 25 ++++++++++++++++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/MavenLemminxWorkspaceReader.java b/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/MavenLemminxWorkspaceReader.java index 1c466f81..8aeb0c06 100644 --- a/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/MavenLemminxWorkspaceReader.java +++ b/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/MavenLemminxWorkspaceReader.java @@ -159,7 +159,7 @@ private Optional getMinimalMavenProject(File file) { // XML document is invalid fo parsing (eg user is typing), it's a valid state that shouldn't log // exceptions } catch (IOException ex) { - LOGGER.log(Level.SEVERE, ex.getMessage(), ex); + LOGGER.log(Level.SEVERE, "Couldn't read Maven project: " + file.getAbsolutePath() + " : " + ex.getMessage(), ex); } return Optional.empty(); } diff --git a/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/participants/diagnostics/PluginValidator.java b/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/participants/diagnostics/PluginValidator.java index e5e068b7..f17bb0da 100644 --- a/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/participants/diagnostics/PluginValidator.java +++ b/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/participants/diagnostics/PluginValidator.java @@ -42,7 +42,7 @@ public PluginValidator(MavenLemminxExtension plugin) { public Optional> validatePluginResolution(DiagnosticRequest diagnosticRequest) { try { - MavenPluginUtils.getContainingPluginDescriptor(diagnosticRequest.getNode(), plugin); + MavenPluginUtils.getContainingPluginDescriptor(diagnosticRequest.getNode(), plugin, true); } catch (PluginResolutionException | PluginDescriptorParsingException | InvalidPluginDescriptorException e) { LOGGER.log(Level.WARNING, "Could not resolve plugin description", e); diff --git a/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/utils/MavenPluginUtils.java b/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/utils/MavenPluginUtils.java index d40a1f8e..4470c5fa 100644 --- a/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/utils/MavenPluginUtils.java +++ b/lemminx-maven/src/main/java/org/eclipse/lemminx/extensions/maven/utils/MavenPluginUtils.java @@ -108,7 +108,12 @@ public static Set collectPluginConfigurationParameters(IPositionReque public static Set collectPluginConfigurationMojoParameters(IPositionRequest request, MavenLemminxExtension plugin) throws PluginResolutionException, PluginDescriptorParsingException, InvalidPluginDescriptorException { - PluginDescriptor pluginDescriptor = MavenPluginUtils.getContainingPluginDescriptor(request.getNode(), plugin); + PluginDescriptor pluginDescriptor = null; + try { + pluginDescriptor = MavenPluginUtils.getContainingPluginDescriptor(request.getNode(), plugin); + } catch (PluginResolutionException | PluginDescriptorParsingException | InvalidPluginDescriptorException e) { + LOGGER.log(Level.SEVERE, e.getMessage(), e); + } if (pluginDescriptor == null) { return Collections.emptySet(); } @@ -127,8 +132,9 @@ public static Set collectPluginConfigurationMojoParameters(IPosit return Collections.emptySet(); } plugin.getMavenSession().setProjects(Collections.singletonList(project)); + final var finalPluginDescriptor = pluginDescriptor; return mojosToConsiderList.stream().flatMap(mojo -> PlexusConfigHelper - .loadMojoParameters(pluginDescriptor, mojo, plugin.getMavenSession(), plugin.getBuildPluginManager()) + .loadMojoParameters(finalPluginDescriptor, mojo, plugin.getMavenSession(), plugin.getBuildPluginManager()) .stream()).collect(Collectors.toSet()); } @@ -140,6 +146,12 @@ public static RemoteRepository toRemoteRepo(Repository modelRepo) { public static PluginDescriptor getContainingPluginDescriptor(DOMNode node, MavenLemminxExtension lemminxMavenPlugin) throws PluginResolutionException, PluginDescriptorParsingException, InvalidPluginDescriptorException { + return getContainingPluginDescriptor(node, lemminxMavenPlugin, false); + } + + public static PluginDescriptor getContainingPluginDescriptor(DOMNode node, + MavenLemminxExtension lemminxMavenPlugin, boolean reThrowPluginDescriptorExceptions) + throws PluginResolutionException, PluginDescriptorParsingException, InvalidPluginDescriptorException { MavenProject project = lemminxMavenPlugin.getProjectCache() .getLastSuccessfulMavenProject(node.getOwnerDocument()); if (project == null) { @@ -192,8 +204,13 @@ public static PluginDescriptor getContainingPluginDescriptor(DOMNode node, pluginDescriptor = lemminxMavenPlugin.getMavenPluginManager().getPluginDescriptor(plugin, project.getRemotePluginRepositories().stream().collect(Collectors.toList()), lemminxMavenPlugin.getMavenSession().getRepositorySession()); - } catch (PluginResolutionException ex) { - LOGGER.log(Level.SEVERE, ex.getMessage(), ex); + } catch (PluginResolutionException | PluginDescriptorParsingException | InvalidPluginDescriptorException ex) { + LOGGER.log(Level.WARNING, ex.getMessage(), ex); + if (reThrowPluginDescriptorExceptions) { + throw ex; // Needed for plugin validation + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "An error occured while getting a plugin descriptor: " + e.getMessage(), e); } if (pluginDescriptor == null && "0.0.1-SNAPSHOT".equals(plugin.getVersion())) { // probably missing or not parsed version Optional version;