Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Maven codegen #5385

Merged
merged 3 commits into from
Oct 7, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Moved bnd Configuration load to reusable Helper Class
Signed-off-by: Juergen Albert <j.albert@data-in-motion.biz>
Signed-off-by: BJ Hargrave <bj@hargrave.dev>
  • Loading branch information
juergen-albert authored and bjhargrave committed Sep 29, 2022
commit 35699fd764266ab546a11b73d745414d74211456
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package aQute.bnd.maven.lib.configuration;

import static java.util.Objects.requireNonNull;

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 Bnd configuration for maven plugins consistently over the
* various Mojos.
*/
public class BndConfiguration {
private final static Logger logger = LoggerFactory.getLogger(BndConfiguration.class);

private final MavenProject project;
private final MojoExecution mojoExecution;

public BndConfiguration(MavenProject project, MojoExecution mojoExecution) {
this.project = requireNonNull(project);
this.mojoExecution = requireNonNull(mojoExecution);
}

public File loadProperties(Processor processor) throws Exception {
// Load parent project properties first
loadParentProjectProperties(processor, project);

// Load current project properties
Xpp3Dom configuration = Optional.ofNullable(project.getBuildPlugins())
.flatMap(this::getConfiguration)
.orElseGet(this::defaultConfiguration);
return loadProjectProperties(processor, project, project, configuration);
}

private void loadParentProjectProperties(Processor 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(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 Optional<Xpp3Dom> getConfiguration(List<Plugin> 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");
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@Version("1.1.0")
@Version("1.2.0")
@Export
package aQute.bnd.maven.lib.configuration;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,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;
Expand All @@ -44,6 +43,7 @@
import aQute.bnd.header.OSGiHeader;
import aQute.bnd.maven.PomPropertiesResource;
import aQute.bnd.maven.lib.configuration.BeanProperties;
import aQute.bnd.maven.lib.configuration.BndConfiguration;
import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Constants;
import aQute.bnd.osgi.FileResource;
Expand All @@ -54,17 +54,13 @@
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;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
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;
Expand All @@ -76,7 +72,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;
Expand Down Expand Up @@ -147,7 +142,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
// BndConfiguration#loadProperties(Processor)}
@SuppressWarnings("unused")
String bndfile;

Expand All @@ -161,7 +157,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
// BndConfiguration#loadProperties(Processor)}
@SuppressWarnings("unused")
String bnd;

Expand Down Expand Up @@ -236,7 +233,7 @@ public void execute() throws MojoExecutionException, MojoFailureException {
builder.setTrace(logger.isDebugEnabled());

builder.setBase(project.getBasedir());
propertiesFile = loadProperties(builder);
propertiesFile = new BndConfiguration(project, mojoExecution).loadProperties(builder);
builder.setProperty("project.output", getClassesDir().getCanonicalPath());

// If no bundle to be built, we have nothing to do
Expand Down Expand Up @@ -683,97 +680,6 @@ private String createArtifactName(Artifact artifact) {
getExtension(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<Xpp3Dom> getConfiguration(List<Plugin> 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<File> markedFiles = (Collection<File>) buildContext.getValue(MARKED_FILES);
Expand Down