org.gradle.foundation.visitors.TaskTreePopulationVisitor Maven / Gradle / Ivy
Show all versions of gradle-api Show documentation
/*
* Copyright 2009 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.foundation.visitors;
import org.gradle.foundation.ProjectView;
import org.gradle.foundation.TaskView;
import org.gradle.gradleplugin.foundation.filters.AllowAllProjectAndTaskFilter;
import org.gradle.gradleplugin.foundation.filters.ProjectAndTaskFilter;
import org.gradle.util.CollectionUtils;
import org.gradle.util.GUtil;
import java.util.*;
/**
* This visits each project and task in a hierarchical manner. This visitor is specifically meant to walk the projects first and tasks second for the purpose of populating a tree where the
* projects/subprojects are first and the tasks are second.
*/
public class TaskTreePopulationVisitor {
public interface Visitor {
/*
This is called for each project.
@param project the project
@param indexOfProject
@param parentProjectObject whatever you handed back from a prior call to
visitProject if this is a sub project. Otherwise, it'll be whatever
was passed into the visitPojectsAndTasks function.
@return an object that will be handed back to you for each of this
project's tasks.
*/
public P visitProject(ProjectView project, int indexOfProject, P parentProjectObject);
/*
This is called for each task.
@param task the task
@param indexOfTask
@param tasksProject the project for this task
@param userProjectObject whatever you returned from the parent project's visitProject
*/
public T visitTask(TaskView task, int indexOfTask, ProjectView tasksProject, P userProjectObject);
/*
This is called when a project has been visited completely and is just a
notification giving you an opportunity to do whatever you like.
This is possibly where you want to delete any nodes that we didn't
visit.
@param parentProjectObject the object that represents the parent of
the project and task objects below
@param projectObjects a list of whatever you returned from visitProject
@param taskObjects a list of whatever you returned from visitTask
*/
public void completedVisitingProject(P parentProjectObject, List
projectObjects, List taskObjects);
}
/*
This visitor will visit each project, sub-project and task that was discovered
by the GradleHelper. This is useful for building a list or tree of
projects and tasks.
This is the same as the other version of visitProjectsAndTasks except this
one visits everything.
*/
public static void visitProjectAndTasks(List projects, Visitor visitor,
P rootProjectObject) {
visitProjectAndTasks(projects, visitor, new AllowAllProjectAndTaskFilter(), rootProjectObject);
}
/*
This visitor will visit each project, sub-project and task that was discovered
by the GradleHelper. This is useful for building a list or tree of
projects and tasks.
@param visitor this notified you of each project and task.
@param filter allows you to skip projects and tasks as specified by the filter.
@param rootProjectObject whatever you pass here will be passed to the
root-level projects as parentProjectObject.
*/
public static
void visitProjectAndTasks(List projects, Visitor visitor,
ProjectAndTaskFilter filter, P rootProjectObject) {
List
userProjectObjects = visitProjects(visitor, filter, projects, rootProjectObject, new AlphabeticalProjectNameComparator(), new AlphabeticalTaskNameComparator());
//notify the visitation of the root projects. There are no tasks for this one, but there are projects.
visitor.completedVisitingProject(rootProjectObject, userProjectObjects, Collections.emptyList());
}
private static List
visitProjects(Visitor
visitor, ProjectAndTaskFilter filter,
List sourceProjects, P parentProjectObject, Comparator projectSorter, Comparator taskSorter) {
List projectObjects = new ArrayList
();
sourceProjects = CollectionUtils.sort(sourceProjects, projectSorter); //make a copy because we're going to sort them.
Iterator iterator = sourceProjects.iterator();
int index = 0;
while (iterator.hasNext()) {
ProjectView project = iterator.next();
if (filter.doesAllowProject(project)) {
P userProjectObject = visitor.visitProject(project, index, parentProjectObject);
projectObjects.add(userProjectObject);
//visit sub projects
List subProjectObjects = visitProjects(visitor, filter, project.getSubProjects(), userProjectObject, projectSorter, taskSorter);
//visit tasks. Notice that we pass in the number of subprojects as a starting index. This is so they'll come afterwards.
List taskObjects = visitTasks(visitor, filter, project, subProjectObjects.size(), userProjectObject, taskSorter);
visitor.completedVisitingProject(userProjectObject, subProjectObjects, taskObjects);
}
index++;
}
return projectObjects;
}
/*
Add the list of tasks to the parent tree node.
*/
private static List visitTasks(Visitor visitor, ProjectAndTaskFilter filter, ProjectView project,
int startingIndex, P userProjectObject, Comparator taskSorter) {
List taskObjects = new ArrayList();
List tasks = CollectionUtils.sort(project.getTasks(), taskSorter); //make a copy because we're going to sort them
Iterator iterator = tasks.iterator();
int index = startingIndex;
while (iterator.hasNext()) {
TaskView task = iterator.next();
if (filter.doesAllowTask(task)) {
T taskObject = visitor.visitTask(task, index, project, userProjectObject);
taskObjects.add(taskObject);
}
index++;
}
return taskObjects;
}
/**
* This comparator sorts project names alphabetically ignoring case.
*/
public static class AlphabeticalProjectNameComparator implements Comparator {
public int compare(ProjectView o1, ProjectView o2) {
return GUtil.caseInsensitive().compare(o1.getName(), o2.getName());
}
}
/**
* This comparator sorts task names alphabetically ignoring case.
*/
public static class AlphabeticalTaskNameComparator implements Comparator {
public int compare(TaskView o1, TaskView o2) {
return GUtil.caseInsensitive().compare(o1.getName(), o2.getName());
}
}
}