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 9114b1069e Avoid ConcurrentMod exception, tolerate broken project 
dependencies (#5660)
9114b1069e is described below

commit 9114b1069e0e0cf7cdf188ba368d0e68a3ba5511
Author: Svatopluk Dedic <svatopluk.de...@oracle.com>
AuthorDate: Tue Mar 21 12:22:45 2023 +0100

    Avoid ConcurrentMod exception, tolerate broken project dependencies (#5660)
    
    * Prevent NPE on broken dependencies with no artifacts.
    * Make copy of task list before iterating - task map can mutate.
---
 .../modules/cloud/oracle/adm/VulnerabilityWorker.java     | 15 ++++++++++++---
 .../modules/gradle/tooling/NbProjectInfoBuilder.java      |  6 ++++--
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/VulnerabilityWorker.java
 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/VulnerabilityWorker.java
index dea435f0a1..8546d792f0 100644
--- 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/VulnerabilityWorker.java
+++ 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/VulnerabilityWorker.java
@@ -168,7 +168,7 @@ public class VulnerabilityWorker implements ErrorProvider{
         
         private void buildDependecyMap(Dependency dependency, Map<String, 
Dependency> result) {
             String gav = createGAV(dependency.getArtifact());
-            if (result.putIfAbsent(gav, dependency) == null) {
+            if (gav != null && result.putIfAbsent(gav, dependency) == null) {
                 dependency.getChildren().forEach((childDependency) -> {
                     buildDependecyMap(childDependency, result);
                 });
@@ -557,6 +557,9 @@ public class VulnerabilityWorker implements ErrorProvider{
     
     private int convert(Dependency dependency, Map<String, Integer> gavIndex, 
List<ApplicationDependency> result) {
         String gav = createGAV(dependency.getArtifact());
+        if (gav == null) {
+            return -1;
+        }
         Integer n = gavIndex.get(gav);
         if (n != null) {
             return n;
@@ -569,7 +572,9 @@ public class VulnerabilityWorker implements ErrorProvider{
         List<String> childrenNodeIds = new 
ArrayList<>(dependency.getChildren().size());
         for (Dependency childDependency : dependency.getChildren()) {
             int cid = convert(childDependency, gavIndex, result);
-            childrenNodeIds.add(Integer.toString(cid));
+            if (cid != -1) {
+                childrenNodeIds.add(Integer.toString(cid));
+            }
         }
         builder.applicationDependencyNodeIds(childrenNodeIds);
         result.add(builder.build());
@@ -577,7 +582,11 @@ public class VulnerabilityWorker implements ErrorProvider{
     }
 
     private static String createGAV(ArtifactSpec artifact) {
-        StringBuffer sb = new StringBuffer();
+        if (artifact == null) {
+            return null;
+        }
+        // use a random constant that could be sufficient to hold gav text 
(micronaut-core has max 86)
+        StringBuilder sb = new StringBuilder(120); 
         sb.append(artifact.getGroupId()).append(':');
         sb.append(artifact.getArtifactId()).append(':');
         sb.append(artifact.getVersionSpec());
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 ae319060ae..193f4a3cee 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
@@ -290,7 +290,8 @@ class NbProjectInfoBuilder {
         Map<String, Object> taskProperties = new HashMap<>();
         Map<String, String> taskPropertyTypes = new HashMap<>();
         
-        for (Task task : project.getTasks().getAsMap().values()) {
+        // make a copy of the task map; may mutate.
+        for (Task task : new 
ArrayList<>(project.getTasks().getAsMap().values())) {
             Class taskClass = task.getClass();
             Class nonDecorated = findNonDecoratedClass(taskClass);
             
@@ -305,7 +306,8 @@ class NbProjectInfoBuilder {
     private void detectTaskDependencies(NbProjectInfoModel model) {
         Map<String, Object> tasks = new HashMap<>();
         
-        for (Task task : project.getTasks().getAsMap().values()) {
+        // make a copy of the task map; may mutate.
+        for (Task task : new 
ArrayList<>(project.getTasks().getAsMap().values())) {
             Map<String, String> taskInfo = new HashMap<>();
             taskInfo.put("name", task.getPath()); // NOI18N
             taskInfo.put("enabled", Boolean.toString(task.getEnabled())); // 
NOI18N


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to