Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[NETBEANS-3313] Implemented Project Delete Action for Gradle Projects #1939

Merged
merged 1 commit into from Mar 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -27,9 +27,6 @@
import org.netbeans.modules.gradle.spi.actions.GradleActionsProvider;
import static org.netbeans.modules.gradle.java.api.GradleJavaSourceSet.SourceType.*;
import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import static org.netbeans.spi.project.ActionProvider.*;
import static org.netbeans.api.java.project.JavaProjectConstants.*;
import org.netbeans.api.java.source.ClasspathInfo;
Expand Down Expand Up @@ -69,6 +66,7 @@ public class JavaActionProvider extends DefaultGradleActionsProvider {
COMMAND_RUN_SINGLE,
COMMAND_DEBUG_SINGLE,
COMMAND_COMPILE_SINGLE,
COMMAND_DELETE,
};

public JavaActionProvider() {
Expand Down
Expand Up @@ -315,7 +315,7 @@ private ClassPath createMultiplexClassPath(ClassPath modulePath, ClassPath class

public boolean hasModuleInfo() {
GradleJavaProject gjp = GradleJavaProject.get(ClassPathProviderImpl.this.project);
GradleJavaSourceSet ss = gjp.getSourceSets().get(group);
GradleJavaSourceSet ss = gjp != null ? gjp.getSourceSets().get(group) : null;
return ss != null && ss.findResource(MODULE_INFO_JAVA, false, GradleJavaSourceSet.SourceType.JAVA) != null;
}

Expand Down
Expand Up @@ -59,6 +59,7 @@
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand All @@ -74,6 +75,10 @@
import org.netbeans.api.annotations.common.NullAllowed;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.modules.gradle.api.GradleBaseProject;
import org.netbeans.modules.gradle.api.execute.RunConfig.ExecFlag;
import org.netbeans.spi.project.support.ProjectOperations;
import org.netbeans.spi.project.ui.support.DefaultProjectOperations;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
Expand Down Expand Up @@ -124,12 +129,20 @@ public String[] getSupportedActions() {

@Override
public void invokeAction(String command, Lookup context) throws IllegalArgumentException {
if (COMMAND_DELETE.equals(command)) {
DefaultProjectOperations.performDefaultDeleteOperation(project);
return;
}
ActionMapping mapping = ActionToTaskUtils.getActiveMapping(command, project);
invokeProjectAction(project, mapping, context, false);
}

@Override
public boolean isActionEnabled(String command, Lookup context) throws IllegalArgumentException {
if (COMMAND_DELETE.equals(command)) {
GradleBaseProject gbp = GradleBaseProject.get(project);
return gbp != null && gbp.getSubProjects().isEmpty() && ProjectOperations.isDeleteOperationSupported(project);
}
return ActionToTaskUtils.isActionEnabled(command, project, context);
}

Expand All @@ -139,10 +152,11 @@ public boolean isActionEnabled(String command, Lookup context) throws IllegalArg
"# {0} - artifactId", "TXT_ApplyCodeChanges=Apply Code Changes ({0})",
"# {0} - artifactId", "TXT_Profile=Profile ({0})",
"# {0} - artifactId", "TXT_Test=Test ({0})",
"# {0} - artifactId", "TXT_Build=Build ({0})"
"# {0} - artifactId", "TXT_Build=Build ({0})",
"# {0} - artifactId", "TXT_Delete=Delete ({0})",
})

private static String taskName(Project project, String action, Lookup lkp) {
static String taskName(Project project, String action, Lookup lkp) {
String title;
DataObject dobj = lkp.lookup(DataObject.class);
String dobjName = dobj != null ? dobj.getName() : "";
Expand All @@ -155,6 +169,9 @@ private static String taskName(Project project, String action, Lookup lkp) {
case ActionProvider.COMMAND_DEBUG:
title = TXT_Debug(prjLabel);
break;
case ActionProvider.COMMAND_DELETE:
title = TXT_Delete(prjLabel);
break;
case ActionProvider.COMMAND_PROFILE:
title = TXT_Profile(prjLabel);
break;
Expand Down Expand Up @@ -198,7 +215,8 @@ private static void invokeProjectAction(final Project project, final ActionMappi

final NbGradleProjectImpl prj = project.getLookup().lookup(NbGradleProjectImpl.class);
final String[] args = evalueteArgs(project, action, argLine, ctx);
RunConfig cfg = RunUtils.createRunConfig(project, action, taskName(project, action, ctx), args);
Set<ExecFlag> flags = mapping.isRepeatable() ? EnumSet.of(ExecFlag.REPEATABLE) : EnumSet.noneOf(ExecFlag.class);
RunConfig cfg = RunUtils.createRunConfig(project, action, taskName(project, action, ctx), flags, args);

if (showUI) {
GradleExecutorOptionsPanel pnl = new GradleExecutorOptionsPanel(project);
Expand Down
111 changes: 111 additions & 0 deletions groovy/gradle/src/org/netbeans/modules/gradle/DeleteOperationImpl.java
@@ -0,0 +1,111 @@
/*
* 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.gradle;

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.List;
import org.netbeans.api.project.Project;
import org.netbeans.modules.gradle.actions.ActionToTaskUtils;
import org.netbeans.modules.gradle.api.NbGradleProject;
import org.netbeans.modules.gradle.api.execute.ActionMapping;
import org.netbeans.modules.gradle.api.execute.RunConfig;
import org.netbeans.modules.gradle.api.execute.RunConfig.ExecFlag;
import org.netbeans.modules.gradle.api.execute.RunUtils;
import org.netbeans.modules.gradle.spi.GradleFiles;
import org.netbeans.spi.project.DeleteOperationImplementation;
import org.netbeans.spi.project.ProjectServiceProvider;
import org.netbeans.spi.project.ProjectState;
import org.openide.execution.ExecutorTask;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.Lookup;
import org.openide.util.NbBundle.Messages;
import org.openide.util.Utilities;

import static org.netbeans.spi.project.ActionProvider.COMMAND_DELETE;
import static org.netbeans.modules.gradle.api.execute.RunConfig.ExecFlag.REPEATABLE;
/**
*
* @author lkishalmi
*/
@ProjectServiceProvider(service=DeleteOperationImplementation.class, projectType = NbGradleProject.GRADLE_PROJECT_TYPE)
public class DeleteOperationImpl implements DeleteOperationImplementation {
final Project project;

public DeleteOperationImpl(Project project) {
this.project = project;
}

@Override
@Messages({
"# {0} - The project name",
"LBL_Clean4Delete=Clean Before Delete ({0})"
})
public void notifyDeleting() throws IOException {
ActionMapping mapping = ActionToTaskUtils.getActiveMapping(COMMAND_DELETE, project);
RunConfig config = RunUtils.createRunConfig(project, COMMAND_DELETE,
ActionProviderImpl.taskName(project, COMMAND_DELETE, Lookup.EMPTY),
mapping.isRepeatable() ? EnumSet.of(REPEATABLE) : EnumSet.noneOf(ExecFlag.class),
Utilities.parseParameters(mapping.getArgs()));
ExecutorTask task = RunUtils.executeGradle(config, "");
task.result();
task.getInputOutput().getOut().close();
task.getInputOutput().getErr().close();
}

@Override
public void notifyDeleted() throws IOException {
project.getLookup().lookup(ProjectState.class).notifyDeleted();
}

@Override
public List<FileObject> getMetadataFiles() {
List<FileObject> ret = new LinkedList<>();
if (project instanceof NbGradleProjectImpl) {
NbGradleProjectImpl prj = (NbGradleProjectImpl) project;
GradleFiles gfs = prj.getGradleFiles();
List<File> meta = new LinkedList<>();
if (gfs.isRootProject()) {
meta.addAll(gfs.getProjectFiles());
} else {
if (!gfs.isScriptlessSubProject()) {
meta.add(gfs.getBuildScript());
}
}
for (File file : meta) {
FileObject fo = FileUtil.toFileObject(file);
if (fo != null) {
ret.add(fo);
}
}
}
return ret;
}

@Override
public List<FileObject> getDataFiles() {
return Collections.singletonList(project.getProjectDirectory());
}


}
Expand Up @@ -34,7 +34,9 @@ public class RootActionProvider extends DefaultGradleActionsProvider {
private static final String[] SUPPORTED = new String[]{
COMMAND_BUILD,
COMMAND_CLEAN,
COMMAND_REBUILD,};
COMMAND_REBUILD,
COMMAND_DELETE,
};

public RootActionProvider() {
super(SUPPORTED);
Expand Down
Expand Up @@ -33,6 +33,10 @@
<args>clean build</args>
</action>

<action name="delete" repeatable="false">
<args>clean</args>
<reload rule="NEVER"/>
</action>
<action name="download.javadoc">
<!--
We do not really execute any tasks here, rather just reload the project
Expand Down
Expand Up @@ -40,7 +40,6 @@
import org.openide.windows.IOColors;
import org.openide.windows.InputOutput;

import static org.netbeans.modules.gradle.api.execute.Bundle.*;
import org.netbeans.modules.gradle.spi.actions.ReplaceTokenProvider;
import java.util.ArrayList;
import java.util.Collection;
Expand All @@ -55,16 +54,14 @@
import org.netbeans.api.java.platform.JavaPlatformManager;
import org.netbeans.api.java.platform.Specification;

import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.ui.OpenProjects;
import org.netbeans.modules.gradle.GradleDistributionManager;
import org.netbeans.modules.gradle.api.execute.RunConfig.ExecFlag;
import org.netbeans.modules.gradle.spi.GradleSettings;
import org.netbeans.spi.project.ActionProvider;
import org.netbeans.spi.project.SingleMethod;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObject;
import org.openide.util.NbBundle;
import org.openide.util.Pair;

/**
Expand Down Expand Up @@ -135,8 +132,9 @@ public static ExecutorTask executeGradle(RunConfig config, String initialOutput)
* @param displayName The display name of the output tab
* @param args Gradle command line arguments
* @return the Gradle execution configuration.
* @since 1.5
*/
public static RunConfig createRunConfig(Project project, String action, String displayName, String[] args) {
public static RunConfig createRunConfig(Project project, String action, String displayName, Set<ExecFlag> flags, String... args) {
GradleBaseProject gbp = GradleBaseProject.get(project);

GradleCommandLine syscmd = GradleCommandLine.getDefaultCommandLine();
Expand All @@ -158,10 +156,27 @@ public static RunConfig createRunConfig(Project project, String action, String d


GradleCommandLine cmd = GradleCommandLine.combine(basecmd, new GradleCommandLine(args));
RunConfig ret = new RunConfig(project, action, displayName, EnumSet.of(RunConfig.ExecFlag.REPEATABLE), cmd);
RunConfig ret = new RunConfig(project, action, displayName, flags, cmd);
return ret;
}

/**
* Create Gradle execution configuration (context). It applies the default
* setting from the project and the Global Gradle configuration on the
* command line.
*
* @param project The Gradle project
* @param action The name of the IDE action that's going to be executed
* @param displayName The display name of the output tab
* @param args Gradle command line arguments
* @return the Gradle execution configuration.
* @deprecated use {@link #createRunConfig(org.netbeans.api.project.Project, java.lang.String, java.lang.String, java.util.Set, java.lang.String...) } instead.
*/
@Deprecated
public static RunConfig createRunConfig(Project project, String action, String displayName, String[] args) {
return createRunConfig(project, action, displayName, EnumSet.of(RunConfig.ExecFlag.REPEATABLE), args);
}

/**
* Enable plugins to Cancel a currently running Gradle execution.
*
Expand Down Expand Up @@ -298,56 +313,6 @@ public Map<String, String> createReplacements(String action, Lookup context) {
};
}

@NbBundle.Messages({
"# {0} - artifactId", "TXT_Run=Run ({0})",
"# {0} - artifactId", "TXT_Debug=Debug ({0})",
"# {0} - artifactId", "TXT_ApplyCodeChanges=Apply Code Changes ({0})",
"# {0} - artifactId", "TXT_Profile=Profile ({0})",
"# {0} - artifactId", "TXT_Test=Test ({0})",
"# {0} - artifactId", "TXT_Build=Build ({0})"
})
private static String taskName(String action, Lookup lkp) {
String title;
DataObject dobj = lkp.lookup(DataObject.class);
String dobjName = dobj != null ? dobj.getName() : "";
Project prj = lkp.lookup(Project.class);
String prjLabel = prj != null ? ProjectUtils.getInformation(prj).getDisplayName() : "No Project on Lookup";
switch (action) {
case ActionProvider.COMMAND_RUN:
title = TXT_Run(prjLabel);
break;
case ActionProvider.COMMAND_DEBUG:
title = TXT_Debug(prjLabel);
break;
case ActionProvider.COMMAND_PROFILE:
title = TXT_Profile(prjLabel);
break;
case ActionProvider.COMMAND_TEST:
title = TXT_Test(prjLabel);
break;
case ActionProvider.COMMAND_RUN_SINGLE:
title = TXT_Run(dobjName);
break;
case ActionProvider.COMMAND_DEBUG_SINGLE:
case ActionProvider.COMMAND_DEBUG_TEST_SINGLE:
title = TXT_Debug(dobjName);
break;
case ActionProvider.COMMAND_PROFILE_SINGLE:
case ActionProvider.COMMAND_PROFILE_TEST_SINGLE:
title = TXT_Profile(dobjName);
break;
case ActionProvider.COMMAND_TEST_SINGLE:
title = TXT_Test(dobjName);
break;
case "debug.fix":
title = TXT_ApplyCodeChanges(prjLabel);
break;
default:
title = TXT_Build(prjLabel);
}
return title;
}

/**
* Returns the active platform used by the project or null if the active
* project platform is broken.
Expand Down
Expand Up @@ -39,6 +39,7 @@
import javax.swing.SwingUtilities;
import org.netbeans.api.project.Project;
import org.netbeans.modules.gradle.api.execute.GradleCommandLine;
import static org.netbeans.modules.gradle.api.execute.RunConfig.ExecFlag.REPEATABLE;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.filesystems.FileUtil;
Expand Down Expand Up @@ -105,8 +106,10 @@ protected Action[] createNewTabActions() {
@Override
protected void reassignAdditionalContext(TabContext tabContext) {
this.tabContext = tabContext;
tabContext.rerun.setConfig(config);
tabContext.rerunDebug.setConfig(config);
if (config.getExecFlags().contains(REPEATABLE)){
tabContext.rerun.setConfig(config);
tabContext.rerunDebug.setConfig(config);
}
tabContext.stop.setExecutor(this);
}

Expand Down
8 changes: 8 additions & 0 deletions groovy/gradle/src/org/netbeans/modules/gradle/layer.xml
Expand Up @@ -97,6 +97,14 @@
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="2200"/>
</file>
<file name="org-netbeans-modules-project-ui-DeleteProject.shadow">
<attr name="originalFile" stringvalue="Actions/Project/org-netbeans-modules-project-ui-DeleteProject.instance"/>
<attr name="position" intvalue="2600"/>
</file>
<file name="sep-6.instance">
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
<attr name="position" intvalue="2700"/>
</file>
<file name="org-openide-actions-FindAction.shadow">
<attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-FindAction.instance"/>
<attr name="position" intvalue="2800"/>
Expand Down