##// END OF EJS Templates
WIP moving from TaskSpec to TaskProvider
cin -
r9:99956175cc38 default
parent child
Show More
@@ -0,0 +1,24
1 package org.implab.gradle.common.utils;
2
3 import groovy.lang.Closure;
4
5 import org.eclipse.jdt.annotation.NonNullByDefault;
6 import org.gradle.api.Action;
7
8 @NonNullByDefault
9 public final class Closures {
10 private Closures() {
11 }
12
13 public static <T> Action<T> action(Closure<?> closure) {
14 return arg -> {
15 closure.setDelegate(arg);
16 closure.call(arg);
17 };
18 }
19
20 public static void apply(Closure<?> action, Object target) {
21 action.setDelegate(target);
22 action.call(target);
23 }
24 }
@@ -1,78 +1,77
1 1 package org.implab.gradle.common;
2 2
3 3 import javax.inject.Inject;
4 4
5 5 import org.gradle.api.Action;
6 6 import org.gradle.api.NamedDomainObjectProvider;
7 7 import org.gradle.api.Plugin;
8 8 import org.gradle.api.Project;
9 9 import org.gradle.api.Task;
10 10 import org.gradle.api.artifacts.Configuration;
11 11 import org.gradle.api.file.Directory;
12 12 import org.gradle.api.tasks.TaskContainer;
13 import org.gradle.api.tasks.TaskProvider;
13 14 import org.implab.gradle.common.dsl.TaskGroup;
14 import org.implab.gradle.common.dsl.TaskSpec;
15 15 import org.implab.gradle.common.dsl.TasksMixin;
16 16 import org.implab.gradle.common.utils.ExtraProps;
17 17
18 18 /** Project configuration traits */
19 19 public interface ProjectMixin extends TasksMixin {
20 20 @Inject
21 21 Project getProject();
22 22
23 23 @Override
24 default <T extends Task> TaskSpec<T> task(String name, Class<T> clazz) {
25 var provider = getProject().getTasks().register(name, clazz);
26 return new TaskSpec<>(provider);
24 default <T extends Task> TaskProvider<T> task(String name, Class<T> clazz) {
25 return getProject().getTasks().register(name, clazz);
27 26 }
28 27
29 28 /** Creates a new task group */
30 29 default TaskGroup taskGroup(String name) {
31 30 return new TaskGroup(name) {
32 31 @Override
33 32 protected TaskContainer tasks() {
34 33 return getProject().getTasks();
35 34 }
36 35 };
37 36 }
38 37
39 38 /** Registers the new configuration */
40 39 default NamedDomainObjectProvider<Configuration> configuration(String name, Action<? super Configuration> configure) {
41 40 return getProject().getConfigurations().register(name, configure);
42 41 }
43 42
44 43 /** Returns the project directory */
45 44 default Directory projectDirectory() {
46 45 return getProject().getLayout().getProjectDirectory();
47 46 }
48 47
49 48 /** Applies and returns the specified plugin, the plugin is applied only once. */
50 49 default <T extends Plugin<Project>> T plugin(Class<T> clazz) {
51 50 getProject().getPluginManager().apply(clazz);
52 51 return getProject().getPlugins().findPlugin(clazz);
53 52 }
54 53
55 54 /**
56 55 * @param classes The list of classes to register as extensions
57 56 */
58 57 default void exportClasses(Class<?>... classes) {
59 58 var props = ExtraProps.of(getProject());
60 59 for (var clazz : classes)
61 60 props.put(clazz.getSimpleName(), clazz);
62 61 }
63 62
64 63 /** Creates and register a new project extension.
65 64 *
66 65 * @param <T> The type of the extension
67 66 * @param extensionName The name of the extension in the project
68 67 * @param clazz The class of the extension
69 68 * @return the newly created extension
70 69 */
71 70 default <T> T extension(String extensionName, Class<T> clazz) {
72 71 T extension = getProject().getObjects().newInstance(clazz);
73 72 getProject().getExtensions().add(extensionName, extension);
74 73 return extension;
75 74 }
76 75
77 76 }
78 77
@@ -1,25 +1,26
1 1 package org.implab.gradle.common.dsl;
2 2
3 3 import java.util.Objects;
4 4
5 5 import org.gradle.api.Task;
6 6 import org.gradle.api.tasks.TaskContainer;
7 import org.gradle.api.tasks.TaskProvider;
7 8
8 9 public abstract class TaskGroup implements TasksMixin {
9 10 private final String groupName;
10 11
11 12 protected abstract TaskContainer tasks();
12 13
13 14 public TaskGroup(String name) {
14 15 Objects.requireNonNull(name, "The group name is required");
15 16 this.groupName = name;
16 17 }
17 18
18 19 @Override
19 public <T extends Task> TaskSpec<T> task(String taskName, Class<T> clazz) {
20 public <T extends Task> TaskProvider<T> task(String taskName, Class<T> clazz) {
20 21 var provider = tasks().register(taskName, clazz);
21 22 provider.configure(t -> t.setGroup(groupName));
22 return new TaskSpec<>(provider);
23 return provider;
23 24 }
24 25
25 26 }
@@ -1,12 +1,13
1 1 package org.implab.gradle.common.dsl;
2 2
3 3 import org.gradle.api.Task;
4 import org.gradle.api.tasks.TaskProvider;
4 5
5 6 public interface TasksMixin {
6 7
7 default TaskSpec<Task> task(String name) {
8 default TaskProvider<Task> task(String name) {
8 9 return task(name, Task.class);
9 10 }
10 11
11 <T extends Task> TaskSpec<T> task(String name, Class<T> clazz);
12 <T extends Task> TaskProvider<T> task(String name, Class<T> clazz);
12 13 }
@@ -1,40 +1,45
1 1 package org.implab.gradle.common.utils;
2 2
3 3 import java.util.function.Supplier;
4 4
5 5 import javax.inject.Inject;
6 6
7 7 import org.gradle.api.NamedDomainObjectContainer;
8 import org.gradle.api.NamedDomainObjectFactory;
8 9 import org.gradle.api.model.ObjectFactory;
9 10 import org.gradle.api.provider.Provider;
10 11 import org.gradle.api.provider.ProviderFactory;
11 12
12 13 import groovy.lang.Closure;
13 14
14 15 public interface ObjectsMixin {
15 16 @Inject
16 17 ObjectFactory getObjects();
17 18
18 19 @Inject
19 20 ProviderFactory getProviders();
20 21
21 22 default <T> Provider<T> provider(Supplier<T> supplier) {
22 23 return getProviders().provider(supplier::get);
23 24 }
24 25
25 26 default <T> Provider<T> provider(Closure<T> closure) {
26 27 return getProviders().provider(closure);
27 28 }
28 29
29 30 default <T> T newInstance(Class<T> clazz) {
30 31 return getObjects().newInstance(clazz);
31 32 }
32 33
33 34 default <T> T newInstance(Class<T> clazz, Object... params) {
34 35 return getObjects().newInstance(clazz, params);
35 36 }
36 37
37 38 default <T> NamedDomainObjectContainer<T> newContainer(Class<T> clazz) {
38 39 return getObjects().domainObjectContainer(clazz);
39 40 }
41
42 default <T> NamedDomainObjectContainer<T> newContainer(Class<T> clazz, NamedDomainObjectFactory<T> factory) {
43 return getObjects().domainObjectContainer(clazz, factory);
40 44 }
45 }
General Comments 0
You need to be logged in to leave comments. Login now