package org.netbeans.gradle.project.tasks.vars; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.netbeans.api.java.project.JavaProjectConstants; import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.SourceGroup; import org.netbeans.gradle.model.util.CollectionUtils; import org.netbeans.gradle.project.NbGradleProject; import org.netbeans.gradle.project.api.entry.ProjectPlatform; import org.netbeans.gradle.project.api.task.TaskVariable; import org.netbeans.gradle.project.api.task.TaskVariableMap; import org.netbeans.gradle.project.java.test.SpecificTestClass; import org.netbeans.gradle.project.java.test.SpecificTestcase; import org.netbeans.gradle.project.java.test.TestTaskName; import org.netbeans.gradle.project.tasks.vars.CachingVariableMap.ValueGetter; import org.netbeans.gradle.project.tasks.vars.CachingVariableMap.VariableDef; import org.netbeans.gradle.project.tasks.vars.CachingVariableMap.VariableValue; import org.netbeans.gradle.project.util.StringUtils; 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.Lookup; public enum StandardTaskVariable { PROJECT_PATH_NOT_NORMALIZED("project-path", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { String uniqueName = project.currentModel().getValue().getMainProject().getProjectFullName(); return new VariableValue(uniqueName); } }), PROJECT_PATH_NORMALIZED("project", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { String uniqueName = project.currentModel().getValue().getMainProject().getProjectFullName(); if (":".equals(uniqueName)) { // This is the root project. uniqueName = ""; } return new VariableValue(uniqueName); } }), SELECTED_CLASS("selected-class", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { SpecificTestClass testClass = actionContext.lookup(SpecificTestClass.class); if (testClass != null) { return new VariableValue(testClass.getTestClassName()); } FileObject file = getFileOfContext(actionContext); if (file == null) { return VariableValue.NULL_VALUE; } return getClassNameForFile(project, file); } }), SELECTED_FILE("selected-file", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { FileObject fileObject = getFileOfContext(actionContext); if (fileObject == null) { return VariableValue.NULL_VALUE; } File file = FileUtil.toFile(fileObject); if (file == null) { return VariableValue.NULL_VALUE; } return new VariableValue(file.getPath()); } }), TEST_FILE_PATH("test-file-path", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { String selectedClass = variables.tryGetValueForVariable(SELECTED_CLASS.getVariable()); return new VariableValue(deduceFromClass(selectedClass)); } private String deduceFromClass(String selectedClass) { return selectedClass != null ? selectedClass.replace('.', '/') : null; } }), TEST_METHOD("test-method", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { return getMethodReplaceVariable(variables, project, actionContext); } }), PLATFORM_DIR("platform-dir", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { ProjectPlatform targetPlatform = project.getCommonProperties().targetPlatform().getActiveValue(); FileObject rootFolder = targetPlatform != null ? targetPlatform.getRootFolder() : null; return new VariableValue(rootFolder != null ? FileUtil.getFileDisplayName(rootFolder) : null); } }), TEST_TASK_NAME("test-task-name", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { return new VariableValue(TestTaskName.getTaskName(actionContext)); } }), TEST_TASK_NAME_CAPITAL("test-task-name-capital", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { String value = variables.tryGetValueForVariable(TEST_TASK_NAME.getVariable()); return new VariableValue(value != null ? StringUtils.capitalizeFirstCharacter(value) : null); } }), CMD_LINE_ARGS("cmd-line-args", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { return VariableValue.EMPTY_VALUE; } }), JVM_LINE_ARGS("jvm-line-args", new ValueGetter<NbGradleProject>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { return VariableValue.EMPTY_VALUE; } }); private static final Logger LOGGER = Logger.getLogger(StandardTaskVariable.class.getName()); private static final CachingVariableMap.VariableDefMap<NbGradleProject> TASK_VARIABLE_MAP = createStandardMap(); private static VariableValue getClassNameForFile(NbGradleProject project, FileObject file) { SourceGroup[] sourceGroups = ProjectUtils.getSources(project) .getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); String relFileName = null; for (SourceGroup group: sourceGroups) { FileObject sourceRoot = group.getRootFolder(); String relPath = FileUtil.getRelativePath(sourceRoot, file); if (relPath != null) { // Remove the ".java" or ".groovy" from the end of // the file name relFileName = removeExtension(relPath); break; } } return new VariableValue(relFileName != null ? relFileName.replace('/', '.') : null); } private static VariableValue getMethodReplaceVariable( TaskVariableMap variables, NbGradleProject project, SingleMethod method) { String selectedClass = variables.tryGetValueForVariable(SELECTED_CLASS.getVariable()); if (selectedClass == null) { selectedClass = getClassNameForFile(project, method.getFile()).value; if (selectedClass == null) { LOGGER.log(Level.INFO, "Could not find class file name for file {0}", method.getFile()); return VariableValue.NULL_VALUE; } } return new VariableValue(selectedClass + "." + method.getMethodName()); } private static VariableValue getMethodReplaceVariable( TaskVariableMap variables, NbGradleProject project, Lookup actionContext) { SingleMethod method = actionContext.lookup(SingleMethod.class); if (method != null) { return getMethodReplaceVariable(variables, project, method); } SpecificTestcase specificTestcase = actionContext.lookup(SpecificTestcase.class); if (specificTestcase != null) { return new VariableValue(specificTestcase.getTestIncludePattern()); } return VariableValue.NULL_VALUE; } private static String removeExtension(String filePath) { int extSeparatorIndex = filePath.lastIndexOf('.'); return extSeparatorIndex >= 0 ? filePath.substring(0, extSeparatorIndex) : filePath; } private static List<FileObject> getFilesOfContext(Lookup context) { List<FileObject> files = new ArrayList<>(); for (DataObject dataObj: context.lookupAll(DataObject.class)) { FileObject file = dataObj.getPrimaryFile(); if (file != null) { files.add(file); } } return files; } private static FileObject getFileOfContext(Lookup context) { List<FileObject> files = getFilesOfContext(context); if (files.isEmpty()) { return null; } FileObject file = files.get(0); if (file == null) { return null; } return file.isFolder() ? null : file; } public static TaskVariableMap createVarReplaceMap( NbGradleProject project, Lookup actionContext) { return new CachingVariableMap<>(TASK_VARIABLE_MAP, project, actionContext); } private final TaskVariable variable; private final ValueGetter<NbGradleProject> valueGetter; private StandardTaskVariable(String variableName, ValueGetter<NbGradleProject> valueGetter) { this.variable = new TaskVariable(variableName); this.valueGetter = valueGetter; } public TaskVariable getVariable() { return variable; } public String getVariableName() { return variable.getVariableName(); } public String getScriptReplaceConstant() { return variable.getScriptReplaceConstant(); } private static CachingVariableMap.VariableDefMap<NbGradleProject> createStandardMap() { StandardTaskVariable[] variables = StandardTaskVariable.values(); final Map<TaskVariable, CachingVariableMap.VariableDef<NbGradleProject>> result = CollectionUtils.newHashMap(variables.length); for (StandardTaskVariable variable: variables) { result.put(variable.getVariable(), variable.asVariableDef()); } return new CachingVariableMap.VariableDefMap<NbGradleProject>() { @Override public CachingVariableMap.VariableDef<NbGradleProject> tryGetDef(TaskVariable variable) { return result.get(variable); } }; } private VariableDef<NbGradleProject> asVariableDef() { return new VariableDef<>(variable, valueGetter); } }