PageRenderTime 35ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/subprojects/core/src/main/groovy/org/gradle/api/internal/tasks/CachingTaskDependencyResolveContext.java

http://github.com/gradle/gradle
Java | 102 lines | 60 code | 10 blank | 32 comment | 8 complexity | 904d65a886e5ed8cbed05f42e3411d1e MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0, LGPL-2.1
  1. /*
  2. * Copyright 2010 the original author or authors.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.gradle.api.internal.tasks;
  17. import org.gradle.api.Buildable;
  18. import org.gradle.api.GradleException;
  19. import org.gradle.api.Task;
  20. import org.gradle.api.internal.CachingDirectedGraphWalker;
  21. import org.gradle.api.internal.DirectedGraph;
  22. import org.gradle.api.tasks.TaskDependency;
  23. import java.util.*;
  24. /**
  25. * <p>A {@link TaskDependencyResolveContext} which caches the dependencies for each {@link
  26. * org.gradle.api.tasks.TaskDependency} and {@link org.gradle.api.Buildable} instance during traversal of task
  27. * dependencies.</p>
  28. *
  29. * <p>Supported types:</p> <ul>
  30. *
  31. * <li>{@link org.gradle.api.Task}</li>
  32. *
  33. * <li>{@link org.gradle.api.tasks.TaskDependency}</li>
  34. *
  35. * <li>{@link org.gradle.api.internal.tasks.TaskDependencyInternal}</li>
  36. *
  37. * <li>{@link org.gradle.api.Buildable}</li>
  38. *
  39. * </ul>
  40. */
  41. public class CachingTaskDependencyResolveContext implements TaskDependencyResolveContext, TaskDependency {
  42. private final LinkedList<Object> queue = new LinkedList<Object>();
  43. private final CachingDirectedGraphWalker<Object, Task> walker = new CachingDirectedGraphWalker<Object, Task>(
  44. new TaskGraphImpl());
  45. private Task task;
  46. public Set<? extends Task> getDependencies(Task task) {
  47. add(task.getTaskDependencies());
  48. return resolve(task);
  49. }
  50. public Task getTask() {
  51. return task;
  52. }
  53. public Set<Task> resolve(Task task) {
  54. this.task = task;
  55. try {
  56. return doResolve();
  57. } catch (Exception e) {
  58. throw new GradleException(String.format("Could not determine the dependencies of %s.", task), e);
  59. } finally {
  60. queue.clear();
  61. this.task = null;
  62. }
  63. }
  64. private Set<Task> doResolve() {
  65. walker.add(queue);
  66. return walker.findValues();
  67. }
  68. public void add(Object dependency) {
  69. queue.add(dependency);
  70. }
  71. private class TaskGraphImpl implements DirectedGraph<Object, Task> {
  72. public void getNodeValues(Object node, Collection<Task> values, Collection<Object> connectedNodes) {
  73. if (node instanceof TaskDependencyInternal) {
  74. TaskDependencyInternal taskDependency = (TaskDependencyInternal) node;
  75. queue.clear();
  76. taskDependency.resolve(CachingTaskDependencyResolveContext.this);
  77. connectedNodes.addAll(queue);
  78. } else if (node instanceof Buildable) {
  79. Buildable buildable = (Buildable) node;
  80. connectedNodes.add(buildable.getBuildDependencies());
  81. } else if (node instanceof TaskDependency) {
  82. TaskDependency dependency = (TaskDependency) node;
  83. values.addAll(dependency.getDependencies(task));
  84. } else if (node instanceof Task) {
  85. values.add((Task) node);
  86. } else {
  87. throw new IllegalArgumentException(String.format("Cannot resolve object of unknown type %s to a Task.",
  88. node.getClass().getSimpleName()));
  89. }
  90. }
  91. }
  92. }