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 137a803  [NETBEANS-5430] Implemened ActionProvider.COMMAND_PRIME for 
gradle projects.
     new decaf33  Merge pull request #2816 from sdedic/gradle/primingAction
137a803 is described below

commit 137a803e33ed585b525c2398688fdc7179023a84
Author: Svata Dedic <svatopluk.de...@oracle.com>
AuthorDate: Thu Mar 18 15:14:01 2021 +0100

    [NETBEANS-5430] Implemened ActionProvider.COMMAND_PRIME for gradle projects.
---
 extide/gradle/manifest.mf                          |  2 +-
 .../modules/gradle/ActionProviderImpl.java         | 36 ++++++++++++++-
 .../gradle/GradleProjectProblemProvider.java       | 29 ++++--------
 .../modules/gradle/NbGradleProjectImpl.java        | 51 ++++++++++++++++++++++
 4 files changed, 96 insertions(+), 22 deletions(-)

diff --git a/extide/gradle/manifest.mf b/extide/gradle/manifest.mf
index a6c045d..fd992b0 100644
--- a/extide/gradle/manifest.mf
+++ b/extide/gradle/manifest.mf
@@ -3,4 +3,4 @@ AutoUpdate-Show-In-Client: false
 OpenIDE-Module: org.netbeans.modules.gradle/2
 OpenIDE-Module-Layer: org/netbeans/modules/gradle/layer.xml
 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/gradle/Bundle.properties
-OpenIDE-Module-Specification-Version: 2.8
+OpenIDE-Module-Specification-Version: 2.9
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/ActionProviderImpl.java 
b/extide/gradle/src/org/netbeans/modules/gradle/ActionProviderImpl.java
index a12e23a..3404b5e 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/ActionProviderImpl.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/ActionProviderImpl.java
@@ -60,6 +60,7 @@ import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.EnumSet;
+import java.util.logging.Level;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import static javax.swing.Action.NAME;
@@ -123,15 +124,42 @@ public class ActionProviderImpl implements ActionProvider 
{
         for (GradleActionsProvider provider : providers) {
             actions.addAll(provider.getSupportedActions());
         }
+        // add a fixed 'prime build' action
+        actions.add(ActionProvider.COMMAND_PRIME);
         return actions.toArray(new String[actions.size()]);
     }
-
+    
     @Override
     public void invokeAction(String command, Lookup context) throws 
IllegalArgumentException {
         if (COMMAND_DELETE.equals(command)) {
             DefaultProjectOperations.performDefaultDeleteOperation(project);
             return;
         }
+        if (ActionProvider.COMMAND_PRIME.equals(command)) {
+            // delegate to prooblem provider we know exists & is registered
+            NbGradleProjectImpl prjImpl = 
project.getLookup().lookup(NbGradleProjectImpl.class);
+            ActionProgress prg = ActionProgress.start(context);
+            LOG.log(Level.FINER, "Priming build starting for {0}", project);
+            if (prjImpl.isProjectPrimingRequired()) {
+                prjImpl.primeProject().
+                        thenAccept(gp -> {
+                            LOG.log(Level.FINER, "Priming build of {0} 
finished with status {1}, ", new Object[] { project, 
prjImpl.isProjectPrimingRequired() });
+                            prg.finished(prjImpl.isProjectPrimingRequired());
+                        }).
+                        exceptionally((e) -> { 
+                            LOG.log(Level.FINER, e, () -> 
String.format("Priming build errored: %s", project));
+                            prg.finished(false);
+                            return null;
+                        });
+                return;
+            } else {
+                // no action, but report finish to unblock potential observers
+                LOG.log(Level.FINER, "Priming build unncessary for {0}", 
project);
+                prg.finished(true);
+                return;
+            }
+            
+        }
         ActionMapping mapping = ActionToTaskUtils.getActiveMapping(command, 
project);
         invokeProjectAction(project, mapping, context, false);
     }
@@ -142,6 +170,12 @@ public class ActionProviderImpl implements ActionProvider {
             GradleBaseProject gbp = GradleBaseProject.get(project);
             return gbp != null && gbp.getSubProjects().isEmpty() && 
ProjectOperations.isDeleteOperationSupported(project);
         }
+        if (ActionProvider.COMMAND_PRIME.equals(command)) {
+            NbGradleProjectImpl prjImpl = 
project.getLookup().lookup(NbGradleProjectImpl.class);
+            boolean enabled = prjImpl.isProjectPrimingRequired();
+            LOG.log(Level.FINEST, "Priming build action for {0} is: {1}", new 
Object[] { project, enabled });
+            return enabled;
+        }
         return ActionToTaskUtils.isActionEnabled(command, project, context);
     }
 
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectProblemProvider.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectProblemProvider.java
index ee95173..1ad8ca7 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectProblemProvider.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectProblemProvider.java
@@ -26,7 +26,6 @@ import java.beans.PropertyChangeSupport;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
 import org.netbeans.api.project.Project;
 import org.netbeans.spi.project.ProjectServiceProvider;
@@ -35,7 +34,6 @@ import org.netbeans.spi.project.ui.ProjectProblemsProvider;
 
 import static org.netbeans.modules.gradle.api.NbGradleProject.Quality.*;
 import org.openide.util.NbBundle;
-import org.openide.util.RequestProcessor;
 
 /**
  *
@@ -43,9 +41,7 @@ import org.openide.util.RequestProcessor;
  */
 @ProjectServiceProvider(service = ProjectProblemsProvider.class, projectType = 
NbGradleProject.GRADLE_PROJECT_TYPE)
 public class GradleProjectProblemProvider implements ProjectProblemsProvider {
-
-    static final RequestProcessor GRADLE_RESOLVER_RP = new 
RequestProcessor("gradle-project-resolver", 1); //NOI18N
-
+    
     private final PropertyChangeSupport support = new 
PropertyChangeSupport(this);
     private final Project project;
     private final PropertyChangeListener listener;
@@ -92,25 +88,18 @@ public class GradleProjectProblemProvider implements 
ProjectProblemsProvider {
         }
         return ret;
     }
-
-    private class GradleProjectProblemResolver implements 
ProjectProblemResolver, Callable<Result> {
+    
+    private class GradleProjectProblemResolver implements 
ProjectProblemResolver {
 
         @Override
         public Future<Result> resolve() {
-            return GRADLE_RESOLVER_RP.submit(this);
-        }
-
-        @Override
-        public Result call() throws Exception {
-            ProjectTrust.getDefault().trustProject(project);
             NbGradleProjectImpl impl = 
project.getLookup().lookup(NbGradleProjectImpl.class);
-            GradleProject gradleProject = GradleProjectCache.loadProject(impl, 
FULL_ONLINE, true, true);
-            impl.fireProjectReload(false);
-            Quality q = gradleProject.getQuality();
-            Status st = q.worseThan(SIMPLE) ? Status.UNRESOLVED
-                    : q.worseThan(FULL) ? Status.RESOLVED_WITH_WARNING : 
Status.RESOLVED;
-            return Result.create(st);
+            return impl.primeProject().thenApply(gradleProject -> {
+                Quality q = gradleProject.getQuality();
+                Status st = q.worseThan(SIMPLE) ? Status.UNRESOLVED
+                        : q.worseThan(FULL) ? Status.RESOLVED_WITH_WARNING : 
Status.RESOLVED;
+                return Result.create(st);
+            });
         }
-
     }
 }
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/NbGradleProjectImpl.java 
b/extide/gradle/src/org/netbeans/modules/gradle/NbGradleProjectImpl.java
index 515d5de..b70895a 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/NbGradleProjectImpl.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/NbGradleProjectImpl.java
@@ -33,6 +33,7 @@ import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 import java.util.logging.Level;
 import org.netbeans.api.project.Project;
 import org.netbeans.spi.project.ProjectState;
@@ -286,7 +287,57 @@ public final class NbGradleProjectImpl implements Project {
             return "Unloaded Gradle Project: " + gradleFiles.toString();
         }
     }
+    
+    final RequestProcessor GRADLE_PRIMING_RP = new 
RequestProcessor("gradle-project-resolver", 1); //NOI18N
 
+    // @GuardedBy(this)
+    private CompletableFuture<GradleProject>    primingBuild;
+
+    boolean isProjectPrimingRequired() {
+        GradleProject gp = getGradleProject();
+        return gp.getQuality().notBetterThan(EVALUATED) || 
!gp.getProblems().isEmpty();
+    }
+    
+    /**
+     * The core implementation is tied to project quality itself, so it is 
extracted here from
+     * {@link GradleProjectProblemProvider}. 
+     * <p>
+     * <b>Note: Priming build makes the project trusted</b>
+     * 
+     * @return future that produces the result.
+     */
+    CompletableFuture<GradleProject> primeProject() {
+        CompletableFuture<GradleProject> ret;
+        synchronized (this) {
+            if (primingBuild != null && !primingBuild.isDone()) {
+                // avoid priming twice, piggyback on the old one
+                LOG.log(Level.FINER, "Priming build runs for {0}: {1}", new 
Object[] { this, primingBuild });
+                return primingBuild;
+            }
+            ret = new CompletableFuture<>();
+            primingBuild = ret;
+        }
+        LOG.log(Level.FINER, "Submitting priming build runs for {0}: {1}", new 
Object[] { this, ret });
+        GRADLE_PRIMING_RP.submit(() -> {
+            try {
+                // this was explicitly invoked as project action, or problem 
resolution. Same level as
+                // Build project, so trust the project.
+                ProjectTrust.getDefault().trustProject(this, true);
+                GradleProject gradleProject = 
GradleProjectCache.loadProject(this, FULL_ONLINE, true, true);
+                LOG.log(Level.FINER, "Priming finished, reloading {0}: {1}", 
project);
+                fireProjectReload(false);
+                ret.complete(gradleProject);
+            } catch (Throwable t) {
+                LOG.log(Level.FINER, t, () -> String.format("Priming errored 
for %s", project));
+                ret.completeExceptionally(t);
+                if (t instanceof ThreadDeath) {
+                    throw t;
+                }
+            }
+        });
+        return ret;
+    }
+    
     private class ProjectOpenedHookImpl extends ProjectOpenedHook {
 
         @Override

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