| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with this |
| * work for additional information regarding copyright ownership. The ASF |
| * licenses this file to You 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 org.apache.sling.maven.slingstart; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.Map; |
| |
| import org.apache.maven.plugin.MojoExecutionException; |
| import org.apache.maven.project.MavenProject; |
| import org.codehaus.plexus.archiver.ArchiverException; |
| import org.codehaus.plexus.archiver.jar.JarArchiver; |
| import org.codehaus.plexus.archiver.jar.Manifest; |
| import org.codehaus.plexus.archiver.jar.Manifest.Attribute; |
| import org.codehaus.plexus.archiver.jar.ManifestException; |
| |
| public class JarArchiverHelper { |
| |
| private final JarArchiver archiver; |
| |
| private final MavenProject project; |
| |
| public JarArchiverHelper(final JarArchiver archiver, |
| final MavenProject project, |
| final File destFile) throws MojoExecutionException { |
| this(archiver, project, destFile, null); |
| } |
| |
| public JarArchiverHelper(final JarArchiver archiver, |
| final MavenProject project, |
| final File destFile, |
| final java.util.jar.Manifest manifest) throws MojoExecutionException { |
| this.project = project; |
| this.archiver = archiver; |
| this.archiver.reset(); |
| this.archiver.setDestFile(destFile); |
| |
| this.createManifest(manifest); |
| } |
| |
| /** |
| * Create a manifest |
| */ |
| private void createManifest(final java.util.jar.Manifest manifest) throws MojoExecutionException { |
| // create a new manifest |
| final Manifest outManifest = new Manifest(); |
| |
| try { |
| boolean hasMain = false; |
| |
| // copy entries from existing manifest |
| if ( manifest != null ) { |
| final Map<Object, Object> attrs = manifest.getMainAttributes(); |
| for(final Map.Entry<Object, Object> entry : attrs.entrySet()) { |
| final String key = entry.getKey().toString(); |
| if ( !BuildConstants.ATTRS_EXCLUDES.contains(key)) { |
| final Attribute a = new Attribute(key, entry.getValue().toString()); |
| outManifest.addConfiguredAttribute(a); |
| } |
| if ( key.equals(BuildConstants.ATTR_MAIN_CLASS) ) { |
| hasMain = true; |
| } |
| } |
| } |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_IMPLEMENTATION_BUILD, |
| project.getVersion())); |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_IMPLEMENTATION_VERSION, |
| project.getVersion())); |
| |
| String organizationName = project.getOrganization() != null ? project.getOrganization().getName() : null; |
| if ( organizationName != null ) { |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_IMPLEMENTATION_VENDOR, |
| organizationName)); |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_CREATED_BY, |
| organizationName)); |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_BUILT_BY, |
| organizationName)); |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_SPECIFICATION_VENDOR, |
| organizationName)); |
| } |
| |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_IMPLEMENTATION_VENDOR_ID, |
| project.getGroupId())); |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_IMPLEMENTATION_TITLE, |
| project.getName())); |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_SPECIFICATION_TITLE, |
| project.getName())); |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_SPECIFICATION_VERSION, |
| project.getVersion())); |
| |
| if ( archiver.getDestFile().getName().endsWith(".jar") && !hasMain) { |
| outManifest.addConfiguredAttribute(new Attribute(BuildConstants.ATTR_MAIN_CLASS, |
| BuildConstants.ATTR_VALUE_MAIN_CLASS)); |
| } |
| |
| archiver.addConfiguredManifest(outManifest); |
| } catch (final ManifestException e) { |
| throw new MojoExecutionException("Unable to create manifest for " + this.archiver.getDestFile(), e); |
| } |
| } |
| |
| public void addDirectory(File directory, String prefix, String[] includes, String[] excludes) |
| throws MojoExecutionException { |
| try { |
| archiver.addDirectory(directory, prefix, includes, excludes); |
| } catch (final ArchiverException ae) { |
| throw new MojoExecutionException("Unable to create archive for " + this.archiver.getDestFile(), ae); |
| } |
| } |
| |
| public void addDirectory(File directory, String prefix) throws MojoExecutionException { |
| try { |
| archiver.addDirectory(directory, prefix); |
| } catch (final ArchiverException ae) { |
| throw new MojoExecutionException("Unable to create archive for " + this.archiver.getDestFile(), ae); |
| } |
| } |
| |
| public void addDirectory(File directory, String[] includes, String[] excludes) throws MojoExecutionException { |
| try { |
| archiver.addDirectory(directory, includes, excludes); |
| } catch (final ArchiverException ae) { |
| throw new MojoExecutionException("Unable to create archive for " + this.archiver.getDestFile(), ae); |
| } |
| } |
| |
| public void addDirectory(File directory) throws MojoExecutionException { |
| try { |
| archiver.addDirectory(directory); |
| } catch (final ArchiverException ae) { |
| throw new MojoExecutionException("Unable to create archive for " + this.archiver.getDestFile(), ae); |
| } |
| } |
| |
| public void addFile(File arg0, String arg1, int arg2) throws MojoExecutionException { |
| try { |
| archiver.addFile(arg0, arg1, arg2); |
| } catch (final ArchiverException ae) { |
| throw new MojoExecutionException("Unable to create archive for " + this.archiver.getDestFile(), ae); |
| } |
| } |
| |
| public void addFile(File inputFile, String destFileName) throws MojoExecutionException { |
| try { |
| archiver.addFile(inputFile, destFileName); |
| } catch (final ArchiverException ae) { |
| throw new MojoExecutionException("Unable to create archive for " + this.archiver.getDestFile(), ae); |
| } |
| } |
| |
| public void createArchive() throws MojoExecutionException { |
| try { |
| archiver.createArchive(); |
| } catch (final ArchiverException ae) { |
| throw new MojoExecutionException("Unable to create archive for " + this.archiver.getDestFile(), ae); |
| } catch (IOException e) { |
| throw new MojoExecutionException("Unable to create archive for " + this.archiver.getDestFile(), e); |
| } |
| } |
| |
| public void addArtifacts(final Map<String, File> globalContentsMap, final String prefix) |
| throws MojoExecutionException { |
| for(final Map.Entry<String, File> entry : globalContentsMap.entrySet()) { |
| if ( entry.getValue().isFile() ) { |
| this.addFile(entry.getValue(), prefix + entry.getKey()); |
| } else { |
| this.addDirectory(entry.getValue(), prefix); |
| } |
| } |
| } |
| } |