package org.netbeans.gradle.project.view; import java.io.File; import java.util.Map; import org.netbeans.gradle.model.GenericProjectProperties; import org.netbeans.gradle.model.ProjectId; import org.netbeans.gradle.model.util.CollectionUtils; import org.netbeans.gradle.project.api.task.TaskVariable; import org.netbeans.gradle.project.api.task.TaskVariableMap; import org.netbeans.gradle.project.model.NbGradleModel; import org.netbeans.gradle.project.model.NbGradleProjectTree; import org.netbeans.gradle.project.tasks.vars.CachingVariableMap; 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.VariableDefMap; import org.netbeans.gradle.project.tasks.vars.CachingVariableMap.VariableValue; import org.openide.util.Lookup; public enum DisplayableTaskVariable { PROJECT_PATH("project.path", new ValueGetter<NbGradleModel>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleModel model, Lookup actionContext) { return new VariableValue(getSafeProjectPath(model)); } }), PROJECT_GROUP("project.group", new ValueGetter<NbGradleModel>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleModel model, Lookup actionContext) { ProjectId projectId = model.getProjectId(); return new VariableValue(projectId.getGroup()); } }), PROJECT_NAME("project.name", new ValueGetter<NbGradleModel>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleModel model, Lookup actionContext) { return new VariableValue(getSafeProjectName(model)); } }), PROJECT_VERSION("project.version", new ValueGetter<NbGradleModel>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleModel model, Lookup actionContext) { ProjectId projectId = model.getProjectId(); return new VariableValue(projectId.getVersion()); } }), PARENT_PATH("parent.path", new ValueGetter<NbGradleModel>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleModel model, Lookup actionContext) { return new VariableValue(getProjectPath(parent(model))); } }), PARENT_GROUP("parent.group", new ValueGetter<NbGradleModel>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleModel model, Lookup actionContext) { ProjectId projectId = parentId(model); return new VariableValue(projectId != null ? projectId.getGroup() : ""); } }), PARENT_NAME("parent.name", new ValueGetter<NbGradleModel>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleModel model, Lookup actionContext) { return new VariableValue(getProjectName(parent(model))); } }), PARENT_VERSION("parent.version", new ValueGetter<NbGradleModel>() { @Override public VariableValue getValue(TaskVariableMap variables, NbGradleModel model, Lookup actionContext) { ProjectId projectId = parentId(model); return new VariableValue(projectId != null ? projectId.getVersion() : ""); } }); private static NbGradleProjectTree parent(NbGradleModel model) { return model.getProjectDef().getParentTree(); } private static GenericProjectProperties parentProperties(NbGradleModel model) { NbGradleProjectTree parent = parent(model); return parent != null ? parent.getGenericProperties() : null; } private static ProjectId parentId(NbGradleModel model) { GenericProjectProperties properties = parentProperties(model); return properties != null ? properties.getProjectId() : null; } private static String getProjectName(NbGradleProjectTree model) { if (model == null) { return ""; } ProjectId projectId = model.getGenericProperties().getProjectId(); String name = projectId.getName(); if (name.isEmpty()) { return model.getProjectDir().getName(); } else { return name; } } private static String getSafeProjectName(NbGradleModel model) { if (model.isBuildSrc()) { File parentFile = model.getProjectDir().getParentFile(); return parentFile != null ? parentFile.getName() : "?"; } else { return getProjectName(model.getMainProject()); } } private static String getProjectPath(NbGradleProjectTree model) { if (model == null) { return ""; } String path = model.getProjectFullName(); if (path.isEmpty() || path.equals(":")) { return getProjectName(model); } else { return path; } } private static String getSafeProjectPath(NbGradleModel model) { if (model.isBuildSrc()) { File parentFile = model.getProjectDir().getParentFile(); return parentFile != null ? parentFile.getName() : "?"; } else { return getProjectPath(model.getMainProject()); } } private static final VariableDefMap<NbGradleModel> TASK_VARIABLE_MAP = createStandardMap(); private static VariableDefMap<NbGradleModel> createStandardMap() { DisplayableTaskVariable[] variables = DisplayableTaskVariable.values(); final Map<TaskVariable, VariableDef<NbGradleModel>> result = CollectionUtils.newHashMap(variables.length); for (DisplayableTaskVariable variable: variables) { result.put(variable.getVariable(), variable.asVariableDef()); } return new VariableDefMap<NbGradleModel>() { @Override public VariableDef<NbGradleModel> tryGetDef(TaskVariable variable) { return result.get(variable); } }; } public static TaskVariableMap createVarReplaceMap(NbGradleModel project) { return new CachingVariableMap<>(TASK_VARIABLE_MAP, project, Lookup.EMPTY); } private final TaskVariable variable; private final ValueGetter<NbGradleModel> valueGetter; private DisplayableTaskVariable(String variableName, ValueGetter<NbGradleModel> valueGetter) { this.variable = new TaskVariable(variableName); this.valueGetter = valueGetter; } private VariableDef<NbGradleModel> asVariableDef() { return new VariableDef<>(variable, valueGetter); } public TaskVariable getVariable() { return variable; } public String getVariableName() { return variable.getVariableName(); } public String getScriptReplaceConstant() { return variable.getScriptReplaceConstant(); } }