You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@netbeans.apache.org by GitBox <gi...@apache.org> on 2021/03/20 05:20:45 UTC

[GitHub] [netbeans] JaroslavTulach commented on a change in pull request #2816: [NETBEANS-5430] Implemened ActionProvider.COMMAND_PRIME for gradle

JaroslavTulach commented on a change in pull request #2816:
URL: https://github.com/apache/netbeans/pull/2816#discussion_r598064831



##########
File path: extide/gradle/src/org/netbeans/modules/gradle/ActionProviderImpl.java
##########
@@ -123,15 +124,42 @@ public ActionProviderImpl(Project project) {
         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

Review comment:
       Typo `prooblem`

##########
File path: extide/gradle/src/org/netbeans/modules/gradle/ActionProviderImpl.java
##########
@@ -123,15 +124,42 @@ public ActionProviderImpl(Project project) {
         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));

Review comment:
       The previous `LOG.log` message is using curly braces pattern. This one is using lambda callback. I'd welcome consistency and I prefer to use the curly braces in both places.

##########
File path: extide/gradle/src/org/netbeans/modules/gradle/NbGradleProjectImpl.java
##########
@@ -286,7 +287,57 @@ public String toString() {
             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);

Review comment:
       There are two `{}` references, but only one parameter passed in.

##########
File path: extide/gradle/src/org/netbeans/modules/gradle/NbGradleProjectImpl.java
##########
@@ -286,7 +287,57 @@ public String toString() {
             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));

Review comment:
       Consider using curly braces pattern.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org
For additional commands, e-mail: notifications-help@netbeans.apache.org

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