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 57d8de11ad Better messages during project audit. Code cleanup.
     new 9d40ed1095 Merge pull request #4733 from sdedic/adm/execute-on-demand
57d8de11ad is described below

commit 57d8de11ad333278f345affe97f359ecf1cd467d
Author: Svata Dedic <[email protected]>
AuthorDate: Tue Oct 4 17:22:45 2022 +0200

    Better messages during project audit. Code cleanup.
---
 .../modules/cloud/oracle/adm/AuditException.java   | 42 ++++++++++++
 .../oracle/adm/CreateKnowledgeBaseAction.java      |  1 -
 .../modules/cloud/oracle/adm/ErrorUtils.java       | 10 ++-
 .../cloud/oracle/adm/KnowledgeBaseItem.java        |  4 ++
 .../cloud/oracle/adm/ProjectVulnerability.java     | 20 ++++--
 .../modules/cloud/oracle/adm/RunFileADMAction.java | 29 ++++-----
 .../cloud/oracle/adm/VulnerabilityWorker.java      | 74 ++++++++++++++--------
 .../integration/commands/ProjectAuditCommand.java  | 41 +++++++++---
 8 files changed, 166 insertions(+), 55 deletions(-)

diff --git 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/AuditException.java
 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/AuditException.java
new file mode 100644
index 0000000000..ab34303a19
--- /dev/null
+++ 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/AuditException.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.cloud.oracle.adm;
+
+/**
+ *
+ * @author sdedic
+ */
+public final class AuditException extends Exception {
+    private final int statusCode;
+    private final String requestId;
+
+    public AuditException(int statusCode, String requestId, String message, 
Throwable cause) {
+        super(message, cause);
+        this.statusCode = statusCode;
+        this.requestId = requestId;
+    }
+
+    public int getStatusCode() {
+        return statusCode;
+    }
+
+    public String getRequestId() {
+        return requestId;
+    }
+}
diff --git 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/CreateKnowledgeBaseAction.java
 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/CreateKnowledgeBaseAction.java
index b8755c35ad..bae35138f1 100644
--- 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/CreateKnowledgeBaseAction.java
+++ 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/CreateKnowledgeBaseAction.java
@@ -103,7 +103,6 @@ public class CreateKnowledgeBaseAction implements 
ActionListener {
                         ErrorUtils.processError(response, 
Bundle.MSG_KBNotCreated(result.get()));
                     }
                 } catch (BmcException e) {
-                    System.out.println("Proces exception");
                     ErrorUtils.processError(e, 
Bundle.MSG_KBNotCreated(result.get()));
                 } finally {
                     progressHandle.finish();
diff --git 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ErrorUtils.java
 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ErrorUtils.java
index d78f8bf120..08049f4d41 100644
--- 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ErrorUtils.java
+++ 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ErrorUtils.java
@@ -53,6 +53,14 @@ class ErrorUtils {
         } 
     }
     
+    public static void processError(AuditException exc, String errorMessage) {
+        StringBuilder sb = new StringBuilder(errorMessage);
+        sb.append('\n').append(Bundle.MSG_Error_Code(exc.getStatusCode()));
+        sb.append(getErrorDescription(exc.getStatusCode()));
+        sb.append('\n').append(exc.getMessage());
+        DialogDisplayer.getDefault().notifyLater(new 
NotifyDescriptor.Message(sb.toString()));
+    }
+    
     public static void processError(BmcResponse reqest, String errorMessage) {
         StringBuilder sb = new StringBuilder(errorMessage);
         
sb.append('\n').append(Bundle.MSG_Error_Code(reqest.get__httpStatusCode__()));
@@ -64,7 +72,7 @@ class ErrorUtils {
        StringBuilder sb = new StringBuilder(errorMessage);
         sb.append('\n').append(Bundle.MSG_Error_Code(exc.getStatusCode()));
         sb.append(getErrorDescription(exc.getStatusCode()));
-        sb.append('n').append(exc.getMessage());
+        sb.append('\n').append(exc.getMessage());
         DialogDisplayer.getDefault().notifyLater(new 
NotifyDescriptor.Message(sb.toString()));
    }
 }
diff --git 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/KnowledgeBaseItem.java
 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/KnowledgeBaseItem.java
index b4050f88c2..04005a5d7a 100644
--- 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/KnowledgeBaseItem.java
+++ 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/KnowledgeBaseItem.java
@@ -24,6 +24,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -76,6 +77,9 @@ public class KnowledgeBaseItem extends OCIItem implements 
URLProvider{
         
         synchronized (KnowledgeBaseItem.class) {
             Collection<Reference<KnowledgeBaseItem>> refItems = 
itemInstances.get(ocid);
+            if (refItems == null) {
+                return Collections.emptyList();
+            }
             for (Iterator<Reference<KnowledgeBaseItem>> it = 
refItems.iterator(); it.hasNext(); ) {
                 Reference<KnowledgeBaseItem> r = it.next();
                 KnowledgeBaseItem i = r.get();
diff --git 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ProjectVulnerability.java
 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ProjectVulnerability.java
index 153e29b52b..3b9829b5d2 100644
--- 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ProjectVulnerability.java
+++ 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ProjectVulnerability.java
@@ -22,14 +22,17 @@ import 
com.oracle.bmc.adm.ApplicationDependencyManagementClient;
 import com.oracle.bmc.adm.model.KnowledgeBase;
 import com.oracle.bmc.adm.requests.GetKnowledgeBaseRequest;
 import com.oracle.bmc.adm.responses.GetKnowledgeBaseResponse;
+import com.oracle.bmc.model.BmcException;
 import java.util.Collection;
 import java.util.Date;
 import java.util.concurrent.CompletableFuture;
 import org.netbeans.api.project.Project;
+import org.netbeans.api.project.ProjectUtils;
 import org.netbeans.modules.cloud.oracle.OCIManager;
 import org.netbeans.modules.cloud.oracle.items.OCID;
 import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
 import org.netbeans.spi.project.ProjectServiceProvider;
+import org.openide.util.NbBundle;
 import org.openide.util.RequestProcessor;
 
 /**
@@ -62,17 +65,24 @@ public final class ProjectVulnerability {
         }
     }
     
-    public CompletableFuture<Void> runProjectAudit(KnowledgeBaseItem item, 
boolean force) {
+    @NbBundle.Messages({
+        "# {0} - project name",
+        "MSG_CreatingAuditFailed=Creating Vulnerablity audit for project {0} 
failed.",
+    })
+    public CompletableFuture<String> runProjectAudit(KnowledgeBaseItem item, 
boolean force, boolean runIfNoReport) {
         if (item != null) {
             setProjectKnowledgeBase(item);
         }
-        CompletableFuture<Void> result = new CompletableFuture<>();
+        CompletableFuture<String> result = new CompletableFuture<>();
         AUDIT_PROCESSOR.post(() -> {
             try {
-                VulnerabilityWorker.getInstance().findVulnerability(project, 
force);
-                result.complete(null);
+                
result.complete(VulnerabilityWorker.getInstance().findVulnerability(project, 
force, runIfNoReport));
             } catch (ThreadDeath x) {
                 throw x;
+            } catch (AuditException ex) {
+                final String projectDisplayName = 
ProjectUtils.getInformation(project).getDisplayName();
+                ErrorUtils.processError(ex, 
Bundle.MSG_CreatingAuditFailed(projectDisplayName));
+                result.completeExceptionally(ex);
             } catch (Exception | Error e) {
                 result.completeExceptionally(e);
             }
@@ -100,6 +110,8 @@ public final class ProjectVulnerability {
                 );
             } catch (ThreadDeath x) {
                 throw x;
+            } catch (BmcException ex) {
+                result.completeExceptionally(new 
AuditException(ex.getStatusCode(), ex.getOpcRequestId(), ex.getMessage(), ex));
             } catch (Exception | Error e) {
                 result.completeExceptionally(e);
             }
diff --git 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/RunFileADMAction.java
 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/RunFileADMAction.java
index b33f2b2404..742425cb05 100644
--- 
a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/RunFileADMAction.java
+++ 
b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/RunFileADMAction.java
@@ -18,6 +18,7 @@
  */
 package org.netbeans.modules.cloud.oracle.adm;
 
+import com.oracle.bmc.model.BmcException;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.Optional;
@@ -64,31 +65,29 @@ public class RunFileADMAction implements ActionListener{
     }
     
     
+    @NbBundle.Messages({
+        "MSG_ProjectAuditInfo=Project Audits in GraalVM Ext Pack performs 
check for vulnerable dependencies using Vulnerabilities knowledgebase in Oracle 
OCI. If you want to learn more and setup OCI account, go to 
https://www.oracle.com/cloud/free/ .",
+        "# {0} - project display name",
+        "MSG_ProjectAuditNoKB=No Knowlege Base assigned for {0}.\n Select or 
create in Cloud Explorer a Knowledge Base, where to run Vulnerability Audit for 
this project."
+    })
     @Override
     public void actionPerformed(ActionEvent e) {
         Project project = FileOwnerQuery.getOwner(file);
-        System.out.println("Running adm action:");
-        System.out.println("  Project: " + project.toString());
-        System.out.println("  File: " + file.getPath());
-//        CloudResourcesStorage storage = 
project.getLookup().lookup(CloudResourcesStorage.class);
         KnowledgeBaseItem kbItem = 
VulnerabilityWorker.getKnowledgeBaseForProject(project);
+        final String projectDisplayName = 
ProjectUtils.getInformation(project).getDisplayName();
         if (kbItem != null) {
-            VulnerabilityWorker.getInstance().findVulnerability(project, true);
+            try {
+                VulnerabilityWorker.getInstance().findVulnerability(project, 
true, true);
+            } catch (AuditException exc) {
+                ErrorUtils.processError(exc, 
Bundle.MSG_CreatingAuditFailed(projectDisplayName));
+            }
         } else {
-            System.out.println("!!!!!! KnowledgeBase neni");
             if (OCIManager.getDefault().getConfigProvider() == null
                     || 
OCIManager.getDefault().getTenancy().equals(Optional.empty())) {
-                String message = "Project Audits in GraalVM Ext Pack performs 
check for "
-                        + "vulnerable dependencies using Vulnerabilities 
knowledgebase in Oracle OCI. "
-                        + "If you want to learn more and setup OCI account, go 
to https://www.oracle.com/cloud/free/ .";
-                DialogDisplayer.getDefault().notifyLater(new 
NotifyDescriptor.Message(message));
+                DialogDisplayer.getDefault().notifyLater(new 
NotifyDescriptor.Message(Bundle.MSG_ProjectAuditInfo()));
             } else {
-                String message = "No Knowlege Base assigned for " + 
ProjectUtils.getInformation(project).getDisplayName() 
-                        + ".\n Select or create in Cloud Explorer a Knowledge 
Base, where to run Vulnerability Audit for this project.";
-                DialogDisplayer.getDefault().notifyLater(new 
NotifyDescriptor.Message(message));
+                DialogDisplayer.getDefault().notifyLater(new 
NotifyDescriptor.Message(Bundle.MSG_ProjectAuditNoKB(projectDisplayName)));
             }
-            System.out.println("Config provider: " + 
OCIManager.getDefault().getConfigProvider());
-            System.out.println("Tenancy: " + 
OCIManager.getDefault().getTenancy());
         }
     }
     
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 a721e28283..8d862596ad 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
@@ -46,6 +46,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.swing.event.ChangeEvent;
@@ -78,24 +79,25 @@ import org.openide.util.RequestProcessor;
  */
 @NbBundle.Messages({
     "# {0} - project name",
-    "MSG_Audit_Pass=Vulnerability audit for project {0} is done.\nNo 
vulnerable dependency was found.",
+    "MSG_Audit_Pass=Vulnerability audit for project {0} is done.\nNo 
vulnerability was found.",
     "# {0} - project name",
-    "MSG_Audit_Failed_One=Vulnerability audit for project {0} is done.\nOne 
vulnerable dependency was found.\nThe vulnerability is listed in Problems 
window.",
+    "MSG_Audit_Failed_One=Vulnerability audit for project {0} is done.\nOne 
vulnerability was found.\nThe vulnerability is listed in Problems window.",
     "# {0} - project name",
     "# {1} - number of vulnerabilities",
-    "MSG_Audit_Failed_More=Vulnerability audit for project {0} is done.\n{1} 
vulnerable dependencies were found.\nThe vulnerabilities are listed in Problems 
window.",
-    "# {0} - project name",
-    "MSG_CreatingAuditFailed=Creating Vulnerablity audit for project {0} 
failed.",
+    "MSG_Audit_Failed_More=Vulnerability audit for project {0} is done.\n{1} 
vulnerabilities were found.\nThe vulnerabilities are listed in Problems 
window.",
     "# {0} - project name",
     "MSG_ListingAuditFailed=Obtaining newly created vulnerablity audit for 
project {0} failed.",
     "MSG_ListingVulnerabilitiesFailed=Obtaining vulnerabilities for newly 
created audit failed.",
     "# {0} - project name",
-    "MSG_AuditIsRunning=Audit of {0} project is running ...",
+    "MSG_AuditIsRunning=Checking for audit of project {0}",
     "MSG_NotAvailable=Not available",
     "MSG_Diagnostic=Vulnerability\n"
             + "  Cvss V2 Score: %s\n"
             + "  Cvss V3 Score: %s\n"
-            + "  Caused by dependence: %s"
+            + "  Caused by dependence: %s",
+    "MSG_SearchingAuditReport=Searching for audit reports...",
+    "MSG_AuditCollectDependencies=Collecting project dependencies...",
+    "MSG_ExecuteAudit=Executing audit..."
 })
  
 @MimeRegistrations({
@@ -364,31 +366,37 @@ public class VulnerabilityWorker implements ErrorProvider{
         return instance;
     }
 
-    public void findVulnerability(Project project, boolean forceAudit) {
+    /**
+     * @param project
+     * @param forceAudit
+     * @return Returns the audit ID, or {@code null} if no audit is present.
+     */
+    public String findVulnerability(Project project, boolean forceAudit, 
boolean runIfNoReport) throws AuditException {
         LOG.log(Level.FINER, "Trying to obtain audit for project {0}, 
force:{1}", new Object[] { project, forceAudit });
         final String projectDisplayName = 
ProjectUtils.getInformation(project).getDisplayName();
         KnowledgeBaseItem kbItem = getKnowledgeBaseForProject(project);
         if (kbItem == null) {
-            return;
+            return null;
         }
         
         // remove from the cache old values
         ProgressHandle progressHandle = 
ProgressHandle.createHandle(Bundle.MSG_AuditIsRunning(projectDisplayName));
-        progressHandle.start();
+        AtomicBoolean remoteCall = new AtomicBoolean(false);
         try {
-            doFindVulnerability(project, kbItem.compartmentId, 
kbItem.getKey().getValue(), 
-                    projectDisplayName, progressHandle, forceAudit);
+            return doFindVulnerability(project, kbItem.compartmentId, 
kbItem.getKey().getValue(), 
+                    projectDisplayName, progressHandle, forceAudit, 
runIfNoReport, remoteCall);
         } finally {
-            progressHandle.finish();
+            if (remoteCall.get()) {
+                progressHandle.close();
+            }
             kbItem.refresh();
         }
     }
 
-    public void doFindVulnerability(Project project, String compartmentId, 
String knowledgeBaseId, String projectDisplayName,
-            ProgressHandle progressHandle, boolean forceAudit) {
-        DependencyResult dr = ProjectDependencies.findDependencies(project, 
ProjectDependencies.newQuery(Scopes.RUNTIME));
+    private String doFindVulnerability(Project project, String compartmentId, 
String knowledgeBaseId, String projectDisplayName,
+            ProgressHandle progressHandle, boolean forceAudit, boolean 
runIfNoReport, AtomicBoolean remoteCall) throws AuditException {
+        DependencyResult dr = null;
         List<ApplicationDependency> result = new ArrayList();
-        convert(dr.getRoot(), new HashMap<>(), result);
         
         CacheItem cacheItem = null;
         VulnerabilityReport savedAudit = null;
@@ -405,6 +413,9 @@ public class VulnerabilityWorker implements ErrorProvider{
         
         if (!forceAudit && savedAudit == null) {
             // attempt to find an active most recent audit:
+            remoteCall.set(true);
+            progressHandle.start();
+            progressHandle.progress(Bundle.MSG_SearchingAuditReport());
             try (ApplicationDependencyManagementClient admClient
                     = new 
ApplicationDependencyManagementClient(OCIManager.getDefault().getConfigProvider()))
 {
                 ListVulnerabilityAuditsRequest request = 
ListVulnerabilityAuditsRequest
@@ -417,6 +428,9 @@ public class VulnerabilityWorker implements ErrorProvider{
                 ListVulnerabilityAuditsResponse response = 
admClient.listVulnerabilityAudits(request);
                 if 
(!response.getVulnerabilityAuditCollection().getItems().isEmpty()) {
                     VulnerabilityAuditSummary summary = 
response.getVulnerabilityAuditCollection().getItems().get(0);
+                    
progressHandle.progress(Bundle.MSG_AuditCollectDependencies());
+                    dr = ProjectDependencies.findDependencies(project, 
ProjectDependencies.newQuery(Scopes.RUNTIME));
+                    convert(dr.getRoot(), new HashMap<>(), result);
                     cacheItem = fetchVulnerabilityItems(project, admClient, 
dr, summary, projectDisplayName);
                     savedAudit = new VulnerabilityReport(cacheItem.getAudit(), 
cacheItem.getVulnerabilities());
                 }
@@ -427,7 +441,15 @@ public class VulnerabilityWorker implements ErrorProvider{
             }
         }
         
-        if (savedAudit == null && forceAudit) {
+        if (savedAudit == null && (runIfNoReport || forceAudit)) {
+            if (remoteCall.compareAndSet(false, true)) {
+                progressHandle.start();
+            }
+            if (dr == null) {
+                progressHandle.progress(Bundle.MSG_AuditCollectDependencies());
+                dr = ProjectDependencies.findDependencies(project, 
ProjectDependencies.newQuery(Scopes.RUNTIME));
+                convert(dr.getRoot(), new HashMap<>(), result);
+            }
             try (ApplicationDependencyManagementClient admClient
                     = new 
ApplicationDependencyManagementClient(OCIManager.getDefault().getConfigProvider()))
 {
                 final VulnerabilityAuditConfiguration auditConfiguration = 
VulnerabilityAuditConfiguration
@@ -445,20 +467,19 @@ public class VulnerabilityWorker implements ErrorProvider{
                         .configuration(auditConfiguration)
                         .applicationDependencies(result)
                         .build();
+                progressHandle.progress(Bundle.MSG_ExecuteAudit());
                 CreateVulnerabilityAuditResponse response = 
admClient.createVulnerabilityAudit(CreateVulnerabilityAuditRequest
                         .builder()
                         .createVulnerabilityAuditDetails(auditDetails)
                         .build());
                 if (response.get__httpStatusCode__() != 201 && 
response.get__httpStatusCode__() != 200) {
-                    ErrorUtils.processError(response, 
Bundle.MSG_CreatingAuditFailed(projectDisplayName));
-                    return;
+                    throw new BmcException(response.get__httpStatusCode__(), 
null, null, response.getOpcRequestId());
                 }
                 // audit is ok
                 cacheItem = waitToAuditFinish(project, admClient, dr, 
response.getVulnerabilityAudit(), projectDisplayName);
                 auditDone = true;
             } catch (BmcException exc) {
-                ErrorUtils.processError(exc, compartmentId);
-                return;
+                throw new AuditException(exc.getStatusCode(), 
exc.getOpcRequestId(), exc.getMessage(), exc);
             } finally {
                 progressHandle.finish();
             }
@@ -489,6 +510,10 @@ public class VulnerabilityWorker implements ErrorProvider{
             }
             Diagnostic.ReporterControl reporter = 
Diagnostic.findReporterControl(Lookup.getDefault(), 
project.getProjectDirectory());
             reporter.diagnosticChanged(problematicFiles, null);
+            return cacheItem.report.summary.getId();
+        } else {
+            // indicate somehow the KB exists, but empty
+            return "";
         }
     }
     
@@ -527,7 +552,7 @@ public class VulnerabilityWorker implements ErrorProvider{
     }
 
     private CacheItem waitToAuditFinish(Project project, 
ApplicationDependencyManagementClient client, 
-            DependencyResult dr, VulnerabilityAudit audit, String projectName) 
{                
+            DependencyResult dr, VulnerabilityAudit audit, String projectName) 
throws AuditException {                
         ListVulnerabilityAuditsRequest request = 
ListVulnerabilityAuditsRequest.builder()
                 
.knowledgeBaseId(audit.getKnowledgeBaseId()).id(audit.getId()).build();
         VulnerabilityAuditSummary auditSummary;
@@ -544,8 +569,7 @@ public class VulnerabilityWorker implements ErrorProvider{
             }
             ListVulnerabilityAuditsResponse response = 
client.listVulnerabilityAudits(request);
             if (response.get__httpStatusCode__() != 200) {
-                ErrorUtils.processError(response, 
Bundle.MSG_ListingAuditFailed(projectName));
-                return null;
+                throw new AuditException(response.get__httpStatusCode__(), 
response.getOpcRequestId(), Bundle.MSG_ListingAuditFailed(projectName), null);
             }
             List<VulnerabilityAuditSummary> items = 
response.getVulnerabilityAuditCollection().getItems();
             auditSummary = items.get(0);
diff --git 
a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/commands/ProjectAuditCommand.java
 
b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/commands/ProjectAuditCommand.java
index 5d162549cd..7398d075df 100644
--- 
a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/commands/ProjectAuditCommand.java
+++ 
b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/commands/ProjectAuditCommand.java
@@ -37,13 +37,18 @@ import org.netbeans.api.project.FileOwnerQuery;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectInformation;
 import org.netbeans.api.project.ProjectUtils;
+import org.netbeans.modules.cloud.oracle.adm.AuditException;
 import org.netbeans.modules.cloud.oracle.adm.ProjectVulnerability;
 import org.netbeans.modules.java.lsp.server.protocol.CodeActionsProvider;
 import org.netbeans.modules.java.lsp.server.protocol.NbCodeLanguageClient;
 import org.netbeans.modules.parsing.api.ResultIterator;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.awt.StatusDisplayer;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 import org.openide.filesystems.URLMapper;
+import org.openide.util.NbBundle;
 import org.openide.util.lookup.ServiceProvider;
 
 /**
@@ -74,6 +79,11 @@ public class ProjectAuditCommand extends CodeActionsProvider 
{
     
     private final Gson gson = new Gson();
 
+    @NbBundle.Messages({
+        "# {0} - project name",
+        "# {1} - cause message",
+        "ERR_KnowledgeBaseSearchFailed=Could not search for knowledge base of 
project {0}: {1}"
+    })
     @Override
     public CompletableFuture<Object> processCommand(NbCodeLanguageClient 
client, String command, List<Object> arguments) {
         if (arguments.size() < 3) {
@@ -102,23 +112,36 @@ public class ProjectAuditCommand extends 
CodeActionsProvider {
         }
         String compartment = ((JsonPrimitive) arguments.get(2)).getAsString();
         String knowledgeBase = ((JsonPrimitive) 
arguments.get(1)).getAsString();
-        
-        return v.findKnowledgeBase(compartment, 
knowledgeBase).thenCompose((kb) -> {
+        boolean forceAudit;
+        if (arguments.size() > 4) {
+            forceAudit = ((JsonPrimitive)arguments.get(4)).getAsBoolean();
+        } else {
+            forceAudit = false;
+        }
+        final String fn = n;
+        return v.findKnowledgeBase(compartment, knowledgeBase).
+                exceptionally(th -> {
+                    DialogDisplayer.getDefault().notify(new 
NotifyDescriptor.Message(Bundle.ERR_KnowledgeBaseSearchFailed(fn, 
th.getMessage()),
+                            NotifyDescriptor.ERROR_MESSAGE));
+                    return null;
+                }).thenCompose((kb) -> {
             if (kb == null) {
-                throw new IllegalArgumentException("Unknown Knowledgebase " + 
knowledgeBase);
+                return CompletableFuture.completedFuture(null);
             }
-
+            CompletableFuture<String> exec;
+            
             switch (command) {
                 case COMMAND_EXECUTE_AUDIT:
-                    v.runProjectAudit(kb, true);
-                    break;
-                case COMMAND_LOAD_AUDIT:
-                    v.runProjectAudit(kb, false);
+                    exec = v.runProjectAudit(kb, true, true);
                     break;
+                case COMMAND_LOAD_AUDIT: {
+                    exec = v.runProjectAudit(kb, false, forceAudit);
+                }
                 default:
+                    return CompletableFuture.completedFuture(null);
                     
             }
-            return CompletableFuture.completedFuture(null);
+            return (CompletableFuture<Object>)(CompletableFuture)exec;
         });
     } 
 


---------------------------------------------------------------------
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

Reply via email to