This is an automated email from the ASF dual-hosted git repository.
sdedic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 151296b004 #6536, #6537: avoid stack overflow, catch missing artifacts
to be downloaded.
new 0625641ec3 Merge pull request #6548 from
sdedic/gradle/detect-offline-stack-overflow
151296b004 is described below
commit 151296b0042832647702f6fa304f28a1e57f67b5
Author: Svata Dedic <[email protected]>
AuthorDate: Mon Oct 9 17:24:41 2023 +0200
#6536, #6537: avoid stack overflow, catch missing artifacts to be
downloaded.
---
.../gradle/tooling/NbProjectInfoBuilder.java | 72 ++++++++++++++--------
1 file changed, 47 insertions(+), 25 deletions(-)
diff --git
a/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java
b/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java
index 805f81c20b..66445fc31f 100644
---
a/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java
+++
b/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java
@@ -40,6 +40,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.IdentityHashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
@@ -102,7 +103,7 @@ import org.gradle.api.tasks.SourceSetContainer;
import org.gradle.api.tasks.TaskDependency;
import org.gradle.api.tasks.bundling.Jar;
import org.gradle.api.tasks.testing.Test;
-import org.gradle.internal.extensibility.DefaultExtraPropertiesExtension;
+import org.gradle.internal.resolve.ArtifactResolveException;
import org.gradle.jvm.JvmLibrary;
import org.gradle.language.base.artifact.SourcesArtifact;
import org.gradle.language.java.artifact.JavadocArtifact;
@@ -274,7 +275,7 @@ class NbProjectInfoBuilder {
addTypes(nonDecorated, classes);
return
classes.stream().map(Class::getName).sorted().collect(Collectors.joining(","));
}
-
+
private static final Set<String> EXCLUDE_TASK_PROPERTIES = new
HashSet<>(Arrays.asList(
"dependsOn",
"project",
@@ -418,6 +419,10 @@ class NbProjectInfoBuilder {
long time = System.currentTimeMillis();
try {
r.run();
+ } catch (RuntimeException ex) {
+ // convert will eventually throw a different exception
+ convertOfflineException(ex);
+ LOG.debug("Error encountered during {0}: {1}", s, ex);
} finally {
long span = System.currentTimeMillis() - time;
model.registerPerf(s, span);
@@ -509,8 +514,14 @@ class NbProjectInfoBuilder {
public static final String COLLECTION_KEYS_MARKER = "#keys"; // NOI18N
+ /**
+ * Prevents the recursive descent to loop back to an already processed
structure.
+ */
+ private Map<Object, Boolean> valueIdentities = new IdentityHashMap<>();
+
private static boolean isPrimitiveOrString(Class c) {
- if (c == Object.class) {
+ // Cannot export a Class as an object, the Class may not exist in the
netbeans VM.
+ if (c == Object.class || c == Class.class) {
return false;
}
String n = c.getName();
@@ -533,10 +544,15 @@ class NbProjectInfoBuilder {
}
private void inspectObjectAndValues(Class clazz, Object object, String
prefix, Map<String, Map<String, String>> globalTypes, Map<String, String>
propertyTypes, Map<String, Object> defaultValues, Set<String> excludes, boolean
type) {
+ if (valueIdentities.put(object, Boolean.TRUE) == Boolean.TRUE) {
+ return;
+ }
try {
inspectObjectAndValues0(clazz, object, prefix, globalTypes,
propertyTypes, defaultValues, excludes, type);
} catch (RuntimeException ex) {
LOG.warn("Error during inspection of {}, value {}, prefix {}",
clazz, object, prefix);
+ } finally {
+ valueIdentities.remove(object);
}
}
@@ -1188,12 +1204,16 @@ class NbProjectInfoBuilder {
model.getInfo().put(propBase + "classpath_compile",
storeSet(sourceSet.getCompileClasspath().getFiles()));
model.getInfo().put(propBase + "classpath_runtime",
storeSet(sourceSet.getRuntimeClasspath().getFiles()));
} catch(Exception e) {
+ convertOfflineException(e);
+ // will not be reached
model.noteProblem(e);
}
sinceGradle("4.6", () -> {
try {
model.getInfo().put(propBase +
"classpath_annotation", storeSet(getProperty(sourceSet,
"annotationProcessorPath", "files")));
} catch(Exception e) {
+ convertOfflineException(e);
+ // will not be reached
model.noteProblem(e);
}
model.getInfo().put(propBase +
"configuration_annotation", getProperty(sourceSet,
"annotationProcessorConfigurationName"));
@@ -1403,15 +1423,7 @@ class NbProjectInfoBuilder {
// hidden configurations like
'testCodeCoverageReportExecutionData' might contain unresolvable artifacts.
// do not report problems here
Throwable failure = ((UnresolvedDependencyResult)
it2).getFailure();
- if
(project.getGradle().getStartParameter().isOffline()) {
- // if the unresolvable is bcs. offline mode, throw
an exception to get retry in online mode.
- Throwable prev = null;
- for (Throwable t = failure; t != prev && t !=
null; prev = t, t = t.getCause()) {
- if (t.getMessage().contains("available for
offline")) {
- throw new NeedOnlineModeException("Need
online mode", failure);
- }
- }
- }
+ convertOfflineException(failure);
unresolvedProblems.putIfAbsent(id,
((UnresolvedDependencyResult) it2).getFailure().getMessage());
}
}
@@ -1419,6 +1431,18 @@ class NbProjectInfoBuilder {
}
}
+ private void convertOfflineException(Throwable failure) {
+ if (project.getGradle().getStartParameter().isOffline()) {
+ // if the unresolvable is bcs. offline mode, throw an exception to
get retry in online mode.
+ Throwable prev = null;
+ for (Throwable t = failure; t != prev && t != null; prev = t, t =
t.getCause()) {
+ if (t.getMessage().contains("available for offline")) {
+ throw new NeedOnlineModeException("Need online mode",
failure);
+ }
+ }
+ }
+ }
+
private void detectDependencies(NbProjectInfoModel model) {
Set<ComponentIdentifier> ids = new HashSet<>();
Map<String, File> projects = new HashMap<>();
@@ -1501,15 +1525,7 @@ class NbProjectInfoBuilder {
// hidden configurations like
'testCodeCoverageReportExecutionData' might contain unresolvable artifacts.
// do not report problems here
Throwable failure =
((UnresolvedDependencyResult) it2).getFailure();
- if
(project.getGradle().getStartParameter().isOffline()) {
- // if the unresolvable is bcs. offline
mode, throw an exception to get retry in online mode.
- Throwable prev = null;
- for (Throwable t = failure; t != prev && t
!= null; prev = t, t = t.getCause()) {
- if (t.getMessage().contains("available
for offline")) {
- throw new
NeedOnlineModeException("Need online mode", failure);
- }
- }
- }
+ convertOfflineException(failure);
unresolvedProblems.put(id,
((UnresolvedDependencyResult) it2).getFailure().getMessage());
}
}
@@ -1581,10 +1597,16 @@ class NbProjectInfoBuilder {
resolvedJvmArtifacts.putIfAbsent(a.getId().getComponentIdentifier().toString(),
Collections.singleton(a.getFile()));
}
});
- it.getResolvedConfiguration()
- .getLenientConfiguration()
-
.getFirstLevelModuleDependencies(Specs.SATISFIES_ALL)
- .forEach(rd -> collectArtifacts(rd,
resolvedJvmArtifacts));
+ try {
+ it.getResolvedConfiguration()
+ .getLenientConfiguration()
+
.getFirstLevelModuleDependencies(Specs.SATISFIES_ALL)
+ .forEach(rd -> collectArtifacts(rd,
resolvedJvmArtifacts));
+ } catch (ArtifactResolveException ex) {
+ convertOfflineException(ex);
+ // will not be reached, if the exception is converted
+ throw ex;
+ }
} catch (NullPointerException ex) {
//This can happen if the configuration resolution had
issues
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists