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

de.smartics.maven.plugin.buildmetadata.io.BuildXmlFileHelper 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.common.MojoUtils;
import de.smartics.maven.plugin.buildmetadata.common.Property;
import de.smartics.maven.plugin.buildmetadata.util.FilePathNormalizer;
import de.smartics.maven.plugin.buildmetadata.util.MojoIoUtils;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.codehaus.plexus.util.IOUtil;
import org.w3c.dom.Document;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Properties;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

/**
 * Helper to handle the build meta data properties file.
 */
public final class BuildXmlFileHelper {
  // ********************************* Fields *********************************

  // --- constants ------------------------------------------------------------

  // --- members --------------------------------------------------------------

  /**
   * The path to the project folder on the file system. Used to trim references
   * to project files.
   */
  private final String projectRootPath;

  /**
   * The logger to use.
   */
  private final Log log;

  /**
   * The file to write to.
   */
  private final File xmlOutputFile;

  /**
   * The list of a system properties or environment variables to be selected by
   * the user to include into the build meta data properties.
   * 

* The name is the name of the property, the section is relevant for placing * the property in one of the following sections: *

*
    *
  • build.scm
  • *
  • build.dateAndVersion
  • *
  • build.runtime
  • *
  • build.java
  • *
  • build.maven
  • *
  • build.misc
  • *
*

* If no valid section is given, the property is silently rendered in the * build.misc section. *

*/ private final List selectedProperties; // ****************************** Initializer ******************************* // ****************************** Constructors ****************************** /** * Default constructor. * * @param projectRootPath the path to the project folder on the file system. * @param log the logger to use. * @param xmlOutputFile the file to write to. * @param selectedProperties the list of a system properties or environment * variables to be selected by the user to include into the build meta * data properties. */ public BuildXmlFileHelper(final String projectRootPath, final Log log, final File xmlOutputFile, final List selectedProperties) { this.projectRootPath = projectRootPath; this.log = log; this.xmlOutputFile = xmlOutputFile; this.selectedProperties = selectedProperties; } // ****************************** Inner Classes ***************************** // ********************************* Methods ******************************** // --- init ----------------------------------------------------------------- // --- get&set -------------------------------------------------------------- // --- business ------------------------------------------------------------- /** * Writes the build meta data XML file to the target file. * * @param buildMetaDataProperties the properties to write. * @return the reference to the written file. * @throws MojoExecutionException on any problem encountered while writing the * XML file. */ public File writeXmlFile(final Properties buildMetaDataProperties) throws MojoExecutionException { final File buildMetaDataFile = createBuildMetaDataFile(xmlOutputFile); if (log.isInfoEnabled()) { log.info("Writing XML report '" + buildMetaDataFile.getAbsolutePath() + "'..."); } writeContent(buildMetaDataProperties, buildMetaDataFile); return buildMetaDataFile; } private void writeContent(final Properties buildMetaDataProperties, final File buildMetaDataFile) throws MojoExecutionException { OutputStream out = null; try { out = new BufferedOutputStream(new FileOutputStream(buildMetaDataFile)); serializeDocument(buildMetaDataProperties, out); } catch (final FileNotFoundException e) { final String message = "Cannot find file '" + buildMetaDataFile + "' to write XML report to."; throw MojoUtils.createException(log, e, message); } catch (final IOException e) { final String message = "Cannot write XML report to file '" + buildMetaDataFile + "'."; throw MojoUtils.createException(log, e, message); } catch (final ParserConfigurationException e) { final String message = "Cannot create XML report to write to file '" + buildMetaDataFile + "'."; throw MojoUtils.createException(log, e, message); } catch (final TransformerException e) { final String message = "Cannot transform build meta data to XML to write to file '" + buildMetaDataFile + "'."; throw MojoUtils.createException(log, e, message); } finally { IOUtil.close(out); } } private void serializeDocument(final Properties buildMetaDataProperties, final OutputStream out) throws ParserConfigurationException, IOException, TransformerException { final Document document = createDocument(); final SdocBuilder builder = new SdocBuilder(new FilePathNormalizer(projectRootPath), document, buildMetaDataProperties, selectedProperties); builder.writeDocumentContent(); MojoIoUtils.serialize(document, out); } /** * Creates the properties file for the build meta data. If the directory to * place it in is not present, it will be created. * * @return the file to write the build properties to. * @throws MojoExecutionException if the output directory is not present and * cannot be created. */ private File createBuildMetaDataFile(final File propertiesOutputFile) throws MojoExecutionException { final File outputDirectory = propertiesOutputFile.getParentFile(); if (!outputDirectory.exists()) { final boolean created = outputDirectory.mkdirs(); if (!created) { throw new MojoExecutionException( "Cannot create output directory '" + outputDirectory + "'."); } } return propertiesOutputFile; } private Document createDocument() throws ParserConfigurationException { final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); final DocumentBuilder builder = factory.newDocumentBuilder(); final Document document = builder.newDocument(); return document; } // --- object basics -------------------------------------------------------- }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy