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 <[email protected]>
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: [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