diff --git a/gradle-plugins/biz.aQute.bnd.gradle/src/main/java/aQute/bnd/gradle/BndPlugin.java b/gradle-plugins/biz.aQute.bnd.gradle/src/main/java/aQute/bnd/gradle/BndPlugin.java index 2b3dc1b12b..b93ea12267 100644 --- a/gradle-plugins/biz.aQute.bnd.gradle/src/main/java/aQute/bnd/gradle/BndPlugin.java +++ b/gradle-plugins/biz.aQute.bnd.gradle/src/main/java/aQute/bnd/gradle/BndPlugin.java @@ -6,6 +6,7 @@ import static aQute.bnd.gradle.BndUtils.sourceSets; import static aQute.bnd.gradle.BndUtils.unwrap; import static aQute.bnd.gradle.BndUtils.unwrapFile; +import static aQute.bnd.osgi.Processor.getScheduledExecutor; import static aQute.bnd.osgi.Processor.isTrue; import static aQute.bnd.osgi.Processor.removeDuplicateMarker; import static java.lang.invoke.MethodHandles.publicLookup; @@ -55,7 +56,6 @@ import org.gradle.api.file.FileCollection; import org.gradle.api.file.ProjectLayout; import org.gradle.api.file.SourceDirectorySet; -import org.gradle.api.internal.plugins.DslObject; import org.gradle.api.logging.Logger; import org.gradle.api.model.ObjectFactory; import org.gradle.api.plugins.BasePluginExtension; @@ -66,6 +66,7 @@ import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; +import org.gradle.api.provider.ProviderFactory; import org.gradle.api.publish.plugins.PublishingPlugin; import org.gradle.api.tasks.ClasspathNormalizer; import org.gradle.api.tasks.Delete; @@ -80,6 +81,7 @@ import org.gradle.api.tasks.testing.AbstractTestTask; import org.gradle.language.base.plugins.LifecycleBasePlugin; import org.gradle.process.CommandLineArgumentProvider; +import org.jetbrains.annotations.NotNull; import org.slf4j.LoggerFactory; /** @@ -98,10 +100,6 @@ public class BndPlugin implements Plugin { * Name of the plugin. */ public static final String PLUGINID = "biz.aQute.bnd"; - private Project project; - private Project workspace; - private ObjectFactory objects; - private aQute.bnd.build.Project bndProject; /** * Default public constructor. @@ -114,11 +112,7 @@ public BndPlugin() {} @Override public void apply(Project project) { try { - this.project = project; - Project workspace = this.workspace = project.getParent(); - ProjectLayout layout = project.getLayout(); - ObjectFactory objects = this.objects = project.getObjects(); - TaskContainer tasks = project.getTasks(); + Project workspace = project.getParent(); if (project.getPluginManager() .hasPlugin(BndBuilderPlugin.PLUGINID)) { throw new GradleException("Project already has \"" + BndBuilderPlugin.PLUGINID + "\" plugin applied."); @@ -129,7 +123,259 @@ public void apply(Project project) { + BndBuilderPlugin.PLUGINID + "\" plugin?"); } Workspace bndWorkspace = BndWorkspacePlugin.getBndWorkspace(workspace); - aQute.bnd.build.Project bndProject = this.bndProject = bndWorkspace.getProject(project.getName()); + aQute.bnd.build.Project bndProject = bndWorkspace.getProject(project.getName()); + PluginApplicationHelper helper = new PluginApplicationHelper(project, workspace, bndProject); + helper.doApplyPlugin(); + } catch (Exception e) { + throw Exceptions.duck(e); + } + } + + /** + * {@link Action} that gives access to a Bnd project without retaining references to it. + * This helps with configuration cache compatibility. + */ + private static abstract class BndProjectUsingTaskAction implements Action { + + @Override + public final void execute(final Task t) { + // This project has had BndPlugin applied to it, so Bnd objects must already exist. + Project project = t.getProject(); + Project workspace = project.getParent(); + Workspace bndWorkspace = (Workspace) workspace.findProperty(BndWorkspacePlugin.BND_WORKSPACE_PROPERTY); + aQute.bnd.build.Project bndProject = bndWorkspace.getProject(project.getName()); + execute(t, bndProject); + } + + protected abstract void execute(Task task, aQute.bnd.build.Project bndProject); + } + + /** + * Action for the "generate" task. + */ + private static final class GenerateTaskAction extends BndProjectUsingTaskAction { + @Override + public void execute(Task tt, aQute.bnd.build.Project bndProject) { + try { + bndProject.getGenerate() + .generate(false); + } catch (Exception e) { + throw new GradleException(String.format("Project %s failed to generate", bndProject.getName()), e); + } + checkProjectErrors(bndProject, tt.getLogger()); + } + } + + /** + * Action for the "jar" task. + */ + private static final class JarTaskBuildAction extends BndProjectUsingTaskAction { + @Override + public void execute(Task tt, aQute.bnd.build.Project bndProject) { + File[] built; + try { + built = bndProject.build(); + if (Objects.nonNull(built)) { + long now = System.currentTimeMillis(); + for (File f : built) { + f.setLastModified(now); + } + } + } catch (Exception e) { + throw new GradleException( + String.format("Project %s failed to build", bndProject.getName()), e); + } + checkProjectErrors(bndProject, tt.getLogger()); + if (Objects.nonNull(built)) { + tt.getLogger() + .info("Generated bundles: {}", (Object) built); + } + } + } + + /** + * Action for the "release" task. + */ + private static final class ReleaseTaskAction extends BndProjectUsingTaskAction { + @Override + public void execute(Task tt, aQute.bnd.build.Project bndProject) { + try { + bndProject.release(); + } catch (Exception e) { + throw new GradleException( + String.format("Project %s failed to release", bndProject.getName()), e); + } + checkProjectErrors(bndProject, tt.getLogger()); + } + } + + /** + * Action for the "echo" task. + */ + private static final class EchoTaskAction extends BndProjectUsingTaskAction { + @Override + protected void execute(final Task task, final aQute.bnd.build.Project bndProject) { + final Project project = task.getProject(); + final Project workspace = project.getParent(); + final ProjectLayout layout = project.getLayout(); + final SourceSetContainer sourceSets = sourceSets(project); + final JavaCompile compileJava = unwrap(project.getTasks().named(JavaPlugin.COMPILE_JAVA_TASK_NAME, JavaCompile.class)); + final JavaCompile compileTestJava = unwrap( + project.getTasks().named(JavaPlugin.COMPILE_TEST_JAVA_TASK_NAME, JavaCompile.class)); + final ObjectFactory objects = project.getObjects(); + final FileCollection deliverables = getDeliverables(project); + final Optional javacProfile = optional(bndProject.getProperty("javac.profile")); + try (Formatter f = new Formatter()) { + f.format("------------------------------------------------------------%n"); + f.format("Project %s // Bnd version %s%n", project.getName(), About.getBndVersion()); + f.format("------------------------------------------------------------%n"); + f.format("%n"); + f.format("project.workspace: %s%n", workspace.getLayout() + .getProjectDirectory()); + f.format("project.name: %s%n", project.getName()); + f.format("project.dir: %s%n", layout.getProjectDirectory()); + f.format("target: %s%n", unwrap(layout.getBuildDirectory())); + f.format("project.dependson: %s%n", bndProject.getDependson()); + f.format("project.sourcepath: %s%n", + sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME) + .getAllSource() + .getSourceDirectories() + .getAsPath()); + f.format("project.output: %s%n", unwrap(compileJava.getDestinationDirectory())); + f.format("project.buildpath: %s%n", compileJava.getClasspath() + .getAsPath()); + f.format("project.allsourcepath: %s%n", objects.fileCollection().from(bndProject.getAllsourcepath()).getAsPath()); + f.format("project.testsrc: %s%n", + sourceSets.getByName(SourceSet.TEST_SOURCE_SET_NAME) + .getAllSource() + .getSourceDirectories() + .getAsPath()); + f.format("project.testoutput: %s%n", unwrap(compileTestJava.getDestinationDirectory())); + f.format("project.testpath: %s%n", compileTestJava.getClasspath() + .getAsPath()); + if (Objects.nonNull(compileJava.getOptions() + .getBootstrapClasspath())) { + f.format("project.bootclasspath: %s%n", compileJava.getOptions() + .getBootstrapClasspath() + .getAsPath()); + } + f.format("project.deliverables: %s%n", deliverables.getFiles()); + String executable = Optional.ofNullable(compileJava.getOptions() + .getForkOptions() + .getExecutable()) + .orElseGet(() -> compileJava.getJavaCompiler() + .map(javaCompiler -> IO.absolutePath(unwrapFile(javaCompiler.getExecutablePath()))) + .getOrElse("javac")); + f.format("javac: %s%n", executable); + if (compileJava.getOptions() + .getRelease() + .isPresent()) { + f.format("--release: %s%n", unwrap(compileJava.getOptions() + .getRelease())); + } else { + f.format("-source: %s%n", compileJava.getSourceCompatibility()); + f.format("-target: %s%n", compileJava.getTargetCompatibility()); + } + if (javacProfile.isPresent()) { + f.format("-profile: %s%n", javacProfile.get()); + } + System.out.print(f.toString()); + } + catch (Exception e) { + throw new RuntimeException(e); + } + checkProjectErrors(bndProject, task.getLogger(), true); + } + } + + /** + * Action for the "bndproperties" task. + */ + private static final class BndpropertiesTaskAction extends BndProjectUsingTaskAction { + @Override + protected void execute(final Task task, final aQute.bnd.build.Project bndProject) { + try (Formatter f = new Formatter()) { + f.format("------------------------------------------------------------%n"); + f.format("Project %s // Bnd version %s%n", task.getProject().getName(), About.getBndVersion()); + f.format("------------------------------------------------------------%n"); + f.format("%n"); + bndProject.getPropertyKeys(true) + .stream() + .sorted() + .forEachOrdered(key -> f.format("%s: %s%n", key, bndProject.getProperty(key, ""))); + f.format("%n"); + System.out.print(f.toString()); + } + checkProjectErrors(bndProject, task.getLogger(), true); + } + } + + /** + * Action for a {@link JavaCompile} task. + */ + private static final class JavaCompileCheckErrorsAction extends BndProjectUsingTaskAction { + @Override + protected void execute(final Task task, final aQute.bnd.build.Project bndProject) { + final JavaCompile t = (JavaCompile) task; + Logger logger = t.getLogger(); + checkProjectErrors(bndProject, logger); + if (logger.isInfoEnabled()) { + logger.info("Compile to {}", unwrapFile(t.getDestinationDirectory())); + if (t.getOptions() + .getRelease() + .isPresent()) { + logger.info("--release {} {}", unwrap(t.getOptions() + .getRelease()), Strings.join(" ", + t.getOptions() + .getAllCompilerArgs())); + } else { + logger.info("-source {} -target {} {}", t.getSourceCompatibility(), + t.getTargetCompatibility(), Strings.join(" ", t.getOptions() + .getAllCompilerArgs())); + } + logger.info("-classpath {}", t.getClasspath() + .getAsPath()); + if (Objects.nonNull(t.getOptions() + .getBootstrapClasspath())) { + logger.info("-bootclasspath {}", t.getOptions() + .getBootstrapClasspath() + .getAsPath()); + } + } + } + } + + /** + * Action for an {@link AbstractTestTask}. + */ + private static final class TestCheckErrorsAction extends BndProjectUsingTaskAction { + @Override + protected void execute(final Task tt, final aQute.bnd.build.Project bndProject) { + checkProjectErrors(bndProject, tt.getLogger(), ((AbstractTestTask) tt).getIgnoreFailures()); + } + } + + private static class PluginApplicationHelper { + + private final Project project; + private final Project workspace; + private final aQute.bnd.build.Project bndProject; + private final ProviderFactory providers; + private final ObjectFactory objects; + private final TaskContainer tasks; + private final ProjectLayout layout; + + public PluginApplicationHelper(Project project, Project workspace, aQute.bnd.build.Project bndProject) { + this.project = project; + this.workspace = workspace; + this.bndProject = bndProject; + this.providers = project.getProviders(); + this.objects = project.getObjects(); + this.tasks = project.getTasks(); + this.layout = project.getLayout(); + } + + public void doApplyPlugin() throws Exception { if (Objects.isNull(bndProject)) { throw new GradleException(String.format("Unable to load bnd project %s from workspace %s", project.getName(), workspace.getLayout() @@ -137,7 +383,7 @@ public void apply(Project project) { } bndProject.prepare(); if (!bndProject.isValid()) { - checkErrors(project.getLogger()); + checkProjectErrors(bndProject, project.getLogger()); throw new GradleException(String.format("Project %s is not a valid bnd project", bndProject.getName())); } BndPluginExtension extension = project.getExtensions() @@ -182,9 +428,7 @@ public void apply(Project project) { cpa -> cpa.builtBy(JavaPlugin.JAR_TASK_NAME)); } }); - FileCollection deliverables = configurations.getByName(JavaPlugin.RUNTIME_ONLY_CONFIGURATION_NAME) - .getArtifacts() - .getFiles(); + FileCollection deliverables = getDeliverables(project); /* Set up Bnd generate support */ Optional> generate = bndProject.getGenerate() @@ -216,18 +460,7 @@ public void apply(Project project) { .dirs(bndProject.getGenerate() .getOutputDirs()) .withPropertyName("generateOutputs"); - t.doLast("generate", new Action<>() { - @Override - public void execute(Task tt) { - try { - bndProject.getGenerate() - .generate(false); - } catch (Exception e) { - throw new GradleException(String.format("Project %s failed to generate", bndProject.getName()), e); - } - checkErrors(tt.getLogger()); - } - }); + t.doLast("generate", new GenerateTaskAction()); })); Optional> generateInputAction = generate.map(generateTask -> t -> { t.getInputs() @@ -409,7 +642,7 @@ public void execute(Task tt) { options.getRelease() .convention(project.provider(() -> { if (supportsRelease.getOrElse(Boolean.valueOf(JavaVersion.current() - .isJava9Compatible())) + .isJava9Compatible())) .booleanValue()) { JavaVersion sourceVersion = JavaVersion.toVersion(javacSource.get()); JavaVersion targetVersion = JavaVersion.toVersion(javacTarget.get()); @@ -442,36 +675,7 @@ public void execute(Task tt) { } options.getCompilerArgumentProviders() .add(argProvider(javacProfile.map(profile -> Arrays.asList("-profile", profile)))); - t.doFirst("checkErrors", new Action<>() { - @Override - public void execute(Task tt) { - Logger logger = tt.getLogger(); - checkErrors(logger); - if (logger.isInfoEnabled()) { - logger.info("Compile to {}", unwrapFile(t.getDestinationDirectory())); - if (t.getOptions() - .getRelease() - .isPresent()) { - logger.info("--release {} {}", unwrap(t.getOptions() - .getRelease()), Strings.join(" ", - t.getOptions() - .getAllCompilerArgs())); - } else { - logger.info("-source {} -target {} {}", t.getSourceCompatibility(), - t.getTargetCompatibility(), Strings.join(" ", t.getOptions() - .getAllCompilerArgs())); - } - logger.info("-classpath {}", t.getClasspath() - .getAsPath()); - if (Objects.nonNull(t.getOptions() - .getBootstrapClasspath())) { - logger.info("-bootclasspath {}", t.getOptions() - .getBootstrapClasspath() - .getAsPath()); - } - } - } - }); + t.doFirst("checkErrors", new JavaCompileCheckErrorsAction()); }); TaskProvider jar = tasks.named(JavaPlugin.JAR_TASK_NAME, AbstractArchiveTask.class, @@ -545,29 +749,7 @@ public void execute(Task tt) { .file(layout.getBuildDirectory() .file(Constants.BUILDFILES)) .withPropertyName("buildfiles"); - t.doLast("build", new Action<>() { - @Override - public void execute(Task tt) { - File[] built; - try { - built = bndProject.build(); - if (Objects.nonNull(built)) { - long now = System.currentTimeMillis(); - for (File f : built) { - f.setLastModified(now); - } - } - } catch (Exception e) { - throw new GradleException( - String.format("Project %s failed to build", bndProject.getName()), e); - } - checkErrors(tt.getLogger()); - if (Objects.nonNull(built)) { - tt.getLogger() - .info("Generated bundles: {}", (Object) built); - } - } - }); + t.doLast("build", new JarTaskBuildAction()); }); TaskProvider jarDependencies = tasks.register("jarDependencies", t -> { @@ -598,18 +780,7 @@ public void execute(Task tt) { t.getInputs() .files(jar) .withPropertyName(jar.getName()); - t.doLast("release", new Action<>() { - @Override - public void execute(Task tt) { - try { - bndProject.release(); - } catch (Exception e) { - throw new GradleException( - String.format("Project %s failed to release", bndProject.getName()), e); - } - checkErrors(tt.getLogger()); - } - }); + t.doLast("release", new ReleaseTaskAction()); }); TaskProvider releaseDependencies = tasks.register("releaseDependencies", t -> { @@ -630,12 +801,7 @@ public void execute(Task tt) { t.getInputs() .files(getBuildDependencies(JavaPlugin.JAR_TASK_NAME)) .withPropertyName("buildDependencies"); - t.doFirst("checkErrors", new Action<>() { - @Override - public void execute(Task tt) { - checkErrors(tt.getLogger(), t.getIgnoreFailures()); - } - }); + t.doFirst("checkErrors", new TestCheckErrorsAction()); }); TaskProvider testOSGi = tasks.register("testOSGi", TestOSGi.class, t -> { @@ -670,7 +836,7 @@ public void execute(Task tt) { TaskProvider clean = tasks.named(LifecycleBasePlugin.CLEAN_TASK_NAME, Delete.class, t -> { t.setDescription("Cleans the build and compiler output directories of this project."); t.delete(layout.getBuildDirectory(), sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME) - .getOutput(), + .getOutput(), sourceSets.getByName(SourceSet.TEST_SOURCE_SET_NAME) .getOutput()); generate.ifPresent(t::delete); @@ -771,98 +937,16 @@ public void execute(Task tt) { }); }); - Collection dependson = bndProject.getDependson(); TaskProvider echo = tasks.register("echo", t -> { t.setDescription("Displays the bnd project information."); t.setGroup(HelpTasksPlugin.HELP_GROUP); - JavaCompile compileJava = unwrap(tasks.named(JavaPlugin.COMPILE_JAVA_TASK_NAME, JavaCompile.class)); - JavaCompile compileTestJava = unwrap( - tasks.named(JavaPlugin.COMPILE_TEST_JAVA_TASK_NAME, JavaCompile.class)); - t.doLast("echo", new Action<>() { - @Override - public void execute(Task tt) { - try (Formatter f = new Formatter()) { - f.format("------------------------------------------------------------%n"); - f.format("Project %s // Bnd version %s%n", project.getName(), About.getBndVersion()); - f.format("------------------------------------------------------------%n"); - f.format("%n"); - f.format("project.workspace: %s%n", workspace.getLayout() - .getProjectDirectory()); - f.format("project.name: %s%n", project.getName()); - f.format("project.dir: %s%n", layout.getProjectDirectory()); - f.format("target: %s%n", unwrap(layout.getBuildDirectory())); - f.format("project.dependson: %s%n", dependson); - f.format("project.sourcepath: %s%n", - sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME) - .getAllSource() - .getSourceDirectories() - .getAsPath()); - f.format("project.output: %s%n", unwrap(compileJava.getDestinationDirectory())); - f.format("project.buildpath: %s%n", compileJava.getClasspath() - .getAsPath()); - f.format("project.allsourcepath: %s%n", allSrcDirs.getAsPath()); - f.format("project.testsrc: %s%n", - sourceSets.getByName(SourceSet.TEST_SOURCE_SET_NAME) - .getAllSource() - .getSourceDirectories() - .getAsPath()); - f.format("project.testoutput: %s%n", unwrap(compileTestJava.getDestinationDirectory())); - f.format("project.testpath: %s%n", compileTestJava.getClasspath() - .getAsPath()); - if (Objects.nonNull(compileJava.getOptions() - .getBootstrapClasspath())) { - f.format("project.bootclasspath: %s%n", compileJava.getOptions() - .getBootstrapClasspath() - .getAsPath()); - } - f.format("project.deliverables: %s%n", deliverables.getFiles()); - String executable = Optional.ofNullable(compileJava.getOptions() - .getForkOptions() - .getExecutable()) - .orElseGet(() -> compileJava.getJavaCompiler() - .map(javaCompiler -> IO.absolutePath(unwrapFile(javaCompiler.getExecutablePath()))) - .getOrElse("javac")); - f.format("javac: %s%n", executable); - if (compileJava.getOptions() - .getRelease() - .isPresent()) { - f.format("--release: %s%n", unwrap(compileJava.getOptions() - .getRelease())); - } else { - f.format("-source: %s%n", compileJava.getSourceCompatibility()); - f.format("-target: %s%n", compileJava.getTargetCompatibility()); - } - if (javacProfile.isPresent()) { - f.format("-profile: %s%n", javacProfile.get()); - } - System.out.print(f.toString()); - } - checkErrors(tt.getLogger(), true); - } - }); + t.doLast("echo", new EchoTaskAction()); }); TaskProvider bndproperties = tasks.register("bndproperties", t -> { t.setDescription("Displays the bnd properties."); t.setGroup(HelpTasksPlugin.HELP_GROUP); - t.doLast("bndproperties", new Action<>() { - @Override - public void execute(Task tt) { - try (Formatter f = new Formatter()) { - f.format("------------------------------------------------------------%n"); - f.format("Project %s // Bnd version %s%n", project.getName(), About.getBndVersion()); - f.format("------------------------------------------------------------%n"); - f.format("%n"); - bndProject.getPropertyKeys(true) - .stream() - .sorted() - .forEachOrdered(key -> f.format("%s: %s%n", key, bndProject.getProperty(key, ""))); - f.format("%n"); - System.out.print(f.toString()); - } - checkErrors(tt.getLogger(), true); - } - }); + t.doLast("bndproperties", new BndpropertiesTaskAction()); }); // Depend upon an output dir to avoid parallel task execution. @@ -883,85 +967,71 @@ public void execute(Task tt) { .dir(resource) .withPropertyName(category))); }); - } catch (Exception e) { - throw Exceptions.duck(e); - } - } - private Provider>> getTasks(Collection projects, - String taskName) { - return project.provider(() -> projects.stream() - .map(p -> workspace.project(p.getName()) - .getTasks() - .named(taskName)) - .collect(toList())); - } - - private ConfigurableFileCollection pathFiles(Collection path) { - return objects.fileCollection() - .from(decontainer(path)) - .builtBy(getTasks(path.stream() - .filter(c -> c.getType() == TYPE.PROJECT) - .map(Container::getProject) - .collect(toList()), JavaPlugin.JAR_TASK_NAME)); - } + } - private Provider>> getBuildDependencies(String taskName) { - try { - return getTasks(bndProject.getBuildDependencies(), taskName); - } catch (Exception e) { - throw Exceptions.duck(e); + private Provider>> getTasks(Collection projects, + String taskName) { + return providers.provider(() -> projects.stream() + .map(p -> workspace.project(p.getName()) + .getTasks() + .named(taskName)) + .collect(toList())); } - } - private Provider>> getTestDependencies(String taskName) { - try { - return getTasks(bndProject.getTestDependencies(), taskName); - } catch (Exception e) { - throw Exceptions.duck(e); + private ConfigurableFileCollection pathFiles(Collection path) { + return objects.fileCollection() + .from(decontainer(path)) + .builtBy(getTasks(path.stream() + .filter(c -> c.getType() == TYPE.PROJECT) + .map(Container::getProject) + .collect(toList()), JavaPlugin.JAR_TASK_NAME)); } - } - private Provider>> getDependents(String taskName) { - try { - return getTasks(bndProject.getDependents(), taskName); - } catch (Exception e) { - throw Exceptions.duck(e); + private Provider>> getBuildDependencies(String taskName) { + try { + return getTasks(bndProject.getBuildDependencies(), taskName); + } catch (Exception e) { + throw Exceptions.duck(e); + } } - } - private List decontainer(Collection path) { - return path.stream() - .map(Container::getFile) - .collect(toList()); - } + private Provider>> getTestDependencies(String taskName) { + try { + return getTasks(bndProject.getTestDependencies(), taskName); + } catch (Exception e) { + throw Exceptions.duck(e); + } + } - private > CommandLineArgumentProvider argProvider(Optional provider) { - return new CommandLineArgumentProvider() { - @SuppressWarnings("unchecked") - @Override - public Iterable asArguments() { - return provider.orElse((ITERABLE) Collections. emptyList()); + private Provider>> getDependents(String taskName) { + try { + return getTasks(bndProject.getDependents(), taskName); + } catch (Exception e) { + throw Exceptions.duck(e); } - }; - } + } + + private ConfigurableFileCollection bndConfiguration() { + Workspace bndWorkspace = bndProject.getWorkspace(); + return objects.fileCollection() + .from(bndWorkspace.getPropertiesFile(), bndWorkspace.getIncluded(), bndProject.getPropertiesFile(), + bndProject.getIncluded()); + } - private ConfigurableFileCollection bndConfiguration() { - Workspace bndWorkspace = bndProject.getWorkspace(); - return objects.fileCollection() - .from(bndWorkspace.getPropertiesFile(), bndWorkspace.getIncluded(), bndProject.getPropertiesFile(), - bndProject.getIncluded()); } - private void checkErrors(Logger logger) { - checkProjectErrors(bndProject, logger, false); + private static FileCollection getDeliverables(Project project) { + return project.getConfigurations().getByName(JavaPlugin.RUNTIME_ONLY_CONFIGURATION_NAME) + .getArtifacts() + .getFiles(); } - private void checkErrors(Logger logger, boolean ignoreFailures) { - checkProjectErrors(bndProject, logger, ignoreFailures); + private static void checkProjectErrors(aQute.bnd.build.Project p, Logger logger) { + checkProjectErrors(p, logger, false); } - private void checkProjectErrors(aQute.bnd.build.Project p, Logger logger, boolean ignoreFailures) { + private static void checkProjectErrors(aQute.bnd.build.Project p, Logger logger, boolean ignoreFailures) { p.getInfo(p.getWorkspace(), p.getWorkspace() .getBase() .getName() @@ -984,7 +1054,23 @@ private void checkProjectErrors(aQute.bnd.build.Project p, Logger logger, boolea } } - private Optional optional(String value) { + private static List decontainer(Collection path) { + return path.stream() + .map(Container::getFile) + .collect(toList()); + } + + private static > CommandLineArgumentProvider argProvider(Optional provider) { + return new CommandLineArgumentProvider() { + @SuppressWarnings("unchecked") + @Override + public Iterable asArguments() { + return provider.orElse((ITERABLE) Collections. emptyList()); + } + }; + } + + private static Optional optional(String value) { return Optional.ofNullable(value).filter(Strings::notEmpty); } diff --git a/gradle-plugins/biz.aQute.bnd.gradle/src/main/java/aQute/bnd/gradle/BndWorkspacePlugin.java b/gradle-plugins/biz.aQute.bnd.gradle/src/main/java/aQute/bnd/gradle/BndWorkspacePlugin.java index cda339e1a6..38f52ef255 100644 --- a/gradle-plugins/biz.aQute.bnd.gradle/src/main/java/aQute/bnd/gradle/BndWorkspacePlugin.java +++ b/gradle-plugins/biz.aQute.bnd.gradle/src/main/java/aQute/bnd/gradle/BndWorkspacePlugin.java @@ -48,6 +48,7 @@ public class BndWorkspacePlugin implements Plugin { private static final Pattern OPTION_P = Pattern.compile("--(?