Author: brett
Date: Mon Oct 3 08:19:13 2005
New Revision: 293366
URL: http://svn.apache.org/viewcvs?rev=293366&view=rev
Log:
PR: MNG-735
Submitted by: Daniel Krisher
Reviewed by: Brett Porter
Support unpacked assembly type, with separate mojo for creation
Added:
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java
(with props)
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archiver/
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archiver/DirectoryArchiver.java
(with props)
Modified:
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java
Modified:
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java
URL:
http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java?rev=293366&r1=293365&r2=293366&view=diff
==============================================================================
---
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java
(original)
+++
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java
Mon Oct 3 08:19:13 2005
@@ -44,13 +44,13 @@
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
-import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -64,7 +64,6 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Vincent Siveton</a>
* @version $Id$
* @goal assembly
- * @description Assemble an application bundle or distribution from an
assembly descriptor.
* @requiresDependencyResolution test
* @requiresDirectInvocation
* @execute phase="package"
@@ -73,7 +72,6 @@
public class AssemblyMojo
extends AbstractUnpackingMojo
{
-
/**
* Predefined Assembly Descriptor Id's. You can select bin,
jar-with-dependencies, or src.
*
@@ -130,14 +128,57 @@
public void execute()
throws MojoExecutionException, MojoFailureException
{
- doExecute();
+ Assembly assembly = readAssembly();
+
+ // TODO: include dependencies marked for distribution under certain
formats
+ // TODO: how, might we plug this into an installer, such as NSIS?
+ // TODO: allow file mode specifications?
+
+ String fullName = finalName + "-" + assembly.getId();
+
+ for ( Iterator i = assembly.getFormats().iterator(); i.hasNext(); )
+ {
+ String format = (String) i.next();
+
+ String filename = fullName + "." + format;
+
+ File destFile;
+ try
+ {
+ // TODO: use component roles? Can we do that in a mojo?
+ Archiver archiver = createArchiver( format );
+
+ destFile = createArchive( archiver, assembly, filename );
+ }
+ catch ( ArchiverException e )
+ {
+ throw new MojoExecutionException( "Error creating assembly", e
);
+ }
+ catch ( IOException e )
+ {
+ throw new MojoExecutionException( "Error creating assembly", e
);
+ }
+
+ projectHelper.attachArtifact( project, format, format +
"-assembly", destFile );
+ }
}
- /**
- * Create the binary distribution.
- */
- private void doExecute()
- throws MojoExecutionException, MojoFailureException
+ protected File createArchive( Archiver archiver, Assembly assembly, String
filename )
+ throws ArchiverException, IOException, MojoExecutionException
+ {
+ File destFile;
+ processDependencySets( archiver, assembly.getDependencySets(),
assembly.isIncludeBaseDirectory() );
+ processFileSets( archiver, assembly.getFileSets(),
assembly.isIncludeBaseDirectory() );
+
+ destFile = new File( outputDirectory, filename );
+ archiver.setDestFile( destFile );
+ archiver.createArchive();
+
+ return destFile;
+ }
+
+ protected Assembly readAssembly()
+ throws MojoFailureException, MojoExecutionException
{
Reader r;
@@ -184,43 +225,7 @@
{
IOUtil.close( r );
}
-
- // TODO: include dependencies marked for distribution under certain
formats
- // TODO: how, might we plug this into an installer, such as NSIS?
- // TODO: allow file mode specifications?
-
- String fullName = finalName + "-" + assembly.getId();
-
- for ( Iterator i = assembly.getFormats().iterator(); i.hasNext(); )
- {
- String format = (String) i.next();
-
- String filename = fullName + "." + format;
-
- File destFile = null;
- try
- {
- // TODO: use component roles? Can we do that in a mojo?
- Archiver archiver = createArchiver( format );
-
- processDependencySets( archiver, assembly.getDependencySets(),
assembly.isIncludeBaseDirectory() );
- processFileSets( archiver, assembly.getFileSets(),
assembly.isIncludeBaseDirectory() );
-
- destFile = new File( outputDirectory, filename );
- archiver.setDestFile( destFile );
- archiver.createArchive();
- }
- catch ( ArchiverException e )
- {
- throw new MojoExecutionException( "Error creating assembly", e
);
- }
- catch ( IOException e )
- {
- throw new MojoExecutionException( "Error creating assembly", e
);
- }
-
- projectHelper.attachArtifact( project, format, format +
"-assembly", destFile );
- }
+ return assembly;
}
/**
@@ -230,7 +235,7 @@
* @param dependencySets
* @param includeBaseDirectory
*/
- private void processDependencySets( Archiver archiver, List
dependencySets, boolean includeBaseDirectory )
+ protected void processDependencySets( Archiver archiver, List
dependencySets, boolean includeBaseDirectory )
throws ArchiverException, IOException, MojoExecutionException
{
for ( Iterator i = dependencySets.iterator(); i.hasNext(); )
@@ -310,7 +315,7 @@
* @param includeBaseDirecetory
* @throws ArchiverException
*/
- private void processFileSets( Archiver archiver, List fileSets, boolean
includeBaseDirecetory )
+ protected void processFileSets( Archiver archiver, List fileSets, boolean
includeBaseDirecetory )
throws ArchiverException
{
for ( Iterator i = fileSets.iterator(); i.hasNext(); )
Added:
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java
URL:
http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java?rev=293366&view=auto
==============================================================================
---
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java
(added)
+++
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java
Mon Oct 3 08:19:13 2005
@@ -0,0 +1,62 @@
+package org.apache.maven.plugin.assembly;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.assembly.archiver.DirectoryArchiver;
+import org.apache.maven.plugins.assembly.model.Assembly;
+import org.codehaus.plexus.archiver.Archiver;
+import org.codehaus.plexus.archiver.ArchiverException;
+
+import java.io.IOException;
+
+/**
+ * Assemble an application bundle or distribution.
+ *
+ * @goal directory
+ * @requiresDependencyResolution test
+ * @requiresDirectInvocation
+ * @execute phase="package"
+ */
+public class DirectoryMojo
+ extends AssemblyMojo
+{
+ public void execute()
+ throws MojoExecutionException, MojoFailureException
+ {
+ Assembly assembly = readAssembly();
+
+ String fullName = finalName + "-" + assembly.getId();
+
+ try
+ {
+ Archiver archiver = new DirectoryArchiver();
+
+ createArchive( archiver, assembly, fullName );
+ }
+ catch ( ArchiverException e )
+ {
+ throw new MojoExecutionException( "Error creating assembly", e );
+ }
+ catch ( IOException e )
+ {
+ throw new MojoExecutionException( "Error creating assembly", e );
+ }
+ }
+
+}
Propchange:
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added:
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archiver/DirectoryArchiver.java
URL:
http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archiver/DirectoryArchiver.java?rev=293366&view=auto
==============================================================================
---
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archiver/DirectoryArchiver.java
(added)
+++
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archiver/DirectoryArchiver.java
Mon Oct 3 08:19:13 2005
@@ -0,0 +1,186 @@
+package org.apache.maven.plugin.assembly.archiver;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.codehaus.plexus.archiver.AbstractArchiver;
+import org.codehaus.plexus.archiver.ArchiveEntry;
+import org.codehaus.plexus.archiver.ArchiverException;
+
+/**
+ * A plexus archiver implementation that stores the files to archive in a
+ * directory.
+ */
+public class DirectoryArchiver
+ extends AbstractArchiver
+{
+
+ public void createArchive()
+ throws ArchiverException, IOException
+ {
+ //Most of this method was copied from
org.codehaus.plexus.archiver.tar.TarArchiver
+ //and modified to store files in a directory, not a tar archive.
+ Map listFiles = getFiles();
+ if ( listFiles == null || listFiles.size() == 0 )
+ {
+ new ArchiverException( "You must set at least one
file." );
+ }
+
+ File destDirectory = getDestFile();
+ if ( destDirectory == null )
+ {
+ new ArchiverException( "You must set the destination
directory." );
+ }
+ if ( destDirectory.exists() && !destDirectory.isDirectory() )
+ {
+ new ArchiverException( destDirectory + " isn't a
directory." );
+ }
+ if ( destDirectory.exists() && !destDirectory.canWrite() )
+ {
+ new ArchiverException( destDirectory + " is read-only."
);
+ }
+
+ // Check if we don't add directory file in itself
+ for ( Iterator iter = getFiles().keySet().iterator();
iter.hasNext(); )
+ {
+ String fileName = ( String ) iter.next();
+ ArchiveEntry fileToAdd = ( ArchiveEntry )
getFiles().get( fileName );
+ if ( destDirectory.equals( fileToAdd.getFile() ) )
+ {
+ throw new ArchiverException(
+ "The destination directory
cannot include itself.");
+ }
+ }
+
+ getLogger().info( "Building assembly directory : " +
destDirectory.getAbsolutePath() );
+
+ try
+ {
+ for ( Iterator iter = getFiles().keySet().iterator();
iter.hasNext(); )
+ {
+ String fileName = ( String ) iter.next();
+ ArchiveEntry f = ( ArchiveEntry )
getFiles().get( fileName );
+ String destDir =
destDirectory.getCanonicalPath();
+ fileName = destDir + File.separator + fileName;
+ copyFile( f, fileName );
+ }
+ }
+ catch ( IOException ioe )
+ {
+ String message = "Problem copying files : " +
ioe.getMessage();
+ throw new ArchiverException( message, ioe );
+ }
+ }
+
+ /**
+ * Copies the specified file to the specified path, creating any
ancestor directory
+ * structure as necessary.
+ *
+ * @param file The file to copy (IOException will be thrown if this
does not exist)
+ * @param vPath The fully qualified path to copy the file to.
+ * @throws ArchiverException If there is a problem creating the
directory structure
+ * @throws IOException If there is a problem copying the file
+ */
+ protected void copyFile( ArchiveEntry entry, String vPath )
+ throws ArchiverException, IOException
+ {
+ // don't add "" to the archive
+ if ( vPath.length() <= 0 )
+ {
+ return;
+ }
+
+ File inFile = entry.getFile();
+ File outFile = new File( vPath );
+
+ if ( outFile.exists() && outFile.lastModified() >=
inFile.lastModified() )
+ {
+ //already up to date...
+ return;
+ }
+
+ outFile.setLastModified( inFile.lastModified() );
+
+ if ( ! inFile.isDirectory() )
+ {
+ if ( ! outFile.getParentFile().exists() )
+ {
+ //create the parent directory...
+ if ( ! outFile.getParentFile().mkdirs() )
+ {
+ //Failure, unable to create specified
directory for some unknown reason.
+ throw new ArchiverException ("Unable to
create directory or parent directory of "
+ +
outFile );
+ }
+ }
+ FileInputStream fIn = new FileInputStream( inFile );
+ FileOutputStream fout = new FileOutputStream( outFile );
+ try
+ {
+ byte[] buffer = new byte[ 8 * 1024 ];
+ int count = 0;
+ do
+ {
+ fout.write( buffer, 0, count );
+ count = fIn.read( buffer, 0,
buffer.length );
+ }
+ while ( count != -1 );
+ }
+ finally
+ {
+ try
+ {
+ fIn.close();
+ }
+ catch ( IOException ioe )
+ {
+ fout.close();
+ throw ioe;
+ }
+ fout.close();
+ }
+ }
+ else
+ { //file is a directory
+ if ( outFile.exists() )
+ {
+ if ( ! outFile.isDirectory() )
+ {
+ //should we just delete the file and
replace it with a directory?
+ //throw an exception, let the user
delete the file manually.
+ throw new ArchiverException(
+ "Expected directory and
found file at copy destination of "
+ +
inFile + " to " + outFile );
+ }
+ }
+ else if ( ! outFile.mkdirs() )
+ {
+ //Failure, unable to create specified directory
for some unknown reason.
+ throw new ArchiverException(
+ "Unable to create directory or
parent directory of "
+ + outFile );
+ }
+
+ }
+ }
+}
\ No newline at end of file
Propchange:
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archiver/DirectoryArchiver.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archiver/DirectoryArchiver.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]