/*
* Copyright (c) 2016 the original author or authors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.buildship.ui.view.task;
import java.util.List;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.gradleware.tooling.toolingmodel.OmniProjectTask;
import com.gradleware.tooling.toolingmodel.OmniTaskSelector;
import com.gradleware.tooling.toolingmodel.util.Maybe;
/**
* Tree node in the {@link TaskView} representing a task group.
*/
public final class TaskGroupNode {
private static final String DEFAULT_NAME = "other";
private final List<TaskNode> taskNodes;
private final ProjectNode projectNode;
private final String name;
private TaskGroupNode(ProjectNode projectNode, String name) {
this.projectNode = Preconditions.checkNotNull(projectNode);
this.name = Preconditions.checkNotNull(name);
this.taskNodes = createTaskNodes(projectNode);
}
private List<TaskNode> createTaskNodes(ProjectNode projectNode) {
List<TaskNode> taskNodes = Lists.newArrayList();
for (OmniProjectTask projectTask : getProjectTasks()) {
taskNodes.add(new ProjectTaskNode(projectNode, projectTask));
}
for (OmniTaskSelector taskSelector : getTaskSelectors()) {
taskNodes.add(new TaskSelectorNode(projectNode, taskSelector));
}
return taskNodes;
}
private List<OmniProjectTask> getProjectTasks() {
List<OmniProjectTask> projectTasks = Lists.newArrayList();
for (OmniProjectTask projectTask : this.getProjectNode().getGradleProject().getProjectTasks()) {
if (this.contains(projectTask)) {
projectTasks.add(projectTask);
}
}
return projectTasks;
}
private List<OmniTaskSelector> getTaskSelectors() {
List<OmniTaskSelector> taskSelectors = Lists.newArrayList();
for (OmniTaskSelector taskSelector : this.getProjectNode().getGradleProject().getTaskSelectors()) {
if (this.contains(taskSelector)) {
taskSelectors.add(taskSelector);
}
}
return taskSelectors;
}
public ProjectNode getProjectNode() {
return this.projectNode;
}
public String getName() {
return this.name;
}
public boolean contains(OmniProjectTask projectTask) {
return matches(projectTask.getGroup());
}
public boolean contains(OmniTaskSelector taskSelector) {
return matches(taskSelector.getGroup());
}
private boolean matches(Maybe<String> group) {
if (!group.isPresent()) {
return isDefault();
}
String name = group.get();
if (name == null) {
return isDefault();
} else {
return normalizeGroupName(name).equals(this.name);
}
}
public List<TaskNode> getTaskNodes() {
return this.taskNodes;
};
private boolean isDefault() {
return DEFAULT_NAME.equals(this.name);
}
@Override
public String toString() {
return "Task group '" + this.name + "'";
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (other == null || getClass() != other.getClass()) {
return false;
}
TaskGroupNode that = (TaskGroupNode) other;
return Objects.equal(this.projectNode, that.projectNode) && Objects.equal(this.name, that.name);
}
@Override
public int hashCode() {
return Objects.hashCode(this.projectNode, this.name);
}
public static TaskGroupNode getDefault(ProjectNode projectNode) {
return new TaskGroupNode(projectNode, DEFAULT_NAME);
}
public static TaskGroupNode forName(ProjectNode projectNode, Maybe<String> groupName) {
Preconditions.checkNotNull(groupName);
String name = null;
if (groupName.isPresent()) {
name = groupName.get();
}
if (name == null) {
name = TaskGroupNode.DEFAULT_NAME;
}
return new TaskGroupNode(projectNode, normalizeGroupName(name));
}
private static String normalizeGroupName(String groupName) {
//see https://issues.gradle.org/browse/GRADLE-3429
return groupName.toLowerCase();
}
}