de.smartics.maven.plugin.buildmetadata.io.AdditionalLocationsSupport Maven / Gradle / Ivy
/*
* Copyright 2006-2019 smartics, Kronseder & Reiner GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package de.smartics.maven.plugin.buildmetadata.io;
import de.smartics.maven.plugin.buildmetadata.util.MojoFileUtils;
import org.apache.commons.io.FileUtils;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* Helper to copy buildmetadata files to additional locations to be grabbed by
* secondary packers. For instance this will copy the file to
* generated-sources
.
*/
public class AdditionalLocationsSupport {
// ********************************* Fields *********************************
// --- constants ------------------------------------------------------------
// --- members --------------------------------------------------------------
/**
* The Maven project.
*/
private final MavenProject project;
/**
* The configuration from the plugin.
*/
private final Config config;
// ****************************** Initializer *******************************
// ****************************** Constructors ******************************
/**
* Default constructor.
*
* @param project the Maven project.
* @param config the configuration from the plugin.
*/
public AdditionalLocationsSupport(final MavenProject project,
final Config config) {
this.project = project;
this.config = config;
}
// ****************************** Inner Classes *****************************
/**
* Collects the configuration for the plugin.
*/
public static class Config {
/**
* The flag to control whether or not to copy to
* generated-sources
.
*/
private boolean addToGeneratedSources;
/**
* The list of locations the report files are to be copied to. If it is not
* absolute, the subfolder META-INF
is appended.
*/
private List addToLocations;
/**
* Sets the flag to control whether or not to copy to
* generated-sources
.
*
* @param addToGeneratedSources the flag to control whether or not to copy
* to generated-sources
.
* @return a reference to this configuration.
*/
public Config setAddToGeneratedSources(
final boolean addToGeneratedSources) {
this.addToGeneratedSources = addToGeneratedSources;
return this;
}
/**
* Sets the list of locations the report files are to be copied to. If it is
* not absolute, the subfolder META-INF
is appended.
*
* @param addToLocations the list of locations the report files are to be
* copied to.
* @return a reference to this configuration.
*/
public Config setAddToLocations(final List addToLocations) {
this.addToLocations = addToLocations;
return this;
}
}
// ********************************* Methods ********************************
// --- init -----------------------------------------------------------------
// --- get&set --------------------------------------------------------------
// --- business -------------------------------------------------------------
/**
* Handles the given file to be copied to the configured locations.
*
* @param file the file to copy.
* @throws MojoExecutionException on any copy problem.
*/
public void handle(final File file) throws MojoExecutionException {
if (isToAttachSources()) {
addFileToSources(file, "generated-sources", true);
}
if (config.addToLocations != null) {
for (final String location : config.addToLocations) {
addFileToSources(file, location, false);
}
}
}
@SuppressWarnings("unchecked")
private boolean isToAttachSources() {
if (!config.addToGeneratedSources) {
return false;
}
final Map plugins = project.getBuild().getPluginsAsMap();
final Plugin sourcesPlugin = plugins.get(
Plugin.constructKey("org.apache.maven.plugins", "maven-source-plugin"));
if (sourcesPlugin != null) {
// TODO: Should we check if the plugin is to be run?
return true;
}
return false;
}
private void addFileToSources(final File propertiesFile,
final String targetLocation, final boolean attach)
throws MojoExecutionException {
final File testFile = new File(targetLocation);
final File targetLocationDir;
final File generatedSourcesMetaInfDir;
if (testFile.isAbsolute()) {
targetLocationDir = null;
generatedSourcesMetaInfDir = testFile;
} else {
targetLocationDir =
new File(project.getBuild().getDirectory(), targetLocation);
generatedSourcesMetaInfDir = new File(targetLocationDir, "META-INF");
}
MojoFileUtils.ensureExists(generatedSourcesMetaInfDir);
try {
final File propertiesFileInSources =
new File(generatedSourcesMetaInfDir, propertiesFile.getName());
FileUtils.copyFile(propertiesFile, propertiesFileInSources);
if (attach && targetLocationDir != null) {
project.addCompileSourceRoot(targetLocationDir.getAbsolutePath());
}
} catch (final IOException e) {
throw new MojoExecutionException(
"Cannot copy properties to generated sources.", e);
}
}
// --- object basics --------------------------------------------------------
}