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