blob: 2d4045b3d55b9d301bd1bcd3dff2cfa784d4a158 [file] [log] [blame]
/*
* 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.java;
import org.netbeans.modules.gradle.api.GradleBaseProject;
import org.netbeans.modules.gradle.api.execute.RunUtils;
import org.netbeans.modules.gradle.java.api.GradleJavaProject;
import org.netbeans.modules.gradle.java.api.GradleJavaSourceSet;
import org.netbeans.modules.gradle.spi.actions.DefaultGradleActionsProvider;
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.Set;
import static org.netbeans.spi.project.ActionProvider.*;
import static org.netbeans.api.java.project.JavaProjectConstants.*;
import org.netbeans.api.java.source.ClasspathInfo;
import org.netbeans.api.java.source.SourceUtils;
import org.netbeans.api.project.Project;
import org.netbeans.api.queries.FileBuiltQuery;
import org.netbeans.modules.gradle.api.execute.ActionMapping;
import org.netbeans.modules.gradle.api.execute.GradleCommandLine;
import org.netbeans.modules.gradle.spi.actions.ProjectActionMappingProvider;
import static org.netbeans.spi.project.SingleMethod.COMMAND_DEBUG_SINGLE_METHOD;
import static org.netbeans.spi.project.SingleMethod.COMMAND_RUN_SINGLE_METHOD;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.Lookup;
import org.openide.util.lookup.ServiceProvider;
/**
*
* @author Laszlo Kishalmi
*/
@ServiceProvider(service = GradleActionsProvider.class)
public class JavaActionProvider extends DefaultGradleActionsProvider {
private static final String GATLING_PLUGIN = "com.github.lkishalmi.gatling"; //NOI18N
private static final String SIMULATION_POSTFIX = "Simulation.scala"; //NOI18N
/**
* Name of the 'download.sources' standard action
*/
public static final String COMMAND_DL_SOURCES = "download.sources"; //NOI18N
/**
* Name of the 'download.javadoc' standard action
*/
public static final String COMMAND_DL_JAVADOC = "download.javadoc"; //NOI18N
private static final String[] SUPPORTED = new String[]{
COMMAND_BUILD,
COMMAND_CLEAN,
COMMAND_REBUILD,
COMMAND_RUN,
COMMAND_DEBUG,
COMMAND_TEST,
COMMAND_TEST_SINGLE,
COMMAND_DEBUG_TEST_SINGLE,
COMMAND_RUN_SINGLE_METHOD,
COMMAND_DEBUG_SINGLE_METHOD,
COMMAND_JAVADOC,
COMMAND_DEBUG_FIX,
COMMAND_RUN_SINGLE,
COMMAND_DEBUG_SINGLE,
COMMAND_COMPILE_SINGLE,
COMMAND_DELETE,
COMMAND_DL_JAVADOC,
COMMAND_DL_SOURCES
};
public JavaActionProvider() {
super(SUPPORTED);
}
@Override
public boolean isActionEnabled(String action, Project project, Lookup context) {
boolean ret = super.isActionEnabled(action, project, context);
if (ret) {
GradleBaseProject gbp = GradleBaseProject.get(project);
FileObject fo = RunUtils.extractFileObjectfromLookup(context);
if (fo != null) {
if (gbp.hasPlugins(GATLING_PLUGIN) && COMMAND_RUN_SINGLE.equals(action)) {
ret = fo.getNameExt().endsWith(SIMULATION_POSTFIX);
} else {
GradleJavaProject gjp = GradleJavaProject.get(project);
if ( gjp != null ) {
ret = false;
switch (action) {
case COMMAND_COMPILE_SINGLE:
FileBuiltQuery.Status status = FileBuiltQuery.getStatus(fo);
ret = status == null || !status.isBuilt();
break;
case COMMAND_DEBUG_SINGLE:
case COMMAND_RUN_SINGLE:
ProjectActionMappingProvider pamp = RunUtils.findActionProvider(project, context);
ActionMapping runSingleMapping = pamp.findMapping(action);
if (ActionMapping.isDisabled(runSingleMapping)) {
return false;
}
GradleCommandLine cli = new GradleCommandLine(RunUtils.evaluateActionArgs(project, action, runSingleMapping.getArgs(), context));
Set<String> runSingleTasks = cli.getTasks();
if (gbp.getTaskNames().containsAll(runSingleTasks) || RunUtils.isAugmentedBuildEnabled(project)) {
File f = FileUtil.toFile(fo);
GradleJavaSourceSet sourceSet = gjp.containingSourceSet(f);
if ((sourceSet != null) && fo.isData()) {
String relPath = sourceSet.relativePath(f);
if (relPath != null) {
relPath = relPath.substring(0, relPath.lastIndexOf('.')).replace('/', '.');
ret = SourceUtils.isMainClass(relPath, ClasspathInfo.create(fo), true);
}
}
}
break;
case COMMAND_TEST_SINGLE:
case COMMAND_DEBUG_TEST_SINGLE:
case COMMAND_RUN_SINGLE_METHOD:
case COMMAND_DEBUG_SINGLE_METHOD:
if ("text/x-java".equals(fo.getMIMEType()) || "text/x-groovy".equals(fo.getMIMEType()) || "text/x-kotlin".equals(fo.getMIMEType())) { //NOI18N
File f = FileUtil.toFile(fo);
GradleJavaSourceSet sourceSet = gjp.containingSourceSet(f);
ret = sourceSet != null && sourceSet.isTestSourceSet() && sourceSet.getSourceType(f) != RESOURCES;
}
if ( fo.isFolder() ) {
File dir = FileUtil.toFile(fo);
GradleJavaSourceSet sourceSet = gjp.containingSourceSet(dir);
ret = sourceSet != null && sourceSet.getSourceType(dir) != RESOURCES;
}
break;
default:
ret = true;
}
}
}
}
}
return ret;
}
}