| @@ -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> Task |
|
24 | default <T extends Task> TaskProvider<T> task(String name, Class<T> clazz) { | |
| 25 |
|
|
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> Task |
|
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 |
|
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 Task |
|
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> Task |
|
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); | |||
| 40 | } |
|
44 | } | |
|
|
45 | } | |||
General Comments 0
You need to be logged in to leave comments.
Login now
