All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 --------------------------------------------------------

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy