Java tutorial
/* * Copyright 2006-2014 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 com.redhat.rcm.maven.plugin.buildmetadata.io; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; 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 com.redhat.rcm.maven.plugin.buildmetadata.util.MojoFileUtils; /** * Helper to copy buildmetadata files to additional locations to be grabbed by * secondary packers. For instance this will copy the file to * <code>generated-sources</code>. */ 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 * <code>generated-sources</code>. */ private boolean addToGeneratedSources; /** * The list of locations the report files are to be copied to. If it is not * absolute, the subfolder <code>META-INF</code> is appended. */ private List<String> addToLocations; /** * Sets the flag to control whether or not to copy to * <code>generated-sources</code>. * * @param addToGeneratedSources the flag to control whether or not to copy * to <code>generated-sources</code>. * @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 <code>META-INF</code> 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<String> 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<String, Plugin> 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 -------------------------------------------------------- }