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

de.smartics.maven.plugin.buildmetadata.util.ManifestHelper 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.util;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.CharUtils;
import org.apache.commons.lang.ObjectUtils;
import org.codehaus.plexus.util.StringUtils;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;
import java.util.Properties;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

/**
 * Helper to write the Manifest to.
 */
public class ManifestHelper {
  // ********************************* Fields *********************************

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

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

  /**
   * The maximum length of a key in a Manifest file.
   */
  private static final int MANIFEST_KEY_MAX_LENGTH = 70;

  /**
   * The location to write the manifest to.
   */
  private final File manifestFile;

  /**
   * The section to add the keys in the manifest.
   */
  private final String manifestSection;

  // ****************************** Initializer *******************************

  // ****************************** Constructors ******************************

  /**
   * Default constructor.
   *
   * @param manifestFile the location to write the manifest to.
   * @param manifestSection the section to add the keys in the manifest.
   */
  public ManifestHelper(final File manifestFile, final String manifestSection) {
    this.manifestFile = manifestFile;
    this.manifestSection = manifestSection;
  }

  // ****************************** Inner Classes *****************************

  // ********************************* Methods ********************************

  // --- init -----------------------------------------------------------------

  // --- get&set --------------------------------------------------------------

  // --- business -------------------------------------------------------------

  /**
   * Creates a Manifest file based on the given properties.
   *
   * @param buildMetaDataProperties the properties to add to the Manifest file
   *        to be written.
   * @throws IOException on any problem writing the file.
   */
  public void createManifest(final Properties buildMetaDataProperties)
      throws IOException {
    final Manifest manifest = createManifestInstance(buildMetaDataProperties);

    OutputStream out = null;
    try {
      out = new BufferedOutputStream(new FileOutputStream(manifestFile));
      manifest.write(out);
    } finally {
      IOUtils.closeQuietly(out);
    }
  }

  private Manifest createManifestInstance(
      final Properties buildMetaDataProperties) {
    final Manifest manifest = new Manifest();
    final Attributes attributes = fetchAttributes(manifest);
    manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
    for (final Map.Entry entry : buildMetaDataProperties
        .entrySet()) {
      final String key = ObjectUtils.toString(entry.getKey(), null);
      if (key.length() > MANIFEST_KEY_MAX_LENGTH) {
        continue;
      }

      final String normalizedKey = normalize(key);
      final String value = ObjectUtils.toString(entry.getValue(), null);

      attributes.putValue(normalizedKey, value);
    }

    return manifest;
  }

  private Attributes fetchAttributes(final Manifest manifest) {
    if (StringUtils.isBlank(manifestSection)
        || "Main".equals(manifestSection)) {
      return manifest.getMainAttributes();
    }

    Attributes attributes = manifest.getAttributes(manifestSection);
    if (attributes == null) {
      attributes = new Attributes();
      manifest.getEntries().put(manifestSection, attributes);
    }
    return attributes;
  }

  private static String normalize(final String key) {
    final int length = key.length();
    final StringBuilder buffer = new StringBuilder(length);
    for (int i = 0; i < length; i++) {
      final char ch = key.charAt(i);
      if (CharUtils.isAsciiAlphanumeric(ch) || ch == '-' || ch == '_') {
        buffer.append(ch);
      } else {
        buffer.append('_');
      }
    }

    return buffer.toString();
  }

  // --- object basics --------------------------------------------------------

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy