Java tutorial
/* * Copyright 2010 the original author or authors. * * Licensed 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.gradle.execution; import com.google.common.collect.SetMultimap; import org.apache.commons.lang.StringUtils; import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.internal.GradleInternal; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.util.NameMatcher; import java.util.Map; import java.util.Set; public class TaskSelector { private final TaskNameResolver taskNameResolver; private Set<Task> tasks; private String taskName; public TaskSelector() { this(new TaskNameResolver()); } public TaskSelector(TaskNameResolver taskNameResolver) { this.taskNameResolver = taskNameResolver; } public void selectTasks(GradleInternal gradle, String path) { SetMultimap<String, Task> tasksByName; String baseName; String prefix; ProjectInternal project = gradle.getDefaultProject(); if (path.contains(Project.PATH_SEPARATOR)) { String projectPath = StringUtils.substringBeforeLast(path, Project.PATH_SEPARATOR); projectPath = projectPath.length() == 0 ? Project.PATH_SEPARATOR : projectPath; project = findProject(project, projectPath); baseName = StringUtils.substringAfterLast(path, Project.PATH_SEPARATOR); prefix = project.getPath() + Project.PATH_SEPARATOR; tasksByName = taskNameResolver.select(baseName, project); } else { baseName = path; prefix = ""; tasksByName = taskNameResolver.selectAll(path, project); } Set<Task> tasks = tasksByName.get(baseName); if (!tasks.isEmpty()) { // An exact match this.tasks = tasks; this.taskName = path; return; } NameMatcher matcher = new NameMatcher(); String actualName = matcher.find(baseName, tasksByName.keySet()); if (actualName != null) { // A partial match this.tasks = tasksByName.get(actualName); this.taskName = prefix + actualName; return; } throw new TaskSelectionException(matcher.formatErrorMessage("task", project)); } public String getTaskName() { return taskName; } public Set<Task> getTasks() { return tasks; } private static ProjectInternal findProject(ProjectInternal startFrom, String path) { if (path.equals(Project.PATH_SEPARATOR)) { return startFrom.getRootProject(); } Project current = startFrom; if (path.startsWith(Project.PATH_SEPARATOR)) { current = current.getRootProject(); path = path.substring(1); } for (String pattern : path.split(Project.PATH_SEPARATOR)) { Map<String, Project> children = current.getChildProjects(); NameMatcher matcher = new NameMatcher(); Project child = matcher.find(pattern, children); if (child != null) { current = child; continue; } throw new TaskSelectionException(matcher.formatErrorMessage("project", current)); } return (ProjectInternal) current; } }