From fbe86a2014d088bc67c4dbfc481f0a0cea4aed5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Bl=C3=A4sing?= Date: Tue, 30 Sep 2025 18:39:13 +0200 Subject: [PATCH 1/2] Gradle JavaEE/JakartaEE support might yield null for webAppDir, this must not be passed to FileUtil#toFileObject --- .../gradle/javaee/web/WebProjectWebRootProvider.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/enterprise/gradle.javaee/src/org/netbeans/modules/gradle/javaee/web/WebProjectWebRootProvider.java b/enterprise/gradle.javaee/src/org/netbeans/modules/gradle/javaee/web/WebProjectWebRootProvider.java index e522420c8e34..8135411abf99 100644 --- a/enterprise/gradle.javaee/src/org/netbeans/modules/gradle/javaee/web/WebProjectWebRootProvider.java +++ b/enterprise/gradle.javaee/src/org/netbeans/modules/gradle/javaee/web/WebProjectWebRootProvider.java @@ -19,6 +19,7 @@ package org.netbeans.modules.gradle.javaee.web; +import java.io.File; import org.netbeans.modules.gradle.api.NbGradleProject; import org.netbeans.modules.gradle.javaee.api.GradleWebProject; import java.util.Collection; @@ -56,6 +57,11 @@ public Collection getWebRoots() { FileObject getDefaultWebRoot() { GradleWebProject wp = GradleWebProject.get(project); - return wp != null ? FileUtil.toFileObject(wp.getWebAppDir()) : null; + if(wp != null && wp.getWebAppDir() != null) { + File normalizedFile = FileUtil.normalizeFile(wp.getWebAppDir()); + return FileUtil.toFileObject(normalizedFile); + } else { + return null; + } } } From a19a70f6e21e813063ed407144383884620b914c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Bl=C3=A4sing?= Date: Tue, 30 Sep 2025 18:44:04 +0200 Subject: [PATCH 2/2] GradleTestProgressListener: Handle situation where source dir is reported multiple times Stacktrace for problem: java.lang.IllegalStateException: Duplicate key null (attempted merging values /home/patton/TILED-PROGETTO/victores-demo/model/src/testBenchmark/java and /home/patton/TILED-PROGETTO/victores-demo/model/src/testIntegration/java) at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:135) at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:182) at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276) at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939) 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.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at org.netbeans.modules.gradle.test.GradleTestProgressListener.searchLocation(GradleTestProgressListener.java:358) at org.netbeans.modules.gradle.test.GradleTestProgressListener.caseFinish(GradleTestProgressListener.java:256) at org.netbeans.modules.gradle.test.GradleTestProgressListener.processTestProgress(GradleTestProgressListener.java:129) at org.netbeans.modules.gradle.test.GradleTestProgressListener.statusChanged(GradleTestProgressListener.java:94) at org.netbeans.modules.gradle.execute.GradleDaemonExecutor$1ProgressLookupListener.lambda$statusChanged$0(GradleDaemonExecutor.java:151) at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45) at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287) at org.netbeans.modules.gradle.execute.GradleDaemonExecutor$1ProgressLookupListener.statusChanged(GradleDaemonExecutor.java:151) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44) at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:268) at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:170) at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:160) at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) at jdk.proxy21/jdk.proxy21.$Proxy82.statusChanged(Unknown Source) at org.gradle.tooling.internal.consumer.parameters.BuildProgressListenerAdapter.broadcastTestProgressEvent(BuildProgressListenerAdapter.java:392) at org.gradle.tooling.internal.consumer.parameters.BuildProgressListenerAdapter.onEvent(BuildProgressListenerAdapter.java:354) at org.gradle.tooling.internal.consumer.parameters.FailsafeBuildProgressListenerAdapter.onEvent(FailsafeBuildProgressListenerAdapter.java:39) at org.gradle.tooling.internal.consumer.parameters.FailsafeBuildProgressListenerAdapter.onEvent(FailsafeBuildProgressListenerAdapter.java:39) at org.gradle.tooling.internal.provider.ProviderConnection$BuildProgressListenerInvokingBuildEventConsumer.dispatch(ProviderConnection.java:441) at org.gradle.tooling.internal.provider.ProblemAdditionalDataRemapper.dispatch(ProblemAdditionalDataRemapper.java:55) at org.gradle.tooling.internal.provider.StreamedValueConsumer.dispatch(StreamedValueConsumer.java:43) at org.gradle.launcher.daemon.client.DaemonClient.monitorBuild(DaemonClient.java:260) at org.gradle.launcher.daemon.client.DaemonClient.executeBuild(DaemonClient.java:209) at org.gradle.launcher.daemon.client.DaemonClient.execute(DaemonClient.java:172) at org.gradle.launcher.daemon.client.DaemonClient.execute(DaemonClient.java:97) at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:44) at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:30) at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:59) at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:38) at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:273) at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:181) at org.gradle.tooling.internal.provider.DefaultConnection.getModel(DefaultConnection.java:151) at org.gradle.tooling.internal.consumer.connection.CancellableModelBuilderBackedModelProducer.produceModel(CancellableModelBuilderBackedModelProducer.java:53) at org.gradle.tooling.internal.consumer.connection.PluginClasspathInjectionSupportedCheckModelProducer.produceModel(PluginClasspathInjectionSupportedCheckModelProducer.java:38) at org.gradle.tooling.internal.consumer.connection.AbstractConsumerConnection.run(AbstractConsumerConnection.java:64) at org.gradle.tooling.internal.consumer.connection.ParameterValidatingConsumerConnection.run(ParameterValidatingConsumerConnection.java:49) at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:96) at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:88) at org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.run(LazyConsumerActionExecutor.java:143) at org.gradle.tooling.internal.consumer.connection.CancellableConsumerActionExecutor.run(CancellableConsumerActionExecutor.java:45) at org.gradle.tooling.internal.consumer.connection.ProgressLoggingConsumerActionExecutor.run(ProgressLoggingConsumerActionExecutor.java:61) at org.gradle.tooling.internal.consumer.connection.RethrowingErrorsConsumerActionExecutor.run(RethrowingErrorsConsumerActionExecutor.java:38) at org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:66) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Caused: org.gradle.tooling.ListenerFailedException: Could not execute build using connection to Gradle installation '/home/patton/.gradle/wrapper/dists/gradle-9.0.0-bin/d6wjpkvcgsg3oed0qlfss3wgl/gradle-9.0.0'. at org.gradle.tooling.internal.consumer.ConnectionExceptionTransformer.transform(ConnectionExceptionTransformer.java:71) at org.gradle.tooling.internal.consumer.ResultHandlerAdapter.onFailure(ResultHandlerAdapter.java:42) at org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:68) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) at org.gradle.tooling.internal.consumer.BlockingResultHandler.getResult(BlockingResultHandler.java:46) at org.gradle.tooling.internal.consumer.DefaultBuildLauncher.run(DefaultBuildLauncher.java:82) at org.netbeans.modules.gradle.execute.GradleDaemonExecutor.run(GradleDaemonExecutor.java:261) at org.netbeans.core.execution.RunClassThread.doRun(RunClassThread.java:131) at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45) at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287) [catch] at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:80) --- .../gradle/test/GradleTestProgressListener.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/java/gradle.test/src/org/netbeans/modules/gradle/test/GradleTestProgressListener.java b/java/gradle.test/src/org/netbeans/modules/gradle/test/GradleTestProgressListener.java index c9c4a4417350..a7e224473a1f 100644 --- a/java/gradle.test/src/org/netbeans/modules/gradle/test/GradleTestProgressListener.java +++ b/java/gradle.test/src/org/netbeans/modules/gradle/test/GradleTestProgressListener.java @@ -355,17 +355,23 @@ private String searchLocation(Testcase tc, String className, String methodName, .values() .stream() .flatMap(gradleJavaSourceSet -> gradleJavaSourceSet.getSourceDirs(SourceType.JAVA).stream()) + .distinct() .collect( Collectors.toMap( f -> ClasspathInfo.create(f), - f -> f.toPath() + f -> f.toPath(), + // Should not happen, each path is only considered once (see distinct() before) + // in any case this would catch it + (f1, f2) -> f1 ) ); } String relativePath = null; for (Map.Entry ci : classpathInfo.entrySet()) { - if (ci.getKey() == null) continue; + if (ci.getKey() == null) { + continue; + } FileObject fo = SourceUtils.getFile(ElementHandle.createTypeElementHandle(ElementKind.CLASS, className), ci.getKey()); if (fo != null) { relativePath = ci.getValue().relativize(FileUtil.toFile(fo).toPath()).toString();