From ed6d8246b77289cb6884888850ef2478a8fc05b5 Mon Sep 17 00:00:00 2001 From: Juergen Albert Date: Fri, 29 Jul 2022 16:31:52 +0200 Subject: [PATCH] A maven mojo that utilizes allows the use of the bnd generate function This Mojo triggers the generate mechanism and can make use of the external plugins of bnd if provided as configuration. Signed-off-by: Juergen Albert --- .../lib/configuration/Configurations.java | 134 +++++ .../maven/lib/configuration/package-info.java | 2 +- .../bnd/maven/lib/resolve/BndContainer.java | 359 ++++++++++++ .../bnd/maven/lib/resolve/package-info.java | 2 +- .../src/aQute/bnd/build/ProjectGenerate.java | 2 +- maven/README.md | 5 + maven/bnd-generate-maven-plugin/.gitignore | 3 + maven/bnd-generate-maven-plugin/.project | 23 + .../org.eclipse.core.resources.prefs | 5 + .../.settings/org.eclipse.core.runtime.prefs} | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 517 ++++++++++++++++++ .../.settings/org.eclipse.jdt.ui.prefs | 148 +++++ .../.settings/org.eclipse.m2e.core.prefs | 4 + .../Debug mvnDebug.launch | 21 + maven/bnd-generate-maven-plugin/README.md | 99 ++++ maven/bnd-generate-maven-plugin/pom.xml | 50 ++ .../bnd.bnd | 5 + .../invoker.properties | 7 + .../pom.xml | 43 ++ .../postbuild.groovy | 24 + .../src/main/resources/model/test.ecore | 5 + .../src/main/resources/model/test.genmodel | 12 + .../it/generate-dependency-management/bnd.bnd | 5 + .../invoker.properties | 7 + .../it/generate-dependency-management/pom.xml | 54 ++ .../postbuild.groovy | 24 + .../src/main/resources/model/test.ecore | 5 + .../src/main/resources/model/test.genmodel | 12 + .../.classpath | 32 ++ .../.gitignore | 1 + .../.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../bnd.bnd | 5 + .../invoker.properties | 7 + .../pom.xml | 62 +++ .../postbuild.groovy | 31 ++ .../src/main/resources/model/test.ecore | 5 + .../src/main/resources/model/test.genmodel | 12 + .../.classpath | 32 ++ .../.gitignore | 1 + .../.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../invoker.properties | 7 + .../pom.xml | 62 +++ .../postbuild.groovy | 27 + .../src/main/resources/model/test.ecore | 5 + .../src/main/resources/model/test.genmodel | 12 + .../.classpath | 32 ++ .../.gitignore | 1 + .../.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../invoker.properties | 7 + .../pom.xml | 47 ++ .../postbuild.groovy | 14 + .../src/main/resources/marker.txt | 0 .../generate-maven-configuration/.classpath | 32 ++ .../generate-maven-configuration/.gitignore | 1 + .../it/generate-maven-configuration/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../invoker.properties | 7 + .../it/generate-maven-configuration/pom.xml | 54 ++ .../postbuild.groovy | 24 + .../src/main/resources/model/test.ecore | 5 + .../src/main/resources/model/test.genmodel | 12 + .../src/it/generate/.classpath | 32 ++ .../src/it/generate/.gitignore | 1 + .../src/it/generate/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../src/it/generate/bnd.bnd | 5 + .../src/it/generate/invoker.properties | 7 + .../src/it/generate/pom.xml | 46 ++ .../src/it/generate/postbuild.groovy | 24 + .../src/main/resources/model/test.ecore | 5 + .../src/main/resources/model/test.genmodel | 12 + .../src/it/settings.xml | 50 ++ .../maven/generate/plugin/BndContainer.java | 233 ++++++++ .../maven/generate/plugin/GenerateMojo.java | 197 +++++++ .../generate/plugin/GenerateOperation.java | 17 + .../aQute/bnd/maven/generate/plugin/Step.java | 78 +++ .../m2e/lifecycle-mapping-metadata.xml | 21 + maven/bnd-maven-plugin/Debug mvnDebug.launch | 3 +- .../maven/plugin/AbstractBndMavenPlugin.java | 106 +--- maven/pom.xml | 1 + 88 files changed, 3024 insertions(+), 105 deletions(-) create mode 100644 biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/configuration/Configurations.java create mode 100644 biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/resolve/BndContainer.java create mode 100644 maven/bnd-generate-maven-plugin/.gitignore create mode 100644 maven/bnd-generate-maven-plugin/.project create mode 100644 maven/bnd-generate-maven-plugin/.settings/org.eclipse.core.resources.prefs rename maven/{.settings/org.eclipse.core.resources.prefs => bnd-generate-maven-plugin/.settings/org.eclipse.core.runtime.prefs} (54%) create mode 100644 maven/bnd-generate-maven-plugin/.settings/org.eclipse.jdt.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/.settings/org.eclipse.jdt.ui.prefs create mode 100644 maven/bnd-generate-maven-plugin/.settings/org.eclipse.m2e.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/Debug mvnDebug.launch create mode 100644 maven/bnd-generate-maven-plugin/README.md create mode 100644 maven/bnd-generate-maven-plugin/pom.xml create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/bnd.bnd create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/invoker.properties create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/pom.xml create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/postbuild.groovy create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/src/main/resources/model/test.ecore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/src/main/resources/model/test.genmodel create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/bnd.bnd create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/invoker.properties create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/pom.xml create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/postbuild.groovy create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/src/main/resources/model/test.ecore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/src/main/resources/model/test.genmodel create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.classpath create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.gitignore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.project create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.settings/org.eclipse.jdt.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.settings/org.eclipse.m2e.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/bnd.bnd create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/invoker.properties create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/pom.xml create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/postbuild.groovy create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/src/main/resources/model/test.ecore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/src/main/resources/model/test.genmodel create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.classpath create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.gitignore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.project create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.settings/org.eclipse.jdt.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.settings/org.eclipse.m2e.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/invoker.properties create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/pom.xml create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/postbuild.groovy create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/src/main/resources/model/test.ecore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/src/main/resources/model/test.genmodel create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.classpath create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.gitignore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.project create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.settings/org.eclipse.jdt.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.settings/org.eclipse.m2e.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/invoker.properties create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/pom.xml create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/postbuild.groovy create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/src/main/resources/marker.txt create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.classpath create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.gitignore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.project create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.settings/org.eclipse.jdt.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.settings/org.eclipse.m2e.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/invoker.properties create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/pom.xml create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/postbuild.groovy create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/src/main/resources/model/test.ecore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/src/main/resources/model/test.genmodel create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/.classpath create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/.gitignore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/.project create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/.settings/org.eclipse.jdt.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/.settings/org.eclipse.m2e.core.prefs create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/bnd.bnd create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/invoker.properties create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/pom.xml create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/postbuild.groovy create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/src/main/resources/model/test.ecore create mode 100644 maven/bnd-generate-maven-plugin/src/it/generate/src/main/resources/model/test.genmodel create mode 100644 maven/bnd-generate-maven-plugin/src/it/settings.xml create mode 100644 maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/BndContainer.java create mode 100644 maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/GenerateMojo.java create mode 100644 maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/GenerateOperation.java create mode 100644 maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/Step.java create mode 100644 maven/bnd-generate-maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml diff --git a/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/configuration/Configurations.java b/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/configuration/Configurations.java new file mode 100644 index 00000000000..80010343191 --- /dev/null +++ b/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/configuration/Configurations.java @@ -0,0 +1,134 @@ +package aQute.bnd.maven.lib.configuration; + +import java.io.File; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import org.apache.maven.model.Plugin; +import org.apache.maven.model.PluginExecution; +import org.apache.maven.model.PluginManagement; +import org.apache.maven.plugin.MojoExecution; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.util.xml.Xpp3Dom; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import aQute.bnd.build.Project; +import aQute.bnd.osgi.Processor; +import aQute.lib.io.IO; +import aQute.lib.utf8properties.UTF8Properties; + +/** + * A helper to read configurations for maven plugins consistently over the + * various Mojos. + * + * @author Juergen Albert + */ +public class Configurations { + + protected final static Logger logger = LoggerFactory.getLogger(Configurations.class); + + public static File loadProperties(Processor processor, MavenProject project, MojoExecution mojoExecution) + throws Exception { + // Load parent project properties first + loadParentProjectProperties(processor, project, mojoExecution); + + // Load current project properties + Xpp3Dom configuration = Optional.ofNullable(project.getBuildPlugins()) + .flatMap(new FlatMapHelper(mojoExecution)::getConfiguration) + .orElseGet(Configurations::defaultConfiguration); + return loadProjectProperties(processor, project, project, configuration); + } + + private static void loadParentProjectProperties(Processor builder, MavenProject currentProject, + MojoExecution mojoExecution) throws Exception { + MavenProject parentProject = currentProject.getParent(); + if (parentProject == null) { + return; + } + loadParentProjectProperties(builder, parentProject, mojoExecution); + + // Get configuration from parent project + Xpp3Dom configuration = Optional.ofNullable(parentProject.getBuildPlugins()) + .flatMap(new FlatMapHelper(mojoExecution)::getConfiguration) + .orElse(null); + if (configuration != null) { + // Load parent project's properties + loadProjectProperties(builder, parentProject, parentProject, configuration); + return; + } + + // Get configuration in project's pluginManagement + configuration = Optional.ofNullable(currentProject.getPluginManagement()) + .map(PluginManagement::getPlugins) + .flatMap(new FlatMapHelper(mojoExecution)::getConfiguration) + .orElseGet(Configurations::defaultConfiguration); + // Load properties from parent project's bnd file or configuration in + // project's pluginManagement + loadProjectProperties(builder, parentProject, currentProject, configuration); + } + + private static File loadProjectProperties(Processor processor, MavenProject bndProject, MavenProject pomProject, + Xpp3Dom configuration) throws Exception { + // check for bnd file configuration + File baseDir = bndProject.getBasedir(); + if (baseDir != null) { // file system based pom + File pomFile = bndProject.getFile(); + processor.updateModified(pomFile.lastModified(), "POM: " + pomFile); + // check for bnd file + Xpp3Dom bndfileElement = configuration.getChild("bndfile"); + String bndFileName = (bndfileElement != null) ? bndfileElement.getValue() : Project.BNDFILE; + File bndFile = IO.getFile(baseDir, bndFileName); + if (bndFile.isFile()) { + logger.debug("loading bnd properties from file: {}", bndFile); + // we use setProperties to handle -include + processor.setProperties(bndFile.getParentFile(), processor.loadProperties(bndFile)); + return bndFile; + } + // no bnd file found, so we fall through + } + + // check for bnd-in-pom configuration + baseDir = pomProject.getBasedir(); + File pomFile = pomProject.getFile(); + if (baseDir != null) { + processor.updateModified(pomFile.lastModified(), "POM: " + pomFile); + } + Xpp3Dom bndElement = configuration.getChild("bnd"); + if (bndElement != null) { + logger.debug("loading bnd properties from bnd element in pom: {}", pomProject); + UTF8Properties properties = new UTF8Properties(); + properties.load(bndElement.getValue(), pomFile, processor); + // we use setProperties to handle -include + processor.setProperties(baseDir, properties.replaceHere(baseDir)); + } + return pomFile; + } + + private static class FlatMapHelper { + + private MojoExecution mojoExecution; + + public FlatMapHelper(MojoExecution mojoExecution) { + this.mojoExecution = mojoExecution; + } + + public Optional getConfiguration(List plugins) { + return plugins.stream() + .filter(p -> Objects.equals(p, mojoExecution.getPlugin())) + .map(Plugin::getExecutions) + .flatMap(List::stream) + .filter(e -> Objects.equals(e.getId(), mojoExecution.getExecutionId())) + .findFirst() + .map(PluginExecution::getConfiguration) + .map(Xpp3Dom.class::cast) + .map(Xpp3Dom::new); + } + } + + private static Xpp3Dom defaultConfiguration() { + return new Xpp3Dom("configuration"); + } + +} diff --git a/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/configuration/package-info.java b/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/configuration/package-info.java index f39dbf8a3a3..46493f165ab 100644 --- a/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/configuration/package-info.java +++ b/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/configuration/package-info.java @@ -1,4 +1,4 @@ -@Version("1.1.0") +@Version("1.2.0") @Export package aQute.bnd.maven.lib.configuration; diff --git a/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/resolve/BndContainer.java b/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/resolve/BndContainer.java new file mode 100644 index 00000000000..ccdb5bfa19b --- /dev/null +++ b/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/resolve/BndContainer.java @@ -0,0 +1,359 @@ +package aQute.bnd.maven.lib.resolve; + +import static aQute.bnd.exceptions.FunctionWithException.asFunction; + +import java.io.File; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Properties; +import java.util.Set; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.project.MavenProject; +import org.apache.maven.project.ProjectDependenciesResolver; +import org.codehaus.plexus.util.xml.Xpp3Dom; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import aQute.bnd.annotation.ProviderType; +import aQute.bnd.build.Run; +import aQute.bnd.build.Workspace; +import aQute.bnd.build.model.EE; +import aQute.bnd.maven.lib.configuration.BeanProperties; +import aQute.bnd.osgi.Constants; +import aQute.bnd.osgi.Domain; +import aQute.bnd.osgi.Processor; +import aQute.bnd.repository.fileset.FileSetRepository; +import aQute.bnd.service.RepositoryPlugin; +import aQute.bnd.unmodifiable.Sets; +import aQute.lib.io.IO; +import biz.aQute.resolve.Bndrun; + +@ProviderType +public class BndContainer { + + private static final Logger logger = LoggerFactory + .getLogger(BndContainer.class); + + private final List bundles; + + private final boolean includeDependencyManagement; + + private final MavenProject project; + + private final RepositorySystemSession repositorySession; + + private final Set scopes; + + private final MavenSession session; + + private final boolean useMavenDependencies; + + @SuppressWarnings("deprecation") + private final org.apache.maven.artifact.factory.ArtifactFactory artifactFactory; + + private final ProjectDependenciesResolver resolver; + + private final RepositorySystem system; + + private final boolean transitive; + + private final PostProcessor postProcessor; + + public static class Builder { + + private final MavenProject project; + private final MavenSession session; + private final RepositorySystemSession repositorySession; + private final ProjectDependenciesResolver resolver; + @SuppressWarnings("deprecation") + private final org.apache.maven.artifact.factory.ArtifactFactory artifactFactory; + private final RepositorySystem system; + private List bundles = Collections + .emptyList(); + private boolean includeDependencyManagement = false; + private Set scopes = Sets + .of(Scope.compile, Scope.runtime); + private boolean useMavenDependencies = true; + private boolean transitive = true; + private PostProcessor postProcessor = new LocalPostProcessor(); + + @SuppressWarnings("deprecation") + public Builder(MavenProject project, MavenSession session, RepositorySystemSession repositorySession, + ProjectDependenciesResolver resolver, org.apache.maven.artifact.factory.ArtifactFactory artifactFactory, + RepositorySystem system) { + + this.project = Objects.requireNonNull(project); + this.session = Objects.requireNonNull(session); + this.repositorySession = Objects.requireNonNull(repositorySession); + this.resolver = Objects.requireNonNull(resolver); + this.artifactFactory = Objects.requireNonNull(artifactFactory); + this.system = Objects.requireNonNull(system); + } + + public Builder setBundles(List bundles) { + this.bundles = bundles; + return this; + } + + public Builder setIncludeDependencyManagement(boolean includeDependencyManagement) { + this.includeDependencyManagement = includeDependencyManagement; + return this; + } + + public Builder setPostProcessor(PostProcessor postProcessor) { + this.postProcessor = postProcessor; + return this; + } + + public Builder setScopes(Set scopes) { + this.scopes = scopes; + return this; + } + + public Builder setTransitive(boolean transitive) { + this.transitive = transitive; + return this; + } + + public Builder setUseMavenDependencies(boolean useMavenDependencies) { + this.useMavenDependencies = useMavenDependencies; + return this; + } + + public BndContainer build() { + return new BndContainer(project, session, resolver, repositorySession, artifactFactory, system, scopes, + bundles, useMavenDependencies, includeDependencyManagement, transitive, postProcessor); + } + + } + + public static int report(Processor processor) { + int errors = 0; + for (String warning : processor.getWarnings()) { + logger.warn("Warning : {}", warning); + } + for (String error : processor.getErrors()) { + logger.error("Error : {}", error); + errors++; + } + return errors; + } + + @SuppressWarnings("deprecation") + BndContainer(MavenProject project, MavenSession session, ProjectDependenciesResolver resolver, + RepositorySystemSession repositorySession, org.apache.maven.artifact.factory.ArtifactFactory artifactFactory, + RepositorySystem system, Set scopes, List bundles, boolean useMavenDependencies, + boolean includeDependencyManagement, boolean transitive, PostProcessor postProcessor) { + this.project = project; + this.session = session; + this.resolver = resolver; + this.repositorySession = repositorySession; + this.artifactFactory = artifactFactory; + this.system = system; + this.scopes = scopes; + this.bundles = bundles; + this.useMavenDependencies = useMavenDependencies; + this.includeDependencyManagement = includeDependencyManagement; + this.transitive = transitive; + this.postProcessor = postProcessor; + } + + public int execute(File runFile, String task, File workingDir, Operation operation) throws Exception { + try (Bndrun run = init(runFile, task, workingDir)) { + if (run == null) { + return 1; + } + int errors = report(run); + if (!run.isOk()) { + return errors; + } + injectImplicitRepository(run); + return operation.apply(runFile, getNamePart(runFile), run); + } + } + + public Bndrun init(File runFile, String task, File workingDir) throws Exception { + if (!runFile.exists()) { + logger.error("Could not find bnd run file {}", runFile); + return null; + } + String bndrun = getNamePart(runFile); + File temporaryDir = workingDir.toPath() + .resolve("tmp") + .resolve(task) + .resolve(bndrun) + .toFile(); + File cnf = new File(temporaryDir, Workspace.CNFDIR); + IO.mkdirs(cnf); + + Bndrun run = Bndrun.createBndrun(null, runFile); + Workspace workspace = run.getWorkspace(); + workspace.setBase(temporaryDir); + workspace.setBuildDir(cnf); + workspace.setOffline(session.getSettings() + .isOffline()); + run.setParent(getProcessor(workspace)); + run.clear(); + run.forceRefresh(); // setBase must be called after forceRefresh + run.setBase(temporaryDir); + run.getInfo(workspace); + setRunrequiresFromProjectArtifact(run); + setEEfromBuild(run); + run.addBasicPlugin(this); + return run; + } + + public boolean injectImplicitRepository(Run run) throws Exception { + Workspace workspace = run.getWorkspace(); + if (workspace.getPlugin(ImplicitFileSetRepository.class) == null) { + workspace.addBasicPlugin(getFileSetRepository()); + for (RepositoryPlugin repo : workspace.getRepositories()) { + repo.list(null); + } + return true; + } + return false; + } + + /** + * Return a fully configured dependency resolver instance. + * + * @param project + * @return a fully configured dependency resolver instance + */ + public DependencyResolver getDependencyResolver(MavenProject project) { + return new DependencyResolver(project, repositorySession, resolver, system, artifactFactory, scopes, transitive, + postProcessor, useMavenDependencies, includeDependencyManagement); + } + + /** + * Creates a new repository in every invocation. + * + * @return a new {@link ImplicitFileSetRepository} + * @throws Exception + */ + public FileSetRepository getFileSetRepository() throws Exception { + return getFileSetRepository(project); + } + + /** + * Creates a new repository in every invocation. + * + * @param project the Maven project + * @return a new {@link ImplicitFileSetRepository} + * @throws Exception + */ + public FileSetRepository getFileSetRepository(MavenProject project) throws Exception { + DependencyResolver dependencyResolver = getDependencyResolver(project); + + String name = project.getName() + .isEmpty() ? project.getArtifactId() : project.getName(); + + return dependencyResolver.getFileSetRepository(name, bundles, useMavenDependencies, + includeDependencyManagement); + } + + public void setRunrequiresFromProjectArtifact(Run run) { + String runrequires = run.getProperty(Constants.RUNREQUIRES); + + if (runrequires == null && ("jar".equals(project.getPackaging()) || "war".equals(project.getPackaging())) + && (project.getPlugin("biz.aQute.bnd:bnd-maven-plugin") != null)) { + + Artifact artifact = project.getArtifact(); + + String bsn = artifact.getArtifactId(); + + try { + bsn = Optional.ofNullable(artifact.getFile()) + .map(asFunction(Domain::domain)) + .map(Domain::getBundleSymbolicName) + .map(Map.Entry::getKey) + .orElseGet(artifact::getArtifactId); + } catch (Exception e) { + logger.warn( + "Could not get the Bundle-SymbolicName from the project artifact {}, falling back to artifactId {}", + artifact, bsn, e); + } + + run.setProperty(Constants.RUNREQUIRES, String.format("osgi.identity;filter:='(osgi.identity=%s)'", bsn)); + + logger.info("Bnd inferred {}: {}", Constants.RUNREQUIRES, run.getProperty(Constants.RUNREQUIRES)); + } + } + + public void setEEfromBuild(Run run) { + String runee = run.getProperty(Constants.RUNEE); + + if (runee == null) { + EE ee = Optional.ofNullable(project.getPlugin("org.apache.maven.plugins:maven-compiler-plugin")) + .map(p -> Optional.ofNullable(p.getConfiguration()) + .orElseGet(() -> new Xpp3Dom("configuration"))) + .map(Xpp3Dom.class::cast) + .map(dom -> { + Xpp3Dom child = dom.getChild("release"); + if (child != null) { + return child.getValue(); + } + String property = project.getProperties() + .getProperty("maven.compiler.release"); + if (property != null) { + return property; + } + child = dom.getChild("target"); + if (child != null) { + return child.getValue(); + } + property = project.getProperties() + .getProperty("maven.compiler.target"); + if (property != null) { + return property; + } + property = project.getProperties() + .getProperty("java.version"); + if (property != null) { + return property; + } + // so fallback to the currently running Java version + return System.getProperty("java.specification.version"); + }) + .flatMap(EE::highestFromTargetVersion) + .orElseGet(() -> Optional.ofNullable(System.getProperty("java.specification.version")) + .flatMap(EE::highestFromTargetVersion) + // if that all fails at least we know bnd needs at least + // Java 8 at this point + .orElse(EE.JavaSE_1_8)); + + run.setProperty(Constants.RUNEE, ee.getEEName()); + + logger.info("Bnd inferred {}: {}", Constants.RUNEE, run.getProperty(Constants.RUNEE)); + } + } + + private String getNamePart(File runFile) { + String nameExt = runFile.getName(); + int pos = nameExt.lastIndexOf('.'); + return (pos > 0) ? nameExt.substring(0, pos) : nameExt; + } + + private Processor getProcessor(Workspace workspace) { + Properties beanProperties = new BeanProperties(workspace.getProperties()); + beanProperties.put("project", project); + beanProperties.put("settings", session.getSettings()); + Properties mavenProperties = new Properties(beanProperties); + Properties projectProperties = project.getProperties(); + for (Enumeration propertyNames = projectProperties.propertyNames(); propertyNames.hasMoreElements();) { + Object key = propertyNames.nextElement(); + mavenProperties.put(key, projectProperties.get(key)); + } + return new Processor(workspace, mavenProperties, false); + } + +} diff --git a/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/resolve/package-info.java b/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/resolve/package-info.java index 86648ca805f..0fe60a7bcd2 100644 --- a/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/resolve/package-info.java +++ b/biz.aQute.bnd.maven/src/aQute/bnd/maven/lib/resolve/package-info.java @@ -1,4 +1,4 @@ -@Version("1.3.0") +@Version("1.4.0") @Export package aQute.bnd.maven.lib.resolve; diff --git a/biz.aQute.bndlib/src/aQute/bnd/build/ProjectGenerate.java b/biz.aQute.bndlib/src/aQute/bnd/build/ProjectGenerate.java index 891e913d4d3..8fa24edcf2a 100644 --- a/biz.aQute.bndlib/src/aQute/bnd/build/ProjectGenerate.java +++ b/biz.aQute.bndlib/src/aQute/bnd/build/ProjectGenerate.java @@ -92,7 +92,7 @@ private Result prepare(String sourceWithDuplicate, GeneratorSpec st) { Set sourceFiles = new FileSet(project.getBase(), source).getFiles(); if (sourceFiles.isEmpty()) - return err("No source files/directories specified"); + return err("No source files/directories found in fileset %s", source); File out = project.getFile(output); if (out.isDirectory()) { diff --git a/maven/README.md b/maven/README.md index 229e14e905d..136397b1bd6 100644 --- a/maven/README.md +++ b/maven/README.md @@ -59,6 +59,10 @@ A plugin to run a bndrun file. A plugin to generate and export reports of projects. +## [bnd-generate-maven-plugin][11] + +A plugin to generate sources and resources. + # Building the Maven Plugins You must first run `./gradlew :build` to build the Bnd artifacts and install them in your local maven repo. @@ -113,3 +117,4 @@ pom's `pluginManagement` section, to configure the repository: [8]: bnd-testing-maven-plugin/README.md [9]: bnd-run-maven-plugin/README.md [10]: bnd-reporter-maven-plugin/README.md +[11]: bnd-generate-maven-plugin/README.md diff --git a/maven/bnd-generate-maven-plugin/.gitignore b/maven/bnd-generate-maven-plugin/.gitignore new file mode 100644 index 00000000000..16fbf9090b4 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/.gitignore @@ -0,0 +1,3 @@ +/target/ +/bin/ +/.classpath diff --git a/maven/bnd-generate-maven-plugin/.project b/maven/bnd-generate-maven-plugin/.project new file mode 100644 index 00000000000..3a3e4bdc4cf --- /dev/null +++ b/maven/bnd-generate-maven-plugin/.project @@ -0,0 +1,23 @@ + + + bnd-generate-maven-plugin + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/maven/bnd-generate-maven-plugin/.settings/org.eclipse.core.resources.prefs b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000000..839d647eef8 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/maven/.settings/org.eclipse.core.resources.prefs b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.core.runtime.prefs similarity index 54% rename from maven/.settings/org.eclipse.core.resources.prefs rename to maven/bnd-generate-maven-plugin/.settings/org.eclipse.core.runtime.prefs index 99f26c0203a..5a0ad22d2a7 100644 --- a/maven/.settings/org.eclipse.core.resources.prefs +++ b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.core.runtime.prefs @@ -1,2 +1,2 @@ eclipse.preferences.version=1 -encoding/=UTF-8 +line.separator=\n diff --git a/maven/bnd-generate-maven-plugin/.settings/org.eclipse.jdt.core.prefs b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..88a52ef81d0 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,517 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.builder.cleanOutputFolder=clean +org.eclipse.jdt.core.builder.duplicateResourceTask=warning +org.eclipse.jdt.core.builder.invalidClasspath=abort +org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore +org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch +org.eclipse.jdt.core.circularClasspath=error +org.eclipse.jdt.core.classpath.exclusionPatterns=enabled +org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error +org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled +org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error +org.eclipse.jdt.core.codeComplete.argumentPrefixes= +org.eclipse.jdt.core.codeComplete.argumentSuffixes= +org.eclipse.jdt.core.codeComplete.fieldPrefixes= +org.eclipse.jdt.core.codeComplete.fieldSuffixes= +org.eclipse.jdt.core.codeComplete.localPrefixes= +org.eclipse.jdt.core.codeComplete.localSuffixes= +org.eclipse.jdt.core.codeComplete.staticFieldPrefixes= +org.eclipse.jdt.core.codeComplete.staticFieldSuffixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes= +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.maxProblemPerUnit=100 +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=ignore +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled +org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,NORMAL +org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=true +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=17 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=81 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=1 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.lineSplit=120 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.incompatibleJDKLevel=ignore +org.eclipse.jdt.core.incompleteClasspath=error +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/maven/bnd-generate-maven-plugin/.settings/org.eclipse.jdt.ui.prefs b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000000..b67dd052ad7 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,148 @@ +cleanup.add_default_serial_version_id=true +cleanup.add_generated_serial_version_id=false +cleanup.add_missing_annotations=true +cleanup.add_missing_deprecated_annotations=true +cleanup.add_missing_methods=false +cleanup.add_missing_nls_tags=false +cleanup.add_missing_override_annotations=true +cleanup.add_missing_override_annotations_interface_methods=true +cleanup.add_serial_version_id=true +cleanup.always_use_blocks=true +cleanup.always_use_parentheses_in_expressions=false +cleanup.always_use_this_for_non_static_field_access=false +cleanup.always_use_this_for_non_static_method_access=false +cleanup.convert_functional_interfaces=true +cleanup.convert_to_enhanced_for_loop=true +cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false +cleanup.correct_indentation=false +cleanup.format_source_code=false +cleanup.format_source_code_changes_only=false +cleanup.insert_inferred_type_arguments=false +cleanup.lazy_logical_operator=false +cleanup.make_local_variable_final=true +cleanup.make_parameters_final=false +cleanup.make_private_fields_final=true +cleanup.make_type_abstract_if_missing_method=false +cleanup.make_variable_declarations_final=false +cleanup.merge_conditional_blocks=false +cleanup.never_use_blocks=false +cleanup.never_use_parentheses_in_expressions=true +cleanup.number_suffix=true +cleanup.objects_equals=true +cleanup.organize_imports=false +cleanup.precompile_regex=true +cleanup.push_down_negation=false +cleanup.qualify_static_field_accesses_with_declaring_class=false +cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +cleanup.qualify_static_member_accesses_with_declaring_class=true +cleanup.qualify_static_method_accesses_with_declaring_class=false +cleanup.remove_private_constructors=true +cleanup.remove_redundant_modifiers=true +cleanup.remove_redundant_semicolons=true +cleanup.remove_redundant_type_arguments=true +cleanup.remove_trailing_whitespaces=true +cleanup.remove_trailing_whitespaces_all=true +cleanup.remove_trailing_whitespaces_ignore_empty=false +cleanup.remove_unnecessary_array_creation=true +cleanup.remove_unnecessary_casts=true +cleanup.remove_unnecessary_nls_tags=true +cleanup.remove_unused_imports=true +cleanup.remove_unused_local_variables=false +cleanup.remove_unused_private_fields=true +cleanup.remove_unused_private_members=true +cleanup.remove_unused_private_methods=true +cleanup.remove_unused_private_types=true +cleanup.simplify_lambda_expression_and_method_ref=true +cleanup.sort_members=false +cleanup.sort_members_all=false +cleanup.use_anonymous_class_creation=false +cleanup.use_autoboxing=false +cleanup.use_blocks=false +cleanup.use_blocks_only_for_return_and_throw=false +cleanup.use_directly_map_method=true +cleanup.use_lambda=true +cleanup.use_parentheses_in_expressions=false +cleanup.use_this_for_non_static_field_access=false +cleanup.use_this_for_non_static_field_access_only_if_necessary=true +cleanup.use_this_for_non_static_method_access=false +cleanup.use_this_for_non_static_method_access_only_if_necessary=true +cleanup.use_type_arguments=false +cleanup.use_unboxing=false +cleanup.use_var=false +cleanup_profile=_bnd +cleanup_settings_version=2 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_bnd +formatter_settings_version=16 +org.eclipse.jdt.ui.exception.name=e +org.eclipse.jdt.ui.gettersetter.use.is=true +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=java;javax;org;com; +org.eclipse.jdt.ui.javadoc=false +org.eclipse.jdt.ui.keywordthis=false +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.overrideannotation=true +org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates= +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=true +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=false +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_with_declaring_class=true +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=true +sp_cleanup.remove_redundant_semicolons=true +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=true +sp_cleanup.remove_unused_imports=true +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true +sp_cleanup.use_type_arguments=false diff --git a/maven/bnd-generate-maven-plugin/.settings/org.eclipse.m2e.core.prefs b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000000..f897a7f1cb2 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/maven/bnd-generate-maven-plugin/Debug mvnDebug.launch b/maven/bnd-generate-maven-plugin/Debug mvnDebug.launch new file mode 100644 index 00000000000..7e79ce5809c --- /dev/null +++ b/maven/bnd-generate-maven-plugin/Debug mvnDebug.launch @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/maven/bnd-generate-maven-plugin/README.md b/maven/bnd-generate-maven-plugin/README.md new file mode 100644 index 00000000000..c3eac60d6cc --- /dev/null +++ b/maven/bnd-generate-maven-plugin/README.md @@ -0,0 +1,99 @@ +# bnd-generate-maven-plugin + +The `bnd-generate-maven-plugin` is a bnd based plugin to run bnd generators. + +## What does the `bnd-generate-maven-plugin` do? + +It provides a flexible mechanism, that can run system commands or run external generator plugins. A more general description about the use of generators in bnd can be found [here](https://bnd.bndtools.org/instructions/generate.html). A few examples can be found in the [tests](https://github.com/bndtools/bnd/tree/master/maven/bnd-generate-maven-plugin/src/it) for this plugin. + +An example that runs `dir` and pipes it to a file looks like + +``` + + biz.aQute.bnd + bnd-generate-maven-plugin + ${bnd.version} + + + + src/main/resources/marker.txt + dir > src/main/java/test.txt + src/main/java + + src/main/resources/model/test.genmodel + + + + + + + generate-sources + + bnd-generate + + + + +``` + +An example running a code generator twice located in an external artifact. + +``` + + biz.aQute.bnd + bnd-generate-maven-plugin + ${bnd.version} + + + + org.geckoprojects.emf + org.gecko.emf.osgi.codegen + 4.1.1.202202162308 + + + + + src/main/resources/model/test.genmodel + geckoEMF 1>out.log 2>out.log + src/main/java + + src/main/resources/model/test.genmodel + + + + src/main/resources/model/test.genmodel + geckoEMF 1>out.log 2>out.log + src/main/java2 + + src/main/resources/model/test.genmodel + + + + + + + generate-sources + + bnd-generate + + + + +``` + +## Configuration Properties + +This plugin supports configuration via an bnd file which uses the standard `-generate` instruction as described in the [bnd documentation](https://bnd.bndtools.org/instructions/generate.html). A more maven typical configuration is supported as well via the steps. Please note, that the steps will be translated in in a list of instructions as bnd understands internally as per definition in the documentation. Concretely it will result in the instruction `-generate.maven:` which may be overwritten if the exact same namespace is used in the `bndfile` or `bnd` configuration. + +| Configuration Property | Description | +| ---------------------- | ------------------------------------------------------------ | +|`bndfile` | File path to a bnd file containing bnd instructions for this project. The file path can be either absolute or relative to the project directory. _Defaults to `bnd.bnd`_.| +|`bnd` | Bnd instructions for this project specified directly in the pom file. This is generally be done using a `` section. If the projects has a `bndfile` configuration property or a file in the default location `bnd.bnd`, then this configuration element is ignored. | +| `externalPlugins` | A list of artefact's containing any of the desired code generators. The Artifact, that contains the required generator will be loaded by bnd in a completely isolated classloader and thus must be an uber jar containing all the classes it requires. | +| `steps` | A list of generate steps, that will be executed in the given order | +| `step.trigger` | A trigger is comprised of a ant like fileset expression like `src/main/resources/model/**.mymodel`. If the file is newer then any file in the output folder, the code will be generated again. _This is required when a step is configured._ | +| `step.output` | The output folder where the result will be expected. _This is required when a step is configured._ | +| `step.generateCommand` | A generate command conforms to the generate property in the original bnd [instruction](https://bnd.bndtools.org/instructions/generate.html). It can name an external plugin or call a main Class. _Default to `bnd.executablejar`._ | +| `step.systemCommand` | A System command that will be executed if set. | +| `step.properties` | A map of additional properties that the generator to call my need. | +| `skip` | Skip the project. _Defaults to `false`._ Override with property `bnd.export.skip`. | diff --git a/maven/bnd-generate-maven-plugin/pom.xml b/maven/bnd-generate-maven-plugin/pom.xml new file mode 100644 index 00000000000..0c03f2a9f4e --- /dev/null +++ b/maven/bnd-generate-maven-plugin/pom.xml @@ -0,0 +1,50 @@ + + 4.0.0 + + biz.aQute.bnd + bnd-plugin-parent + ${revision} + ../bnd-plugin-parent + + bnd-generate-maven-plugin + Generate Code using the Plugin based BND Codegenerator function + ${project.groupId}:${project.artifactId} + maven-plugin + https://bnd.bndtools.org/ + + https://github.com/bndtools/bnd + scm:git:https://github.com/bndtools/bnd.git + scm:git:git@github.com:bndtools/bnd.git + ${revision} + + + + ${maven.target.version} + + + + + org.apache.maven + maven-core + + + org.apache.maven + maven-plugin-api + + + org.apache.maven.plugin-tools + maven-plugin-annotations + + + org.slf4j + slf4j-api + + + ${project.groupId} + biz.aQute.bnd.maven + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/bnd.bnd b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/bnd.bnd new file mode 100644 index 00000000000..ed961269925 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/bnd.bnd @@ -0,0 +1,5 @@ +-generate:\ + src/main/resources/model/test.genmodel;\ + generate="geckoEMF 1>out.log 2>out.log";\ + genmodel="src/main/resources/model/test.genmodel";\ + output=src/main/java diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/invoker.properties b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/invoker.properties new file mode 100644 index 00000000000..dd0dc4a6594 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/invoker.properties @@ -0,0 +1,7 @@ +invoker.goals=--no-transfer-progress --fail-never package + +# Run mvn with --debug for debug logging +#invoker.debug=true + +# Run mvn in debugging mode and wait for a debugger to attach +#invoker.environmentVariables.MAVEN_DEBUG_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/pom.xml b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/pom.xml new file mode 100644 index 00000000000..4720845e343 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/pom.xml @@ -0,0 +1,43 @@ + + 4.0.0 + + + biz.aQute.bnd-test + generate-dependency-management-error + 0.0.1 + jar + + + + org.geckoprojects.emf + org.gecko.emf.osgi.api + 4.1.1.202202162308 + + + + + + + biz.aQute.bnd + bnd-generate-maven-plugin + ${bnd.version} + + + + org.geckoprojects.emf + org.gecko.emf.osgi.codegen + + + + + + generate-sources + + bnd-generate + + + + + + + \ No newline at end of file diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/postbuild.groovy b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/postbuild.groovy new file mode 100644 index 00000000000..4d3a5b181fe --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/postbuild.groovy @@ -0,0 +1,24 @@ +import aQute.bnd.build.Workspace +import aQute.bnd.build.model.BndEditModel +import aQute.bnd.osgi.Processor +import aQute.bnd.properties.Document +import aQute.bnd.version.MavenVersion +import aQute.lib.io.IO + +import java.util.jar.Attributes +import java.util.jar.JarFile; + +def baseVersion = new MavenVersion(bndVersion).toReleaseVersion() + +// Check the ecore file exist! +File ecore = new File(basedir,"src/main/resources/model/test.ecore") +assert ecore.isFile() + +// Check the genmodel file exist! +File genmodel = new File(basedir,"src/main/resources/model/test.genmodel") +assert genmodel.isFile() + +// Check the if some code generated file exist! +File testClass = new File(basedir,"src/main/java/aQute/bnd/maven/model/test/Test.java") +assert !testClass.isFile() + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/src/main/resources/model/test.ecore b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/src/main/resources/model/test.ecore new file mode 100644 index 00000000000..b88fed47103 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/src/main/resources/model/test.ecore @@ -0,0 +1,5 @@ + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/src/main/resources/model/test.genmodel b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/src/main/resources/model/test.genmodel new file mode 100644 index 00000000000..2621855f1e8 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management-error/src/main/resources/model/test.genmodel @@ -0,0 +1,12 @@ + + + test.ecore + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/bnd.bnd b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/bnd.bnd new file mode 100644 index 00000000000..ed961269925 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/bnd.bnd @@ -0,0 +1,5 @@ +-generate:\ + src/main/resources/model/test.genmodel;\ + generate="geckoEMF 1>out.log 2>out.log";\ + genmodel="src/main/resources/model/test.genmodel";\ + output=src/main/java diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/invoker.properties b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/invoker.properties new file mode 100644 index 00000000000..9c7a7746f7e --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/invoker.properties @@ -0,0 +1,7 @@ +invoker.goals=--no-transfer-progress package + +# Run mvn with --debug for debug logging +#invoker.debug=true + +# Run mvn in debugging mode and wait for a debugger to attach +#invoker.environmentVariables.MAVEN_DEBUG_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/pom.xml b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/pom.xml new file mode 100644 index 00000000000..a3e23633a39 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/pom.xml @@ -0,0 +1,54 @@ + + 4.0.0 + + + biz.aQute.bnd-test + generate-dependency-management + 0.0.1 + jar + + + + + org.geckoprojects.emf + org.gecko.emf.osgi.codegen + 4.1.1.202202162308 + + + + + + + + org.geckoprojects.emf + org.gecko.emf.osgi.api + 4.1.1.202202162308 + + + + + + + biz.aQute.bnd + bnd-generate-maven-plugin + ${bnd.version} + + + + org.geckoprojects.emf + org.gecko.emf.osgi.codegen + + + + + + generate-sources + + bnd-generate + + + + + + + \ No newline at end of file diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/postbuild.groovy b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/postbuild.groovy new file mode 100644 index 00000000000..a54bef68318 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/postbuild.groovy @@ -0,0 +1,24 @@ +import aQute.bnd.build.Workspace +import aQute.bnd.build.model.BndEditModel +import aQute.bnd.osgi.Processor +import aQute.bnd.properties.Document +import aQute.bnd.version.MavenVersion +import aQute.lib.io.IO + +import java.util.jar.Attributes +import java.util.jar.JarFile; + +def baseVersion = new MavenVersion(bndVersion).toReleaseVersion() + +// Check the ecore file exist! +File ecore = new File(basedir,"src/main/resources/model/test.ecore") +assert ecore.isFile() + +// Check the genmodel file exist! +File genmodel = new File(basedir,"src/main/resources/model/test.genmodel") +assert genmodel.isFile() + +// Check the if some code generated file exist! +File testClass = new File(basedir,"src/main/java/aQute/bnd/maven/model/test/Test.java") +assert testClass.isFile() + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/src/main/resources/model/test.ecore b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/src/main/resources/model/test.ecore new file mode 100644 index 00000000000..b88fed47103 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/src/main/resources/model/test.ecore @@ -0,0 +1,5 @@ + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/src/main/resources/model/test.genmodel b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/src/main/resources/model/test.genmodel new file mode 100644 index 00000000000..2621855f1e8 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-dependency-management/src/main/resources/model/test.genmodel @@ -0,0 +1,12 @@ + + + test.ecore + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.classpath b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.classpath new file mode 100644 index 00000000000..2e45e01c924 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.gitignore b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.gitignore new file mode 100644 index 00000000000..b83d22266ac --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.project b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.project new file mode 100644 index 00000000000..39fd47d8c42 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.project @@ -0,0 +1,23 @@ + + + generate + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.settings/org.eclipse.jdt.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..5723a0f871a --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.settings/org.eclipse.m2e.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000000..f897a7f1cb2 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/bnd.bnd b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/bnd.bnd new file mode 100644 index 00000000000..6ee70b15172 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/bnd.bnd @@ -0,0 +1,5 @@ +-generate:\ + src/main/resources/model/test.genmodel;\ + generate="geckoEMF 1>out.log 2>out.log";\ + genmodel="src/main/resources/model/test.genmodel";\ + output=src/main/java3 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/invoker.properties b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/invoker.properties new file mode 100644 index 00000000000..9c7a7746f7e --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/invoker.properties @@ -0,0 +1,7 @@ +invoker.goals=--no-transfer-progress package + +# Run mvn with --debug for debug logging +#invoker.debug=true + +# Run mvn in debugging mode and wait for a debugger to attach +#invoker.environmentVariables.MAVEN_DEBUG_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/pom.xml b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/pom.xml new file mode 100644 index 00000000000..a0080ee7e6e --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/pom.xml @@ -0,0 +1,62 @@ + + 4.0.0 + + + biz.aQute.bnd-test + generate-maven-configuration-multiple-steps-mixed + 0.0.1 + jar + + + + org.geckoprojects.emf + org.gecko.emf.osgi.api + 4.1.1.202202162308 + + + + + + + biz.aQute.bnd + bnd-generate-maven-plugin + ${bnd.version} + + + + org.geckoprojects.emf + org.gecko.emf.osgi.codegen + 4.1.1.202202162308 + + + + + src/main/resources/model/test.genmodel + geckoEMF 1>out.log 2>out.log + src/main/java + + src/main/resources/model/test.genmodel + + + + src/main/resources/model/test.genmodel + geckoEMF 1>out.log 2>out.log + src/main/java2 + + src/main/resources/model/test.genmodel + + + + + + + generate-sources + + bnd-generate + + + + + + + \ No newline at end of file diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/postbuild.groovy b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/postbuild.groovy new file mode 100644 index 00000000000..4180624b43e --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/postbuild.groovy @@ -0,0 +1,31 @@ +import aQute.bnd.build.Workspace +import aQute.bnd.build.model.BndEditModel +import aQute.bnd.osgi.Processor +import aQute.bnd.properties.Document +import aQute.bnd.version.MavenVersion +import aQute.lib.io.IO + +import java.util.jar.Attributes +import java.util.jar.JarFile; + +def baseVersion = new MavenVersion(bndVersion).toReleaseVersion() + +// Check the ecore file exist! +File ecore = new File(basedir,"src/main/resources/model/test.ecore") +assert ecore.isFile() + +// Check the genmodel file exist! +File genmodel = new File(basedir,"src/main/resources/model/test.genmodel") +assert genmodel.isFile() + +// Check the if some code generated file exist! +File testClass = new File(basedir,"src/main/java/aQute/bnd/maven/model/test/Test.java") +assert testClass.isFile() +// Check the if the second step was done +File testClass2 = new File(basedir,"src/main/java2/aQute/bnd/maven/model/test/Test.java") +assert testClass2.isFile() + +// Check the if the code from the bnd.bnd file instruction was generated +File testClass3 = new File(basedir,"src/main/java3/aQute/bnd/maven/model/test/Test.java") +assert testClass3.isFile() + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/src/main/resources/model/test.ecore b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/src/main/resources/model/test.ecore new file mode 100644 index 00000000000..b88fed47103 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/src/main/resources/model/test.ecore @@ -0,0 +1,5 @@ + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/src/main/resources/model/test.genmodel b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/src/main/resources/model/test.genmodel new file mode 100644 index 00000000000..2621855f1e8 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps-mixed/src/main/resources/model/test.genmodel @@ -0,0 +1,12 @@ + + + test.ecore + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.classpath b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.classpath new file mode 100644 index 00000000000..2e45e01c924 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.gitignore b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.gitignore new file mode 100644 index 00000000000..b83d22266ac --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.project b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.project new file mode 100644 index 00000000000..39fd47d8c42 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.project @@ -0,0 +1,23 @@ + + + generate + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.settings/org.eclipse.jdt.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..5723a0f871a --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.settings/org.eclipse.m2e.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000000..f897a7f1cb2 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/invoker.properties b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/invoker.properties new file mode 100644 index 00000000000..9c7a7746f7e --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/invoker.properties @@ -0,0 +1,7 @@ +invoker.goals=--no-transfer-progress package + +# Run mvn with --debug for debug logging +#invoker.debug=true + +# Run mvn in debugging mode and wait for a debugger to attach +#invoker.environmentVariables.MAVEN_DEBUG_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/pom.xml b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/pom.xml new file mode 100644 index 00000000000..dfec9f14e5c --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/pom.xml @@ -0,0 +1,62 @@ + + 4.0.0 + + + biz.aQute.bnd-test + generate-maven-configuration-multiple-steps + 0.0.1 + jar + + + + org.geckoprojects.emf + org.gecko.emf.osgi.api + 4.1.1.202202162308 + + + + + + + biz.aQute.bnd + bnd-generate-maven-plugin + ${bnd.version} + + + + org.geckoprojects.emf + org.gecko.emf.osgi.codegen + 4.1.1.202202162308 + + + + + src/main/resources/model/test.genmodel + geckoEMF 1>out.log 2>out.log + src/main/java + + src/main/resources/model/test.genmodel + + + + src/main/resources/model/test.genmodel + geckoEMF 1>out.log 2>out.log + src/main/java2 + + src/main/resources/model/test.genmodel + + + + + + + generate-sources + + bnd-generate + + + + + + + \ No newline at end of file diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/postbuild.groovy b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/postbuild.groovy new file mode 100644 index 00000000000..efcc9340e56 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/postbuild.groovy @@ -0,0 +1,27 @@ +import aQute.bnd.build.Workspace +import aQute.bnd.build.model.BndEditModel +import aQute.bnd.osgi.Processor +import aQute.bnd.properties.Document +import aQute.bnd.version.MavenVersion +import aQute.lib.io.IO + +import java.util.jar.Attributes +import java.util.jar.JarFile; + +def baseVersion = new MavenVersion(bndVersion).toReleaseVersion() + +// Check the ecore file exist! +File ecore = new File(basedir,"src/main/resources/model/test.ecore") +assert ecore.isFile() + +// Check the genmodel file exist! +File genmodel = new File(basedir,"src/main/resources/model/test.genmodel") +assert genmodel.isFile() + +// Check the if some code generated file exist! +File testClass = new File(basedir,"src/main/java/aQute/bnd/maven/model/test/Test.java") +assert testClass.isFile() +// Check the if the second step was done +File testClass2 = new File(basedir,"src/main/java2/aQute/bnd/maven/model/test/Test.java") +assert testClass2.isFile() + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/src/main/resources/model/test.ecore b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/src/main/resources/model/test.ecore new file mode 100644 index 00000000000..b88fed47103 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/src/main/resources/model/test.ecore @@ -0,0 +1,5 @@ + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/src/main/resources/model/test.genmodel b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/src/main/resources/model/test.genmodel new file mode 100644 index 00000000000..2621855f1e8 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-multiple-steps/src/main/resources/model/test.genmodel @@ -0,0 +1,12 @@ + + + test.ecore + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.classpath b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.classpath new file mode 100644 index 00000000000..2e45e01c924 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.gitignore b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.gitignore new file mode 100644 index 00000000000..b83d22266ac --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.project b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.project new file mode 100644 index 00000000000..39fd47d8c42 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.project @@ -0,0 +1,23 @@ + + + generate + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.settings/org.eclipse.jdt.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..5723a0f871a --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.settings/org.eclipse.m2e.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000000..f897a7f1cb2 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/invoker.properties b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/invoker.properties new file mode 100644 index 00000000000..9c7a7746f7e --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/invoker.properties @@ -0,0 +1,7 @@ +invoker.goals=--no-transfer-progress package + +# Run mvn with --debug for debug logging +#invoker.debug=true + +# Run mvn in debugging mode and wait for a debugger to attach +#invoker.environmentVariables.MAVEN_DEBUG_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/pom.xml b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/pom.xml new file mode 100644 index 00000000000..8370cf5763f --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/pom.xml @@ -0,0 +1,47 @@ + + 4.0.0 + + + biz.aQute.bnd-test + generate-maven-configuration-system + 0.0.1 + jar + + + + org.geckoprojects.emf + org.gecko.emf.osgi.api + 4.1.1.202202162308 + + + + + + + biz.aQute.bnd + bnd-generate-maven-plugin + ${bnd.version} + + + + src/main/resources/marker.txt + dir > src/main/java/test.txt + src/main/java + + src/main/resources/model/test.genmodel + + + + + + + generate-sources + + bnd-generate + + + + + + + \ No newline at end of file diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/postbuild.groovy b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/postbuild.groovy new file mode 100644 index 00000000000..bdba1c7b178 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/postbuild.groovy @@ -0,0 +1,14 @@ +import aQute.bnd.build.Workspace +import aQute.bnd.build.model.BndEditModel +import aQute.bnd.osgi.Processor +import aQute.bnd.properties.Document +import aQute.bnd.version.MavenVersion +import aQute.lib.io.IO + +import java.util.jar.Attributes +import java.util.jar.JarFile; + +// Check the if some code generated file exist! +File testFile = new File(basedir,"src/main/java/test.txt") +assert testFile.isFile() + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/src/main/resources/marker.txt b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration-system/src/main/resources/marker.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.classpath b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.classpath new file mode 100644 index 00000000000..2e45e01c924 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.gitignore b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.gitignore new file mode 100644 index 00000000000..b83d22266ac --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.project b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.project new file mode 100644 index 00000000000..39fd47d8c42 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.project @@ -0,0 +1,23 @@ + + + generate + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.settings/org.eclipse.jdt.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..5723a0f871a --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.settings/org.eclipse.m2e.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000000..f897a7f1cb2 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/invoker.properties b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/invoker.properties new file mode 100644 index 00000000000..9c7a7746f7e --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/invoker.properties @@ -0,0 +1,7 @@ +invoker.goals=--no-transfer-progress package + +# Run mvn with --debug for debug logging +#invoker.debug=true + +# Run mvn in debugging mode and wait for a debugger to attach +#invoker.environmentVariables.MAVEN_DEBUG_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/pom.xml b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/pom.xml new file mode 100644 index 00000000000..aabbf1cd309 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/pom.xml @@ -0,0 +1,54 @@ + + 4.0.0 + + + biz.aQute.bnd-test + generate-maven-configuration + 0.0.1 + jar + + + + org.geckoprojects.emf + org.gecko.emf.osgi.api + 4.1.1.202202162308 + + + + + + + biz.aQute.bnd + bnd-generate-maven-plugin + ${bnd.version} + + + + org.geckoprojects.emf + org.gecko.emf.osgi.codegen + 4.1.1.202202162308 + + + + + src/main/resources/model/test.genmodel + geckoEMF 1>out.log 2>out.log + src/main/java + + src/main/resources/model/test.genmodel + + + + + + + generate-sources + + bnd-generate + + + + + + + \ No newline at end of file diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/postbuild.groovy b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/postbuild.groovy new file mode 100644 index 00000000000..a54bef68318 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/postbuild.groovy @@ -0,0 +1,24 @@ +import aQute.bnd.build.Workspace +import aQute.bnd.build.model.BndEditModel +import aQute.bnd.osgi.Processor +import aQute.bnd.properties.Document +import aQute.bnd.version.MavenVersion +import aQute.lib.io.IO + +import java.util.jar.Attributes +import java.util.jar.JarFile; + +def baseVersion = new MavenVersion(bndVersion).toReleaseVersion() + +// Check the ecore file exist! +File ecore = new File(basedir,"src/main/resources/model/test.ecore") +assert ecore.isFile() + +// Check the genmodel file exist! +File genmodel = new File(basedir,"src/main/resources/model/test.genmodel") +assert genmodel.isFile() + +// Check the if some code generated file exist! +File testClass = new File(basedir,"src/main/java/aQute/bnd/maven/model/test/Test.java") +assert testClass.isFile() + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/src/main/resources/model/test.ecore b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/src/main/resources/model/test.ecore new file mode 100644 index 00000000000..b88fed47103 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/src/main/resources/model/test.ecore @@ -0,0 +1,5 @@ + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/src/main/resources/model/test.genmodel b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/src/main/resources/model/test.genmodel new file mode 100644 index 00000000000..2621855f1e8 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate-maven-configuration/src/main/resources/model/test.genmodel @@ -0,0 +1,12 @@ + + + test.ecore + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/.classpath b/maven/bnd-generate-maven-plugin/src/it/generate/.classpath new file mode 100644 index 00000000000..2e45e01c924 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/.gitignore b/maven/bnd-generate-maven-plugin/src/it/generate/.gitignore new file mode 100644 index 00000000000..b83d22266ac --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/.project b/maven/bnd-generate-maven-plugin/src/it/generate/.project new file mode 100644 index 00000000000..39fd47d8c42 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/.project @@ -0,0 +1,23 @@ + + + generate + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/.settings/org.eclipse.jdt.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..5723a0f871a --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/.settings/org.eclipse.m2e.core.prefs b/maven/bnd-generate-maven-plugin/src/it/generate/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000000..f897a7f1cb2 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/bnd.bnd b/maven/bnd-generate-maven-plugin/src/it/generate/bnd.bnd new file mode 100644 index 00000000000..ed961269925 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/bnd.bnd @@ -0,0 +1,5 @@ +-generate:\ + src/main/resources/model/test.genmodel;\ + generate="geckoEMF 1>out.log 2>out.log";\ + genmodel="src/main/resources/model/test.genmodel";\ + output=src/main/java diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/invoker.properties b/maven/bnd-generate-maven-plugin/src/it/generate/invoker.properties new file mode 100644 index 00000000000..9c7a7746f7e --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/invoker.properties @@ -0,0 +1,7 @@ +invoker.goals=--no-transfer-progress package + +# Run mvn with --debug for debug logging +#invoker.debug=true + +# Run mvn in debugging mode and wait for a debugger to attach +#invoker.environmentVariables.MAVEN_DEBUG_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/pom.xml b/maven/bnd-generate-maven-plugin/src/it/generate/pom.xml new file mode 100644 index 00000000000..366c4f4af75 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/pom.xml @@ -0,0 +1,46 @@ + + 4.0.0 + + + biz.aQute.bnd-test + generate + 0.0.1 + jar + + + + org.geckoprojects.emf + org.gecko.emf.osgi.api + 4.1.1.202202162308 + + + + + + + biz.aQute.bnd + bnd-generate-maven-plugin + ${bnd.version} + + + + org.geckoprojects.emf + org.gecko.emf.osgi.codegen + 4.1.1.202202162308 + + + + + + generate-sources + + bnd-generate + + + + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/postbuild.groovy b/maven/bnd-generate-maven-plugin/src/it/generate/postbuild.groovy new file mode 100644 index 00000000000..a54bef68318 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/postbuild.groovy @@ -0,0 +1,24 @@ +import aQute.bnd.build.Workspace +import aQute.bnd.build.model.BndEditModel +import aQute.bnd.osgi.Processor +import aQute.bnd.properties.Document +import aQute.bnd.version.MavenVersion +import aQute.lib.io.IO + +import java.util.jar.Attributes +import java.util.jar.JarFile; + +def baseVersion = new MavenVersion(bndVersion).toReleaseVersion() + +// Check the ecore file exist! +File ecore = new File(basedir,"src/main/resources/model/test.ecore") +assert ecore.isFile() + +// Check the genmodel file exist! +File genmodel = new File(basedir,"src/main/resources/model/test.genmodel") +assert genmodel.isFile() + +// Check the if some code generated file exist! +File testClass = new File(basedir,"src/main/java/aQute/bnd/maven/model/test/Test.java") +assert testClass.isFile() + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/src/main/resources/model/test.ecore b/maven/bnd-generate-maven-plugin/src/it/generate/src/main/resources/model/test.ecore new file mode 100644 index 00000000000..b88fed47103 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/src/main/resources/model/test.ecore @@ -0,0 +1,5 @@ + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/generate/src/main/resources/model/test.genmodel b/maven/bnd-generate-maven-plugin/src/it/generate/src/main/resources/model/test.genmodel new file mode 100644 index 00000000000..2621855f1e8 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/generate/src/main/resources/model/test.genmodel @@ -0,0 +1,12 @@ + + + test.ecore + + + + diff --git a/maven/bnd-generate-maven-plugin/src/it/settings.xml b/maven/bnd-generate-maven-plugin/src/it/settings.xml new file mode 100644 index 00000000000..2882bd72745 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/it/settings.xml @@ -0,0 +1,50 @@ + + + false + + + + + + + + + it-repo + + true + + + + local.central + @localRepositoryUrl@ + + ignore + true + + + ignore + true + + + + + + local.central + @localRepositoryUrl@ + + ignore + true + + + ignore + true + + + + + + + diff --git a/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/BndContainer.java b/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/BndContainer.java new file mode 100644 index 00000000000..ebd12045867 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/BndContainer.java @@ -0,0 +1,233 @@ +package aQute.bnd.maven.generate.plugin; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Properties; + +import org.apache.maven.RepositoryUtils; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.model.Dependency; +import org.apache.maven.plugin.MojoExecution; +import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.ArtifactRequest; +import org.eclipse.aether.resolution.ArtifactResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import aQute.bnd.annotation.ProviderType; +import aQute.bnd.build.Project; +import aQute.bnd.build.Workspace; +import aQute.bnd.maven.lib.configuration.BeanProperties; +import aQute.bnd.maven.lib.configuration.Configurations; +import aQute.bnd.maven.lib.resolve.ImplicitFileSetRepository; +import aQute.bnd.maven.lib.resolve.LocalPostProcessor; +import aQute.bnd.maven.lib.resolve.PostProcessor; +import aQute.bnd.osgi.Processor; +import aQute.bnd.repository.fileset.FileSetRepository; +import aQute.bnd.service.RepositoryPlugin; + +@ProviderType +public class BndContainer { + + private static final Logger logger = LoggerFactory + .getLogger(BndContainer.class); + + private final List bundles = new ArrayList<>(); + + private final MavenProject project; + + private final RepositorySystemSession repositorySession; + + private final MavenSession session; + + private final RepositorySystem system; + + private final PostProcessor postProcessor; + + private List dependencies; + + private Properties additionProperties; + + public static class Builder { + + private final MavenProject project; + private final MavenSession session; + private final RepositorySystemSession repositorySession; + private final RepositorySystem system; + private PostProcessor postProcessor = new LocalPostProcessor(); + private List dependencies = new ArrayList(); + private Properties additionaProperties = new Properties(); + + @SuppressWarnings("deprecation") + public Builder(MavenProject project, MavenSession session, RepositorySystemSession repositorySession, + RepositorySystem system) { + + this.project = Objects.requireNonNull(project); + this.session = Objects.requireNonNull(session); + this.repositorySession = Objects.requireNonNull(repositorySession); + this.system = Objects.requireNonNull(system); + } + + public Builder setPostProcessor(PostProcessor postProcessor) { + this.postProcessor = postProcessor; + return this; + } + + public Builder setDependencies(List dependencies) { + this.dependencies.addAll(dependencies); + return this; + } + + public Builder setAdditionalProperiets(Properties properties) { + this.additionaProperties.putAll(properties); + return this; + } + + public BndContainer build() { + return new BndContainer(project, session, repositorySession, system, + dependencies, postProcessor, additionaProperties); + } + + } + + public static int report(Processor project) { + int errors = 0; + for (String warning : project.getWarnings()) { + logger.warn("Warning : {}", warning); + } + for (String error : project.getErrors()) { + logger.error("Error : {}", error); + errors++; + } + return errors; + } + + @SuppressWarnings("deprecation") + BndContainer(MavenProject project, MavenSession session, RepositorySystemSession repositorySession, + RepositorySystem system, List dependencies, PostProcessor postProcessor, + Properties additionProperties) { + this.project = project; + this.session = session; + this.repositorySession = repositorySession; + this.system = system; + this.dependencies = dependencies; + this.postProcessor = postProcessor; + this.additionProperties = additionProperties; + } + + public int generate(String task, File workingDir, GenerateOperation operation, Settings settings, + MojoExecution mojoExecution) throws Exception { + Properties beanProperties = new BeanProperties(); + beanProperties.put("project", project); + beanProperties.put("settings", settings); + Properties mavenProperties = new Properties(beanProperties); + Properties projectProperties = project.getProperties(); + mavenProperties.putAll(projectProperties); + mavenProperties.putAll(additionProperties); + try (Project bnd = init(task, workingDir, mavenProperties)) { + if (bnd == null) { + return 1; + } + + bnd.setTrace(logger.isDebugEnabled()); + + bnd.setBase(project.getBasedir()); + File propertiesFile = Configurations.loadProperties(bnd, project, mojoExecution); + bnd.setProperty("project.output", workingDir.getCanonicalPath()); + + int errors = report(bnd); + if (!bnd.isOk()) { + return errors; + } + injectImplicitRepository(bnd.getWorkspace()); + return operation.apply("generate", bnd); + } + } + + public Project init(String task, File workingDir, Properties mavenProperties) throws Exception { + File cnfDir = new File(workingDir, "tempGenerateWS/cnf"); + cnfDir.mkdirs(); + File buildBnd = new File(cnfDir, "build.bnd"); + buildBnd.createNewFile(); + mavenProperties.store(new FileOutputStream(buildBnd), task); + Workspace workspace = new Workspace(cnfDir.getParentFile()); + Project project = new Project(workspace, workingDir); + workspace.setOffline(session.getSettings() + .isOffline()); + project.forceRefresh(); // setBase must be called after forceRefresh + project.getInfo(workspace); + return project; + } + + public boolean injectImplicitRepository(Workspace workspace) throws Exception { + if (workspace.getPlugin(ImplicitFileSetRepository.class) == null) { + workspace.addBasicPlugin(getFileSetRepository()); + for (RepositoryPlugin repo : workspace.getRepositories()) { + repo.list(null); + } + return true; + } + return false; + } + + + /** + * Creates a new repository in every invocation. + * + * @return a new {@link ImplicitFileSetRepository} + * @throws Exception + */ + public FileSetRepository getFileSetRepository() throws Exception { + return getFileSetRepository(project); + } + + private List getProjectRemoteRepositories() { + List remoteRepositories = new ArrayList<>(project.getRemoteProjectRepositories()); + ArtifactRepository deployRepo = project.getDistributionManagementArtifactRepository(); + if (deployRepo != null) { + remoteRepositories.add(RepositoryUtils.toRepo(deployRepo)); + } + return remoteRepositories; + } + + /** + * Creates a new repository in every invocation. + * + * @param project the Maven project + * @return a new {@link ImplicitFileSetRepository} + * @throws Exception + */ + public FileSetRepository getFileSetRepository(MavenProject project) throws Exception { + + List repositories = getProjectRemoteRepositories(); + + bundles.clear(); + + for (Dependency dep : dependencies) { + + ArtifactResult artifactResult = postProcessor.postProcessResult( + system.resolveArtifact(repositorySession, new ArtifactRequest(transform(dep), repositories, null))); + + bundles.add(artifactResult.getArtifact() + .getFile()); + + } + return new ImplicitFileSetRepository("Generator-Dependencies", bundles); + } + + private Artifact transform(Dependency dependency) { + Artifact artifact = new DefaultArtifact(dependency.getGroupId(), dependency.getArtifactId(), + dependency.getType(), dependency.getVersion()); + return artifact; + } +} diff --git a/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/GenerateMojo.java b/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/GenerateMojo.java new file mode 100644 index 00000000000..cfdbf53c152 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/GenerateMojo.java @@ -0,0 +1,197 @@ +package aQute.bnd.maven.generate.plugin; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Properties; +import java.util.Set; +import java.util.StringJoiner; + +import org.apache.maven.execution.MavenSession; +import org.apache.maven.model.Dependency; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecution; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import aQute.bnd.build.Project; +import aQute.bnd.result.Result; + +@Mojo(name = "bnd-generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES, requiresDependencyResolution = ResolutionScope.NONE, threadSafe = true) +public class GenerateMojo extends AbstractMojo { + + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + @Parameter(defaultValue = "${project}", readonly = true, required = true) + private MavenProject project; + + @Parameter(defaultValue = "${settings}", readonly = true) + private Settings settings; + + @Parameter(defaultValue = "${mojoExecution}", readonly = true) + MojoExecution mojoExecution; + + @Parameter(defaultValue = "${repositorySystemSession}", readonly = true, required = true) + private RepositorySystemSession repositorySession; + + @Parameter(defaultValue = "${project.build.directory}", readonly = true) + private File targetDir; + + @Parameter(property = "bnd.skip", defaultValue = "false") + boolean skip; + + /** + * The Mojo by itself does nothing. Dependent on its configuration, it will + * try to find a suitable generator in one of the dependencies in this list. + */ + @Parameter(property = "externalPlugins", required = false) + List externalPlugins; + + /** + * Allows multiple steps + */ + @Parameter(property = "steps", required = false) + List steps; + + @Parameter(defaultValue = "${session}", readonly = true) + private MavenSession session; + + @Component + private RepositorySystem system; + + /** + * File path to a bnd file containing bnd instructions for this project. + * Defaults to {@code bnd.bnd}. The file path can be an absolute or relative + * to the project directory. + *

+ * The bnd instructions for this project are merged with the bnd + * instructions, if any, for the parent project. + */ + @Parameter(defaultValue = Project.BNDFILE) + // This is not used and is for doc only; see {@link + // Configurations#loadProperties(Processor, MavenProject, MojoExecution)} + @SuppressWarnings("unused") + String bndfile; + + /** + * Bnd instructions for this project specified directly in the pom file. + * This is generally be done using a {@code } section. If the + * projects has a {@link #bndfile bnd file}, then this configuration element + * is ignored. + *

+ * The bnd instructions for this project are merged with the bnd + * instructions, if any, for the parent project. + */ + @Parameter + // This is not used and is for doc only; See {@link + // Configurations#loadProperties(Processor, MavenProject, MojoExecution)} + @SuppressWarnings("unused") + String bnd; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + + if (skip) { + return; + } + + int errors = 0; + + List normalizedDependencies = new ArrayList(); + if (externalPlugins != null) { + for (Dependency dependency : externalPlugins) { + normalizedDependencies.add(normalizeDependendency(dependency)); + } + } + Properties additionalProperties = new Properties(); + StringJoiner instruction = new StringJoiner(","); + steps.stream() + .map(this::mapStep) + .forEach(instruction::add); + if (instruction.length() > 0) { + logger.info("created instructions from steps: {}", instruction.toString()); + additionalProperties.put("-generate.maven", instruction.toString()); + } + try { + + BndContainer container = new BndContainer.Builder(project, session, repositorySession, system) + .setDependencies(normalizedDependencies) + .setAdditionalProperiets(additionalProperties) + .build(); + + GenerateOperation operation = getOperation(); + + errors = container.generate("generating", targetDir, operation, settings, mojoExecution); + + } catch (Exception e) { + throw new MojoExecutionException(e.getMessage(), e); + } + + if (errors > 0) + throw new MojoFailureException(errors + " errors found"); + } + + private GenerateOperation getOperation() { + return (taskName, project) -> { + int errors = 0; + try { + Result> result = project.getGenerate() + .generate(false); + if (result.isErr()) { + result.error() + .ifPresent(error -> logger.error("Error : {}", error)); + errors++; + } + } finally { + errors += BndContainer.report(project); + } + return errors; + }; + } + + private String mapStep(Step step) { + StringJoiner joiner = new StringJoiner(";"); + joiner.add(step.getTrigger()); + joiner.add("output=" + step.getOutput()); + if (step.getGenerateCommand() != null) { + joiner.add("generate=\"" + step.getGenerateCommand() + "\""); + } + if (step.getSystemCommand() != null) { + joiner.add("system=\"" + step.getSystemCommand() + "\""); + } + step.getProperties() + .forEach((k, v) -> joiner.add(k + "=\"" + v + "\"")); + return joiner.toString(); + } + + private Dependency normalizeDependendency(Dependency dependency) throws MojoExecutionException { + if(dependency.getVersion() != null) { + return dependency; + } else { + List deps = project.getDependencyManagement() != null ? project.getDependencyManagement() + .getDependencies() : Collections.emptyList(); + return deps + .stream() + .filter(d -> d.getArtifactId() + .equals(dependency.getArtifactId()) + && d.getGroupId() + .equals(dependency.getGroupId())) + .findFirst() + .map(d -> d.clone()) + .orElseThrow(() -> new MojoExecutionException(dependency, "Version is missing", + "The Version of the " + dependency.toString() + " is missing")); + } + } +} diff --git a/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/GenerateOperation.java b/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/GenerateOperation.java new file mode 100644 index 00000000000..c52c490f9b9 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/GenerateOperation.java @@ -0,0 +1,17 @@ +package aQute.bnd.maven.generate.plugin; + +import aQute.bnd.build.Project; + +@FunctionalInterface +public interface GenerateOperation { + /** + * Performs this operation on the given arguments. + * + * @param taskname name of the task performing the operation + * @param project the project to run the generate task on + * @return the number of errors + * @throws Exception + */ + int apply(String taskname, Project project) throws Exception; + +} diff --git a/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/Step.java b/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/Step.java new file mode 100644 index 00000000000..8e5d22bcc6f --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/main/java/aQute/bnd/maven/generate/plugin/Step.java @@ -0,0 +1,78 @@ +package aQute.bnd.maven.generate.plugin; + +import java.util.Properties; + +import org.apache.maven.plugins.annotations.Parameter; + +/** + * A generate insturction will be created from this configuration as described + * in the bnd + * generate documentation + * + * @author Juergen Albert + */ +public class Step { + + /** + * This is the clause in the resulting + * generate + * instruction. It is used to establish a fileset where wildcards are + * supported. If one of the files is newer then any of the files in the + * output, code will be regenerated. + */ + @Parameter + private String trigger; + + /** + * This is the output directory in the resulting + * generate + * instruction + */ + @Parameter + private String output; + + /** + * The generate option in the resulting + * generate + * instruction. It is used to find a external plugin which may hold a + * generator or a declared Main-Class + */ + @Parameter(required = false) + private String generateCommand = null; + + /** + * The system option in the resulting + * generate + * instruction. It will be executed as a system command. + */ + @Parameter(required = false) + private String systemCommand = null; + + /** + * Any additional properties that the specific generate plugin will support. + */ + @Parameter(property = "properties", required = false) + private Properties properties = new Properties(); + + public String getTrigger() { + return trigger; + } + + public String getOutput() { + return output; + } + + public String getGenerateCommand() { + return generateCommand; + } + + public String getSystemCommand() { + return systemCommand; + } + + public Properties getProperties() { + return properties; + } + + +} diff --git a/maven/bnd-generate-maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml b/maven/bnd-generate-maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml new file mode 100644 index 00000000000..0d49f5a9601 --- /dev/null +++ b/maven/bnd-generate-maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml @@ -0,0 +1,21 @@ + + + + + + + bnd-process + bnd-process-tests + jar + test-jar + + + + + true + true + + + + + diff --git a/maven/bnd-maven-plugin/Debug mvnDebug.launch b/maven/bnd-maven-plugin/Debug mvnDebug.launch index 0a5f70a74a1..6f9af63b44d 100644 --- a/maven/bnd-maven-plugin/Debug mvnDebug.launch +++ b/maven/bnd-maven-plugin/Debug mvnDebug.launch @@ -7,7 +7,7 @@ - + @@ -15,6 +15,7 @@ + diff --git a/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/AbstractBndMavenPlugin.java b/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/AbstractBndMavenPlugin.java index f5982e09668..1120893c3c3 100644 --- a/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/AbstractBndMavenPlugin.java +++ b/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/AbstractBndMavenPlugin.java @@ -29,7 +29,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.Properties; import java.util.Set; @@ -43,9 +42,6 @@ import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; import org.apache.maven.model.Developer; import org.apache.maven.model.License; -import org.apache.maven.model.Plugin; -import org.apache.maven.model.PluginExecution; -import org.apache.maven.model.PluginManagement; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.MojoExecutionException; @@ -57,7 +53,6 @@ import org.apache.maven.settings.Settings; import org.apache.maven.shared.mapping.MappingUtils; import org.codehaus.plexus.util.StringUtils; -import org.codehaus.plexus.util.xml.Xpp3Dom; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonatype.plexus.build.incremental.BuildContext; @@ -67,6 +62,7 @@ import aQute.bnd.header.OSGiHeader; import aQute.bnd.maven.PomPropertiesResource; import aQute.bnd.maven.lib.configuration.BeanProperties; +import aQute.bnd.maven.lib.configuration.Configurations; import aQute.bnd.osgi.Builder; import aQute.bnd.osgi.Constants; import aQute.bnd.osgi.FileResource; @@ -77,7 +73,6 @@ import aQute.bnd.version.Version; import aQute.lib.io.IO; import aQute.lib.strings.Strings; -import aQute.lib.utf8properties.UTF8Properties; import aQute.service.reporter.Report.Location; public abstract class AbstractBndMavenPlugin extends AbstractMojo { @@ -125,7 +120,8 @@ public abstract class AbstractBndMavenPlugin extends AbstractMojo { * instructions, if any, for the parent project. */ @Parameter(defaultValue = Project.BNDFILE) - // This is not used and is for doc only; see loadProjectProperties + // This is not used and is for doc only; see {@link + // Configurations#loadProperties(Processor, MavenProject, MojoExecution)} @SuppressWarnings("unused") String bndfile; @@ -139,7 +135,8 @@ public abstract class AbstractBndMavenPlugin extends AbstractMojo { * instructions, if any, for the parent project. */ @Parameter - // This is not used and is for doc only; see loadProjectProperties + // This is not used and is for doc only; See {@link + // Configurations#loadProperties(Processor, MavenProject, MojoExecution)} @SuppressWarnings("unused") String bnd; @@ -207,7 +204,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { builder.setTrace(logger.isDebugEnabled()); builder.setBase(project.getBasedir()); - propertiesFile = loadProperties(builder); + propertiesFile = Configurations.loadProperties(builder, project, mojoExecution); builder.setProperty("project.output", targetDir.getCanonicalPath()); // If no bundle to be built, we have nothing to do @@ -637,97 +634,6 @@ private String createArtifactName(Artifact artifact) { artifact.getType()); } - private File loadProperties(Builder builder) throws Exception { - // Load parent project properties first - loadParentProjectProperties(builder, project); - - // Load current project properties - Xpp3Dom configuration = Optional.ofNullable(project.getBuildPlugins()) - .flatMap(this::getConfiguration) - .orElseGet(this::defaultConfiguration); - return loadProjectProperties(builder, project, project, configuration); - } - - private void loadParentProjectProperties(Builder builder, MavenProject currentProject) throws Exception { - MavenProject parentProject = currentProject.getParent(); - if (parentProject == null) { - return; - } - loadParentProjectProperties(builder, parentProject); - - // Get configuration from parent project - Xpp3Dom configuration = Optional.ofNullable(parentProject.getBuildPlugins()) - .flatMap(this::getConfiguration) - .orElse(null); - if (configuration != null) { - // Load parent project's properties - loadProjectProperties(builder, parentProject, parentProject, configuration); - return; - } - - // Get configuration in project's pluginManagement - configuration = Optional.ofNullable(currentProject.getPluginManagement()) - .map(PluginManagement::getPlugins) - .flatMap(this::getConfiguration) - .orElseGet(this::defaultConfiguration); - // Load properties from parent project's bnd file or configuration in - // project's pluginManagement - loadProjectProperties(builder, parentProject, currentProject, configuration); - } - - private File loadProjectProperties(Builder builder, MavenProject bndProject, MavenProject pomProject, - Xpp3Dom configuration) throws Exception { - // check for bnd file configuration - File baseDir = bndProject.getBasedir(); - if (baseDir != null) { // file system based pom - File pomFile = bndProject.getFile(); - builder.updateModified(pomFile.lastModified(), "POM: " + pomFile); - // check for bnd file - Xpp3Dom bndfileElement = configuration.getChild("bndfile"); - String bndFileName = (bndfileElement != null) ? bndfileElement.getValue() : Project.BNDFILE; - File bndFile = IO.getFile(baseDir, bndFileName); - if (bndFile.isFile()) { - logger.debug("loading bnd properties from file: {}", bndFile); - // we use setProperties to handle -include - builder.setProperties(bndFile.getParentFile(), builder.loadProperties(bndFile)); - return bndFile; - } - // no bnd file found, so we fall through - } - - // check for bnd-in-pom configuration - baseDir = pomProject.getBasedir(); - File pomFile = pomProject.getFile(); - if (baseDir != null) { - builder.updateModified(pomFile.lastModified(), "POM: " + pomFile); - } - Xpp3Dom bndElement = configuration.getChild("bnd"); - if (bndElement != null) { - logger.debug("loading bnd properties from bnd element in pom: {}", pomProject); - UTF8Properties properties = new UTF8Properties(); - properties.load(bndElement.getValue(), pomFile, builder); - // we use setProperties to handle -include - builder.setProperties(baseDir, properties.replaceHere(baseDir)); - } - return pomFile; - } - - private Optional getConfiguration(List plugins) { - return plugins.stream() - .filter(p -> Objects.equals(p, mojoExecution.getPlugin())) - .map(Plugin::getExecutions) - .flatMap(List::stream) - .filter(e -> Objects.equals(e.getId(), mojoExecution.getExecutionId())) - .findFirst() - .map(PluginExecution::getConfiguration) - .map(Xpp3Dom.class::cast) - .map(Xpp3Dom::new); - } - - private Xpp3Dom defaultConfiguration() { - return new Xpp3Dom("configuration"); - } - protected void reportErrorsAndWarnings(Builder builder) throws MojoFailureException { @SuppressWarnings("unchecked") Collection markedFiles = (Collection) buildContext.getValue(MARKED_FILES); diff --git a/maven/pom.xml b/maven/pom.xml index 813955e442a..bc8f3b1c033 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -26,5 +26,6 @@ bnd-resolver-maven-plugin bnd-run-maven-plugin bnd-reporter-maven-plugin + bnd-generate-maven-plugin