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