##// END OF EJS Templates
Refactoring, removed GenericSourceSetOutput.
cin -
r23:8e57f0a2d4de default
parent child
Show More
@@ -2,6 +2,7
2 "java.configuration.updateBuildConfiguration": "automatic",
2 "java.configuration.updateBuildConfiguration": "automatic",
3 "java.compile.nullAnalysis.mode": "automatic",
3 "java.compile.nullAnalysis.mode": "automatic",
4 "cSpell.words": [
4 "cSpell.words": [
5 "implab"
5 "implab",
6 "rawtypes"
6 ]
7 ]
7 } No newline at end of file
8 }
@@ -1,4 +1,4
1 package org.implab.gradle.common.utils;
1 package org.implab.gradle.common.core.gradle;
2
2
3 import java.util.function.Consumer;
3 import java.util.function.Consumer;
4
4
@@ -1,4 +1,4
1 package org.implab.gradle.common.utils;
1 package org.implab.gradle.common.core.gradle;
2
2
3 import java.util.HashMap;
3 import java.util.HashMap;
4 import java.util.Map;
4 import java.util.Map;
@@ -1,4 +1,4
1 package org.implab.gradle.common.tasks;
1 package org.implab.gradle.common.core.gradle;
2
2
3 import org.gradle.api.Project;
3 import org.gradle.api.Project;
4 import org.gradle.api.Task;
4 import org.gradle.api.Task;
@@ -1,4 +1,4
1 package org.implab.gradle.common.utils;
1 package org.implab.gradle.common.core.lang;
2
2
3 import groovy.lang.Closure;
3 import groovy.lang.Closure;
4
4
@@ -1,4 +1,4
1 package org.implab.gradle.common.utils;
1 package org.implab.gradle.common.core.lang;
2
2
3 import java.util.function.Consumer;
3 import java.util.function.Consumer;
4 import java.util.function.Function;
4 import java.util.function.Function;
@@ -12,7 +12,6 public class Exceptions {
12 * @param clazz
12 * @param clazz
13 * @throws E
13 * @throws E
14 */
14 */
15 @SuppressWarnings("unused")
16 public static <E extends Throwable> void mayThrow(Class<E> clazz) throws E {
15 public static <E extends Throwable> void mayThrow(Class<E> clazz) throws E {
17 }
16 }
18
17
@@ -1,10 +1,10
1 package org.implab.gradle.common.utils;
1 package org.implab.gradle.common.core.lang;
2
2
3 import java.util.concurrent.atomic.AtomicReference;
3 import java.util.Objects;
4 import java.util.function.Supplier;
4 import java.util.function.Supplier;
5
5
6 public class LazyValue<T> implements Supplier<T> {
6 public class LazyValue<T> implements Supplier<T> {
7 private final AtomicReference<T> reference = new AtomicReference<>();
7 private volatile T value;
8
8
9 private final Supplier<T> innerSupplier;
9 private final Supplier<T> innerSupplier;
10
10
@@ -14,16 +14,21 public class LazyValue<T> implements Sup
14
14
15 @Override
15 @Override
16 public T get() {
16 public T get() {
17 var t = reference.get();
17 var v = value;
18 if (t != null)
18 if (v != null) {
19 return t;
19 return v;
20 return updateValue();
20 }
21 }
22
21
23 private T updateValue() {
22 synchronized (this) {
24 var v = innerSupplier.get();
23 v = value;
25 var t = reference.compareAndExchange(null, v);
24 if (v == null) {
26 return t != null ? t : v;
25 v = Objects.requireNonNull(
26 innerSupplier.get(),
27 "LazyValue supplier returned null");
28 value = v;
29 }
30 return v;
31 }
27 }
32 }
28
33
29 }
34 }
@@ -1,4 +1,4
1 package org.implab.gradle.common.utils;
1 package org.implab.gradle.common.core.lang;
2
2
3 import com.fasterxml.jackson.annotation.JsonCreator;
3 import com.fasterxml.jackson.annotation.JsonCreator;
4 import com.fasterxml.jackson.annotation.JsonValue;
4 import com.fasterxml.jackson.annotation.JsonValue;
@@ -1,4 +1,4
1 package org.implab.gradle.common.utils;
1 package org.implab.gradle.common.core.lang;
2
2
3 import java.util.regex.Pattern;
3 import java.util.regex.Pattern;
4
4
@@ -1,4 +1,4
1 package org.implab.gradle.common.utils;
1 package org.implab.gradle.common.core.lang;
2
2
3 import java.text.MessageFormat;
3 import java.text.MessageFormat;
4 import java.util.Iterator;
4 import java.util.Iterator;
@@ -1,8 +1,6
1 package org.implab.gradle.common.utils.os;
1 package org.implab.gradle.common.core.os;
2
2
3 import org.implab.gradle.common.utils.OperatingSystem;
3 class FreeBsd extends GenericSystem{
4
5 public class FreeBsd extends GenericSystem{
6
4
7 FreeBsd(String name, String version) {
5 FreeBsd(String name, String version) {
8 super(name, version);
6 super(name, version);
@@ -1,4 +1,4
1 package org.implab.gradle.common.utils.os;
1 package org.implab.gradle.common.core.os;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.util.Arrays;
4 import java.util.Arrays;
@@ -7,8 +7,7 import java.util.function.Function;
7 import java.util.regex.Pattern;
7 import java.util.regex.Pattern;
8 import java.util.stream.Stream;
8 import java.util.stream.Stream;
9
9
10 import org.implab.gradle.common.utils.OperatingSystem;
10 import org.implab.gradle.common.core.lang.Values;
11 import org.implab.gradle.common.utils.Values;
12
11
13 class GenericSystem implements OperatingSystem {
12 class GenericSystem implements OperatingSystem {
14
13
@@ -1,8 +1,6
1 package org.implab.gradle.common.utils.os;
1 package org.implab.gradle.common.core.os;
2
2
3 import org.implab.gradle.common.utils.OperatingSystem;
3 class Linux extends GenericSystem {
4
5 public class Linux extends GenericSystem {
6
4
7 Linux(String name, String version) {
5 Linux(String name, String version) {
8 super(name, version);
6 super(name, version);
@@ -1,8 +1,6
1 package org.implab.gradle.common.utils.os;
1 package org.implab.gradle.common.core.os;
2
2
3 import org.implab.gradle.common.utils.OperatingSystem;
3 class MacOs extends GenericSystem {
4
5 public class MacOs extends GenericSystem {
6
4
7 MacOs(String name, String version) {
5 MacOs(String name, String version) {
8 super(name, version);
6 super(name, version);
@@ -1,10 +1,8
1 package org.implab.gradle.common.utils;
1 package org.implab.gradle.common.core.os;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.util.Optional;
4 import java.util.Optional;
5
5
6 import org.implab.gradle.common.utils.os.SystemResolver;
7
8 public interface OperatingSystem {
6 public interface OperatingSystem {
9
7
10 public static final String WINDOWS_FAMILY = "windows";
8 public static final String WINDOWS_FAMILY = "windows";
@@ -1,9 +1,8
1 package org.implab.gradle.common.utils.os;
1 package org.implab.gradle.common.core.os;
2
2
3 import org.implab.gradle.common.utils.LazyValue;
3 import org.implab.gradle.common.core.lang.LazyValue;
4 import org.implab.gradle.common.utils.OperatingSystem;
5
4
6 public class SystemResolver {
5 class SystemResolver {
7
6
8 private final static LazyValue<OperatingSystem> current = new LazyValue<>(SystemResolver::resolveCurrent);
7 private final static LazyValue<OperatingSystem> current = new LazyValue<>(SystemResolver::resolveCurrent);
9
8
@@ -1,11 +1,9
1 package org.implab.gradle.common.utils.os;
1 package org.implab.gradle.common.core.os;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.util.function.Function;
4 import java.util.function.Function;
5 import java.util.stream.Stream;
5 import java.util.stream.Stream;
6
6
7 import org.implab.gradle.common.utils.OperatingSystem;
8
9 class Windows extends GenericSystem {
7 class Windows extends GenericSystem {
10
8
11 private Stream<String> exeSuffixes = Stream.of(".cmd", ".bat", ".exe");
9 private Stream<String> exeSuffixes = Stream.of(".cmd", ".bat", ".exe");
@@ -1,4 +1,4
1 package org.implab.gradle.common.dsl;
1 package org.implab.gradle.common.exec.dsl;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.io.InputStream;
4 import java.io.InputStream;
@@ -7,8 +7,8 import java.util.function.Supplier;
7
7
8 import org.gradle.api.provider.Provider;
8 import org.gradle.api.provider.Provider;
9 import org.gradle.util.Configurable;
9 import org.gradle.util.Configurable;
10 import org.implab.gradle.common.exec.RedirectFrom;
10 import org.implab.gradle.common.core.lang.Closures;
11 import org.implab.gradle.common.utils.Closures;
11 import org.implab.gradle.common.exec.runtime.RedirectFrom;
12
12
13 import groovy.lang.Closure;
13 import groovy.lang.Closure;
14
14
@@ -1,4 +1,4
1 package org.implab.gradle.common.dsl;
1 package org.implab.gradle.common.exec.dsl;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.io.OutputStream;
4 import java.io.OutputStream;
@@ -10,8 +10,8 import org.eclipse.jdt.annotation.NonNul
10 import org.eclipse.jdt.annotation.Nullable;
10 import org.eclipse.jdt.annotation.Nullable;
11 import org.gradle.api.provider.Provider;
11 import org.gradle.api.provider.Provider;
12 import org.gradle.util.Configurable;
12 import org.gradle.util.Configurable;
13 import org.implab.gradle.common.exec.RedirectTo;
13 import org.implab.gradle.common.core.lang.Closures;
14 import org.implab.gradle.common.utils.Closures;
14 import org.implab.gradle.common.exec.runtime.RedirectTo;
15
15
16 import groovy.lang.Closure;
16 import groovy.lang.Closure;
17
17
@@ -1,9 +1,9
1 package org.implab.gradle.common.dsl;
1 package org.implab.gradle.common.exec.dsl;
2
2
3 import java.util.stream.Stream;
3 import java.util.stream.Stream;
4
4
5 import org.gradle.api.provider.ListProperty;
5 import org.gradle.api.provider.ListProperty;
6 import org.implab.gradle.common.utils.Properties;
6 import org.implab.gradle.common.core.gradle.Properties;
7
7
8 public interface TaskCommandSpecMixin {
8 public interface TaskCommandSpecMixin {
9 ListProperty<String> getCommandLine();
9 ListProperty<String> getCommandLine();
@@ -1,4 +1,4
1 package org.implab.gradle.common.dsl;
1 package org.implab.gradle.common.exec.dsl;
2
2
3 import java.util.Map;
3 import java.util.Map;
4
4
@@ -6,8 +6,8 import org.gradle.api.Action;
6 import org.gradle.api.file.DirectoryProperty;
6 import org.gradle.api.file.DirectoryProperty;
7 import org.gradle.api.provider.MapProperty;
7 import org.gradle.api.provider.MapProperty;
8 import org.gradle.api.provider.Property;
8 import org.gradle.api.provider.Property;
9 import org.implab.gradle.common.utils.Closures;
9 import org.implab.gradle.common.core.gradle.Properties;
10 import org.implab.gradle.common.utils.Properties;
10 import org.implab.gradle.common.core.lang.Closures;
11
11
12 import groovy.lang.Closure;
12 import groovy.lang.Closure;
13
13
@@ -1,4 +1,4
1 package org.implab.gradle.common.dsl;
1 package org.implab.gradle.common.exec.dsl;
2
2
3 import org.eclipse.jdt.annotation.NonNullByDefault;
3 import org.eclipse.jdt.annotation.NonNullByDefault;
4
4
@@ -1,11 +1,11
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.model;
2
2
3 import static java.util.Objects.requireNonNull;
3 import static java.util.Objects.requireNonNull;
4
4
5 import java.util.Optional;
5 import java.util.Optional;
6
6
7 import org.eclipse.jdt.annotation.NonNullByDefault;
7 import org.eclipse.jdt.annotation.NonNullByDefault;
8 import org.implab.gradle.common.utils.Values;
8 import org.implab.gradle.common.core.lang.Values;
9
9
10 @NonNullByDefault
10 @NonNullByDefault
11 public interface CommandArgumentsBuilder<S extends CommandArgumentsBuilder<S>> {
11 public interface CommandArgumentsBuilder<S extends CommandArgumentsBuilder<S>> {
@@ -1,9 +1,9
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.model;
2
2
3 import java.io.File;
3 import java.io.File;
4
4
5 import org.eclipse.jdt.annotation.NonNullByDefault;
5 import org.eclipse.jdt.annotation.NonNullByDefault;
6 import org.implab.gradle.common.utils.Values;
6 import org.implab.gradle.common.core.lang.Values;
7
7
8 /** Command builder interface, used to specify the executable and parameters */
8 /** Command builder interface, used to specify the executable and parameters */
9 @NonNullByDefault
9 @NonNullByDefault
@@ -1,4 +1,4
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.model;
2
2
3 import java.util.List;
3 import java.util.List;
4 import java.util.stream.Stream;
4 import java.util.stream.Stream;
@@ -1,4 +1,4
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.model;
2
2
3 import java.util.List;
3 import java.util.List;
4
4
@@ -1,4 +1,4
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.model;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.util.Map;
4 import java.util.Map;
@@ -1,4 +1,7
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.model;
2
3 import org.implab.gradle.common.exec.runtime.RedirectFrom;
4 import org.implab.gradle.common.exec.runtime.RedirectTo;
2
5
3 import java.util.Optional;
6 import java.util.Optional;
4
7
@@ -1,4 +1,4
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import java.util.HashMap;
3 import java.util.HashMap;
4 import java.util.Map;
4 import java.util.Map;
@@ -7,6 +7,8 import java.util.concurrent.CompletableF
7
7
8 import org.eclipse.jdt.annotation.NonNullByDefault;
8 import org.eclipse.jdt.annotation.NonNullByDefault;
9 import org.eclipse.jdt.annotation.Nullable;
9 import org.eclipse.jdt.annotation.Nullable;
10 import org.implab.gradle.common.exec.model.EnvironmentSpec;
11 import org.implab.gradle.common.exec.model.PipeSpec;
10
12
11 import java.io.File;
13 import java.io.File;
12 import java.io.IOException;
14 import java.io.IOException;
@@ -1,4 +1,4
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import java.io.ByteArrayInputStream;
3 import java.io.ByteArrayInputStream;
4 import java.io.IOException;
4 import java.io.IOException;
@@ -7,6 +7,9 import java.util.concurrent.CompletableF
7 import java.util.stream.Collectors;
7 import java.util.stream.Collectors;
8
8
9 import org.eclipse.jdt.annotation.NonNullByDefault;
9 import org.eclipse.jdt.annotation.NonNullByDefault;
10 import org.implab.gradle.common.exec.model.CommandSpec;
11 import org.implab.gradle.common.exec.model.EnvironmentSpec;
12 import org.implab.gradle.common.exec.model.PipeSpec;
10
13
11 @NonNullByDefault
14 @NonNullByDefault
12 class EchoExecBuilder extends AbstractExecBuilder<CommandSpec> {
15 class EchoExecBuilder extends AbstractExecBuilder<CommandSpec> {
@@ -1,10 +1,11
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.util.Map;
4 import java.util.Map;
5 import java.util.Optional;
5 import java.util.Optional;
6
6
7 import org.eclipse.jdt.annotation.NonNullByDefault;
7 import org.eclipse.jdt.annotation.NonNullByDefault;
8 import org.implab.gradle.common.exec.model.EnvironmentSpec;
8
9
9 @NonNullByDefault
10 @NonNullByDefault
10 public interface EnvironmentBuilder {
11 public interface EnvironmentBuilder {
@@ -1,8 +1,9
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import java.util.Optional;
3 import java.util.Optional;
4
4
5 import org.eclipse.jdt.annotation.NonNullByDefault;
5 import org.eclipse.jdt.annotation.NonNullByDefault;
6 import org.implab.gradle.common.exec.model.PipeSpec;
6
7
7 @NonNullByDefault
8 @NonNullByDefault
8 public interface PipeBuilder {
9 public interface PipeBuilder {
@@ -1,4 +1,4
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.io.FileInputStream;
4 import java.io.FileInputStream;
@@ -1,4 +1,4
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.io.FileOutputStream;
4 import java.io.FileOutputStream;
@@ -108,4 +108,4 public interface RedirectTo {
108 throw new IllegalArgumentException("The specified argument type isn't supported: " + output.getClass());
108 throw new IllegalArgumentException("The specified argument type isn't supported: " + output.getClass());
109 }
109 }
110 }
110 }
111 } No newline at end of file
111 }
@@ -1,6 +1,7
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import org.eclipse.jdt.annotation.NonNullByDefault;
3 import org.eclipse.jdt.annotation.NonNullByDefault;
4 import org.implab.gradle.common.exec.model.CommandSpec;
4
5
5 @NonNullByDefault
6 @NonNullByDefault
6 public interface Shell {
7 public interface Shell {
@@ -1,4 +1,4
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import java.io.IOException;
3 import java.io.IOException;
4 import java.util.ArrayList;
4 import java.util.ArrayList;
@@ -6,7 +6,7 import java.util.List;
6 import java.util.concurrent.CompletableFuture;
6 import java.util.concurrent.CompletableFuture;
7
7
8 import org.eclipse.jdt.annotation.NonNullByDefault;
8 import org.eclipse.jdt.annotation.NonNullByDefault;
9 import org.implab.gradle.common.utils.Exceptions;
9 import org.implab.gradle.common.core.lang.Exceptions;
10
10
11 @NonNullByDefault
11 @NonNullByDefault
12 public interface ShellExec extends PipeBuilder, EnvironmentBuilder {
12 public interface ShellExec extends PipeBuilder, EnvironmentBuilder {
@@ -1,7 +1,9
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import org.eclipse.jdt.annotation.NonNullByDefault;
3 import org.eclipse.jdt.annotation.NonNullByDefault;
4 import org.gradle.api.Action;
4 import org.gradle.api.Action;
5 import org.implab.gradle.common.exec.model.CommandArgumentsBuilder;
6 import org.implab.gradle.common.exec.model.CommandSpec;
5
7
6 @NonNullByDefault
8 @NonNullByDefault
7 public class ShellTool {
9 public class ShellTool {
@@ -1,4 +1,4
1 package org.implab.gradle.common.exec;
1 package org.implab.gradle.common.exec.runtime;
2
2
3 import java.io.IOException;
3 import java.io.IOException;
4 import java.lang.ProcessBuilder.Redirect;
4 import java.lang.ProcessBuilder.Redirect;
@@ -6,6 +6,9 import java.util.ArrayList;
6 import java.util.concurrent.CompletableFuture;
6 import java.util.concurrent.CompletableFuture;
7
7
8 import org.eclipse.jdt.annotation.NonNullByDefault;
8 import org.eclipse.jdt.annotation.NonNullByDefault;
9 import org.implab.gradle.common.exec.model.CommandSpec;
10 import org.implab.gradle.common.exec.model.EnvironmentSpec;
11 import org.implab.gradle.common.exec.model.PipeSpec;
9
12
10 @NonNullByDefault
13 @NonNullByDefault
11 class SystemExecBuilder extends AbstractExecBuilder<CommandSpec> {
14 class SystemExecBuilder extends AbstractExecBuilder<CommandSpec> {
@@ -1,4 +1,4
1 package org.implab.gradle.common.tasks;
1 package org.implab.gradle.common.exec.tasks;
2
2
3 import java.io.IOException;
3 import java.io.IOException;
4 import java.util.Map;
4 import java.util.Map;
@@ -11,14 +11,14 import org.gradle.api.provider.MapProper
11 import org.gradle.api.provider.Property;
11 import org.gradle.api.provider.Property;
12 import org.gradle.api.tasks.Internal;
12 import org.gradle.api.tasks.Internal;
13 import org.gradle.api.tasks.TaskAction;
13 import org.gradle.api.tasks.TaskAction;
14 import org.implab.gradle.common.dsl.RedirectFromSpec;
14 import org.implab.gradle.common.core.lang.Exceptions;
15 import org.implab.gradle.common.dsl.RedirectToSpec;
15 import org.implab.gradle.common.core.lang.Values;
16 import org.implab.gradle.common.dsl.TaskEnvSpecMixin;
16 import org.implab.gradle.common.exec.dsl.RedirectFromSpec;
17 import org.implab.gradle.common.dsl.TaskPipeSpecMixin;
17 import org.implab.gradle.common.exec.dsl.RedirectToSpec;
18 import org.implab.gradle.common.exec.RedirectTo;
18 import org.implab.gradle.common.exec.dsl.TaskEnvSpecMixin;
19 import org.implab.gradle.common.exec.ShellExec;
19 import org.implab.gradle.common.exec.dsl.TaskPipeSpecMixin;
20 import org.implab.gradle.common.utils.Exceptions;
20 import org.implab.gradle.common.exec.runtime.RedirectTo;
21 import org.implab.gradle.common.utils.Values;
21 import org.implab.gradle.common.exec.runtime.ShellExec;
22
22
23 public abstract class AbstractShellExecTask
23 public abstract class AbstractShellExecTask
24 extends DefaultTask
24 extends DefaultTask
@@ -105,4 +105,4 public abstract class AbstractShellExecT
105 if (code != 0)
105 if (code != 0)
106 throw new IOException(String.format("The process is terminated with code %s", code));
106 throw new IOException(String.format("The process is terminated with code %s", code));
107 }
107 }
108 } No newline at end of file
108 }
@@ -1,12 +1,12
1 package org.implab.gradle.common.tasks;
1 package org.implab.gradle.common.exec.tasks;
2
2
3 import org.gradle.api.provider.ListProperty;
3 import org.gradle.api.provider.ListProperty;
4 import org.gradle.api.provider.Property;
4 import org.gradle.api.provider.Property;
5 import org.gradle.api.tasks.Internal;
5 import org.gradle.api.tasks.Internal;
6 import org.implab.gradle.common.dsl.TaskCommandSpecMixin;
6 import org.implab.gradle.common.exec.dsl.TaskCommandSpecMixin;
7 import org.implab.gradle.common.exec.CommandSpec;
7 import org.implab.gradle.common.exec.model.CommandSpec;
8 import org.implab.gradle.common.exec.Shell;
8 import org.implab.gradle.common.exec.runtime.Shell;
9 import org.implab.gradle.common.exec.ShellExec;
9 import org.implab.gradle.common.exec.runtime.ShellExec;
10
10
11 public abstract class ShellExecTask
11 public abstract class ShellExecTask
12 extends AbstractShellExecTask
12 extends AbstractShellExecTask
@@ -1,4 +1,4
1 package org.implab.gradle.common.json;
1 package org.implab.gradle.common.json.core;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.io.IOException;
4 import java.io.IOException;
@@ -6,7 +6,7 import java.util.Map;
6 import java.util.function.Consumer;
6 import java.util.function.Consumer;
7 import java.util.function.Function;
7 import java.util.function.Function;
8
8
9 import org.implab.gradle.common.utils.LazyValue;
9 import org.implab.gradle.common.core.lang.LazyValue;
10
10
11 import com.fasterxml.jackson.annotation.JsonInclude.Include;
11 import com.fasterxml.jackson.annotation.JsonInclude.Include;
12 import com.fasterxml.jackson.core.JsonProcessingException;
12 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -1,4 +1,4
1 package org.implab.gradle.common.json;
1 package org.implab.gradle.common.json.core;
2
2
3 import java.util.Arrays;
3 import java.util.Arrays;
4 import java.util.LinkedHashSet;
4 import java.util.LinkedHashSet;
@@ -6,7 +6,7 import java.util.Set;
6 import java.util.function.Predicate;
6 import java.util.function.Predicate;
7
7
8 import org.gradle.api.Action;
8 import org.gradle.api.Action;
9 import org.implab.gradle.common.utils.Closures;
9 import org.implab.gradle.common.core.lang.Closures;
10
10
11 import groovy.lang.Closure;
11 import groovy.lang.Closure;
12
12
@@ -63,4 +63,4 public class MapImportSpec {
63 public static Predicate<String> buildPredicate(Closure<?> closure) {
63 public static Predicate<String> buildPredicate(Closure<?> closure) {
64 return buildPredicate(Closures.action(closure));
64 return buildPredicate(Closures.action(closure));
65 }
65 }
66 } No newline at end of file
66 }
@@ -1,4 +1,4
1 package org.implab.gradle.common.json;
1 package org.implab.gradle.common.json.dsl;
2
2
3
3
4 import org.gradle.api.provider.Provider;
4 import org.gradle.api.provider.Provider;
@@ -26,4 +26,4 public class DefaultJsonArraySpec implem
26 public List<Object> toList() {
26 public List<Object> toList() {
27 return Collections.unmodifiableList(values);
27 return Collections.unmodifiableList(values);
28 }
28 }
29 } No newline at end of file
29 }
@@ -1,4 +1,4
1 package org.implab.gradle.common.json;
1 package org.implab.gradle.common.json.dsl;
2
2
3 import org.gradle.api.provider.Provider;
3 import org.gradle.api.provider.Provider;
4
4
@@ -23,4 +23,4 public class DefaultJsonObjectSpec imple
23 public Map<String, Object> toMap() {
23 public Map<String, Object> toMap() {
24 return Collections.unmodifiableMap(values);
24 return Collections.unmodifiableMap(values);
25 }
25 }
26 } No newline at end of file
26 }
@@ -1,4 +1,4
1 package org.implab.gradle.common.json;
1 package org.implab.gradle.common.json.dsl;
2
2
3 import java.util.Arrays;
3 import java.util.Arrays;
4
4
@@ -1,4 +1,4
1 package org.implab.gradle.common.json;
1 package org.implab.gradle.common.json.dsl;
2
2
3 import org.gradle.api.Action;
3 import org.gradle.api.Action;
4
4
@@ -17,4 +17,4 public interface JsonArraySpec {
17 action.execute(child);
17 action.execute(child);
18 add(child.toList());
18 add(child.toList());
19 }
19 }
20 } No newline at end of file
20 }
@@ -1,10 +1,11
1 package org.implab.gradle.common.json;
1 package org.implab.gradle.common.json.dsl;
2
2
3 import java.io.File;
3 import java.io.File;
4
4
5 import org.gradle.api.Action;
5 import org.gradle.api.Action;
6 import org.gradle.api.file.RegularFile;
6 import org.gradle.api.file.RegularFile;
7 import org.gradle.api.provider.Provider;
7 import org.gradle.api.provider.Provider;
8 import org.implab.gradle.common.json.core.MapImportSpec;
8
9
9 public interface JsonMapSpec extends GroovyObjectSpec {
10 public interface JsonMapSpec extends GroovyObjectSpec {
10 void from(File file, Action<? super MapImportSpec> action);
11 void from(File file, Action<? super MapImportSpec> action);
@@ -1,4 +1,4
1 package org.implab.gradle.common.json;
1 package org.implab.gradle.common.json.dsl;
2
2
3 import org.gradle.api.Action;
3 import org.gradle.api.Action;
4
4
@@ -17,4 +17,4 public interface JsonObjectSpec {
17 action.execute(child);
17 action.execute(child);
18 set(key, child.toList());
18 set(key, child.toList());
19 }
19 }
20 } No newline at end of file
20 }
@@ -1,4 +1,4
1 package org.implab.gradle.common.tasks;
1 package org.implab.gradle.common.json.tasks;
2
2
3 import java.util.LinkedHashMap;
3 import java.util.LinkedHashMap;
4 import java.util.Map;
4 import java.util.Map;
@@ -20,13 +20,12 import org.gradle.api.tasks.Input;
20 import org.gradle.api.tasks.Internal;
20 import org.gradle.api.tasks.Internal;
21 import org.gradle.api.tasks.Optional;
21 import org.gradle.api.tasks.Optional;
22 import org.gradle.api.tasks.OutputFile;
22 import org.gradle.api.tasks.OutputFile;
23 import org.gradle.api.tasks.SkipWhenEmpty;
24 import org.gradle.api.tasks.TaskAction;
23 import org.gradle.api.tasks.TaskAction;
25 import org.implab.gradle.common.json.MapImportSpec;
24 import org.implab.gradle.common.core.gradle.Properties;
26 import org.implab.gradle.common.json.Json;
25 import org.implab.gradle.common.core.lang.Closures;
27 import org.implab.gradle.common.json.JsonObjectSpec;
26 import org.implab.gradle.common.json.core.Json;
28 import org.implab.gradle.common.utils.Closures;
27 import org.implab.gradle.common.json.core.MapImportSpec;
29 import org.implab.gradle.common.utils.Properties;
28 import org.implab.gradle.common.json.dsl.JsonObjectSpec;
30
29
31 import groovy.lang.Closure;
30 import groovy.lang.Closure;
32
31
@@ -1,39 +1,61
1 package org.implab.gradle.common.files;
1 package org.implab.gradle.common.sources;
2
2
3 import java.io.File;
3 import java.io.File;
4 import java.nio.file.Paths;
4 import java.nio.file.Paths;
5 import java.util.HashSet;
5 import java.util.HashSet;
6 import java.util.LinkedHashMap;
6 import java.util.List;
7 import java.util.List;
8 import java.util.Map;
7 import java.util.Objects;
9 import java.util.Objects;
8 import java.util.Set;
10 import java.util.Set;
9 import java.util.concurrent.Callable;
11 import java.util.concurrent.Callable;
12 import java.util.function.Function;
10 import java.util.stream.Collectors;
13 import java.util.stream.Collectors;
11
14
12 import javax.inject.Inject;
15 import javax.inject.Inject;
13
16
17 import org.gradle.api.InvalidUserDataException;
14 import org.gradle.api.Named;
18 import org.gradle.api.Named;
15 import org.gradle.api.NamedDomainObjectContainer;
19 import org.gradle.api.NamedDomainObjectContainer;
20 import org.gradle.api.Task;
21 import org.gradle.api.file.ConfigurableFileCollection;
16 import org.gradle.api.file.DirectoryProperty;
22 import org.gradle.api.file.DirectoryProperty;
17 import org.gradle.api.file.FileCollection;
23 import org.gradle.api.file.FileCollection;
18 import org.gradle.api.file.ProjectLayout;
24 import org.gradle.api.file.ProjectLayout;
19 import org.gradle.api.file.SourceDirectorySet;
25 import org.gradle.api.file.SourceDirectorySet;
20 import org.gradle.api.logging.Logger;
21 import org.gradle.api.logging.Logging;
22 import org.gradle.api.model.ObjectFactory;
26 import org.gradle.api.model.ObjectFactory;
27 import org.gradle.api.tasks.TaskProvider;
23 import org.gradle.util.Configurable;
28 import org.gradle.util.Configurable;
24 import org.implab.gradle.common.utils.Closures;
29 import org.implab.gradle.common.core.lang.Closures;
25
30
26 import groovy.lang.Closure;
31 import groovy.lang.Closure;
27
32
33 /**
34 * A configurable source set abstraction with named output roles.
35 *
36 * <p>
37 * Each instance aggregates multiple {@link SourceDirectorySet source sets}
38 * under a shared name and exposes typed outputs that must be declared up front.
39 * Default locations are {@code src/<name>} for sources and
40 * {@code build/<name>} for outputs, both of which can be customized via the
41 * exposed {@link DirectoryProperty} setters.
42 * </p>
43 *
44 * <p>
45 * Outputs are grouped by roles to make task wiring explicit. A role must be
46 * declared with {@link #declareRoles(String, String...)} (or the synonym
47 * {@link #declareOutputs(String, String...)}) before files can be registered
48 * against it. Attempting to register or retrieve an undeclared role results in
49 * {@link InvalidUserDataException}.
50 * </p>
51 */
28 public abstract class GenericSourceSet
52 public abstract class GenericSourceSet
29 implements Named, Configurable<GenericSourceSet> {
53 implements Named, Configurable<GenericSourceSet> {
30 private final Logger logger = Logging.getLogger(GenericSourceSet.class);
31
32 private final String name;
54 private final String name;
33
55
34 private final NamedDomainObjectContainer<SourceDirectorySet> sourceDirectorySets;
56 private final NamedDomainObjectContainer<SourceDirectorySet> sourceDirectorySets;
35
57
36 private final NamedDomainObjectContainer<GenericSourceSetOutput> outputs;
58 private final Map<String, ConfigurableFileCollection> outputs;
37
59
38 private final FileCollection allOutputs;
60 private final FileCollection allOutputs;
39
61
@@ -41,7 +63,7 public abstract class GenericSourceSet
41
63
42 private final ObjectFactory objects;
64 private final ObjectFactory objects;
43
65
44 private final Set<String> declaredOutputs = new HashSet<>();
66 private final Set<String> declaredRoles = new HashSet<>();
45
67
46 @Inject
68 @Inject
47 public GenericSourceSet(String name, ObjectFactory objects, ProjectLayout layout) {
69 public GenericSourceSet(String name, ObjectFactory objects, ProjectLayout layout) {
@@ -52,14 +74,12 public abstract class GenericSourceSet
52 SourceDirectorySet.class,
74 SourceDirectorySet.class,
53 this::createSourceDirectorySet);
75 this::createSourceDirectorySet);
54
76
55 outputs = objects.domainObjectContainer(GenericSourceSetOutput.class);
77 outputs = new LinkedHashMap<>();
56
78
57 allSourceDirectories = objects.fileCollection().from(sourceDirectoriesProvider());
79 allSourceDirectories = objects.fileCollection().from(sourceDirectoriesProvider());
58
80
59 allOutputs = objects.fileCollection().from(outputsProvider());
81 allOutputs = objects.fileCollection().from(outputsProvider());
60
82
61 outputs.addRule("Register a declared set on demand", this::registerOutputOnDemand);
62
63 getSourceSetDir().convention(layout
83 getSourceSetDir().convention(layout
64 .getProjectDirectory()
84 .getProjectDirectory()
65 .dir(Paths.get("src", name).toString()));
85 .dir(Paths.get("src", name).toString()));
@@ -74,57 +94,109 public abstract class GenericSourceSet
74 return name;
94 return name;
75 }
95 }
76
96
97 /**
98 * Base directory for this source set. Defaults to {@code src/<name>} under
99 * the project directory.
100 */
77 public abstract DirectoryProperty getSourceSetDir();
101 public abstract DirectoryProperty getSourceSetDir();
78
102
103 /**
104 * Base directory for outputs of this source set. Defaults to
105 * {@code build/<name>}.
106 */
79 public abstract DirectoryProperty getOutputsDir();
107 public abstract DirectoryProperty getOutputsDir();
80
108
109 /**
110 * The container of {@link SourceDirectorySet} instances that belong to this
111 * logical source set.
112 */
81 public NamedDomainObjectContainer<SourceDirectorySet> getSets() {
113 public NamedDomainObjectContainer<SourceDirectorySet> getSets() {
82 return sourceDirectorySets;
114 return sourceDirectorySets;
83 }
115 }
84
116
85 public NamedDomainObjectContainer<GenericSourceSetOutput> getOutputs() {
117 /**
86 return outputs;
118 * All registered outputs grouped across roles.
87 }
119 */
88
89 public FileCollection getAllOutputs() {
120 public FileCollection getAllOutputs() {
90 return allOutputs;
121 return allOutputs;
91 }
122 }
92
123
124 /**
125 * All source directories from every contained {@link SourceDirectorySet}.
126 */
93 public FileCollection getAllSourceDirectories() {
127 public FileCollection getAllSourceDirectories() {
94 return allSourceDirectories;
128 return allSourceDirectories;
95 }
129 }
96
130
97 public FileCollection output(String name) {
131 /**
98 return getOutputs().getAt(name).getFileCollection();
132 * Returns the file collection for the specified output role, creating it
133 * if necessary.
134 *
135 * @throws InvalidUserDataException if the role was not declared
136 */
137 public ConfigurableFileCollection output(String name) {
138 requireDeclaredRole(name);
139 return outputs.computeIfAbsent(name, key -> objects.fileCollection());
99 }
140 }
100
141
101 public void declareOutputs(String name, String... extra) {
142 /**
102 declaredOutputs.add(Objects.requireNonNull(name, "declareOutputs: The output name cannot be null"));
143 * Declares allowed output roles. Roles must be declared before registering
144 * files under them.
145 */
146 public void declareRoles(String name, String... extra) {
147 declaredRoles.add(Objects.requireNonNull(name, "declareRoles: The output name cannot be null"));
103 for (var x : extra)
148 for (var x : extra)
104 declaredOutputs.add(Objects.requireNonNull(x, "declareOutputs: The output name cannot be null"));
149 declaredRoles.add(Objects.requireNonNull(x, "declareRoles: The output name cannot be null"));
105 }
150 }
106
151
107 @Override
152 /**
108 public GenericSourceSet configure(@SuppressWarnings("rawtypes") Closure configure) {
153 * Alias for {@link #declareRoles(String, String...)} kept for DSL clarity.
109 Closures.apply(configure, this);
154 */
110 return this;
155 public void declareOutputs(String name, String... extra) {
156 declareRoles(name, extra);
157 }
158
159 /**
160 * Registers files produced elsewhere under the given role.
161 */
162 public void registerOutput(String name, Object... files) {
163 output(name).from(files);
111 }
164 }
112
165
113 private void registerOutputOnDemand(String outputName) {
166 /**
114 logger.info("SourceSet '{}': registerOutputOnDemand '{}'", name, outputName);
167 * Registers output files produced by a task, using a mapper to extract the
168 * output from the task. The task will be added as a build dependency of this
169 * output.
170 */
171 public <T extends Task> void registerOutput(String name, TaskProvider<T> task,
172 Function<? super T, ?> mapper) {
173 output(name).from(task.map(mapper::apply))
174 .builtBy(task);
175 }
115
176
116 if (declaredOutputs.contains(outputName))
177 /**
117 outputs.register(outputName);
178 * Applies a Groovy closure to this source set, enabling DSL-style
179 * configuration.
180 */
181 @Override
182 public GenericSourceSet configure(Closure configure) {
183 Closures.apply(configure, this);
184 return this;
118 }
185 }
119
186
120 private SourceDirectorySet createSourceDirectorySet(String name) {
187 private SourceDirectorySet createSourceDirectorySet(String name) {
121 return objects.sourceDirectorySet(name, name);
188 return objects.sourceDirectorySet(name, name);
122 }
189 }
123
190
191 private void requireDeclaredRole(String roleName) {
192 if (!declaredRoles.contains(roleName)) {
193 throw new InvalidUserDataException(
194 "Output role '" + roleName + "' is not declared for source set '" + name + "'");
195 }
196 }
197
124 private Callable<List<? extends FileCollection>> outputsProvider() {
198 private Callable<List<? extends FileCollection>> outputsProvider() {
125 return () -> outputs.stream()
199 return () -> outputs.values().stream().toList();
126 .map(GenericSourceSetOutput::getFileCollection)
127 .toList();
128 }
200 }
129
201
130 private Callable<Set<File>> sourceDirectoriesProvider() {
202 private Callable<Set<File>> sourceDirectoriesProvider() {
@@ -1,4 +1,4
1 package org.implab.gradle.common;
1 package org.implab.gradle.common.sources;
2
2
3 import org.gradle.api.Action;
3 import org.gradle.api.Action;
4 import org.gradle.api.Plugin;
4 import org.gradle.api.Plugin;
@@ -10,8 +10,7 import org.gradle.api.tasks.Delete;
10 import org.gradle.api.tasks.TaskContainer;
10 import org.gradle.api.tasks.TaskContainer;
11 import org.gradle.api.tasks.TaskProvider;
11 import org.gradle.api.tasks.TaskProvider;
12 import org.gradle.language.base.plugins.LifecycleBasePlugin;
12 import org.gradle.language.base.plugins.LifecycleBasePlugin;
13 import org.implab.gradle.common.files.GenericSourceSet;
13 import org.implab.gradle.common.core.lang.Strings;
14 import org.implab.gradle.common.utils.Strings;
15
14
16 /**
15 /**
17 * This plugin creates a {@code sources} extension which is
16 * This plugin creates a {@code sources} extension which is
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now