| package org.apache.maven.plugins.assembly.archive.task; |
| |
| /* |
| * 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. |
| */ |
| |
| import org.apache.maven.plugins.assembly.AssemblerConfigurationSource; |
| import org.apache.maven.plugins.assembly.archive.ArchiveCreationException; |
| import org.apache.maven.plugins.assembly.format.AssemblyFormattingException; |
| import org.apache.maven.plugins.assembly.format.ReaderFormatter; |
| import org.apache.maven.plugins.assembly.model.FileSet; |
| import org.apache.maven.plugins.assembly.utils.AssemblyFormatUtils; |
| import org.apache.maven.plugins.assembly.utils.TypeConversionUtils; |
| import org.apache.maven.project.MavenProject; |
| import org.codehaus.plexus.archiver.Archiver; |
| import org.codehaus.plexus.components.io.functions.InputStreamTransformer; |
| import org.codehaus.plexus.logging.Logger; |
| import org.codehaus.plexus.logging.console.ConsoleLogger; |
| |
| import java.io.File; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| /** |
| * @version $Id$ |
| */ |
| public class AddFileSetsTask |
| { |
| |
| private final List<FileSet> fileSets; |
| |
| private Logger logger; |
| |
| private MavenProject project; |
| |
| private MavenProject moduleProject; |
| |
| public AddFileSetsTask( final List<FileSet> fileSets ) |
| { |
| this.fileSets = fileSets; |
| } |
| |
| public AddFileSetsTask( final FileSet... fileSets ) |
| { |
| this.fileSets = new ArrayList<FileSet>( Arrays.asList( fileSets ) ); |
| } |
| |
| public void execute( final Archiver archiver, final AssemblerConfigurationSource configSource ) |
| throws ArchiveCreationException, AssemblyFormattingException |
| { |
| // don't need this check here. it's more efficient here, but the logger is not actually |
| // used until addFileSet(..)...and the check should be there in case someone extends the |
| // class. |
| // checkLogger(); |
| |
| final File archiveBaseDir = configSource.getArchiveBaseDirectory(); |
| |
| if ( archiveBaseDir != null ) |
| { |
| if ( !archiveBaseDir.exists() ) |
| { |
| throw new ArchiveCreationException( |
| "The archive base directory '" + archiveBaseDir.getAbsolutePath() + "' does not exist" ); |
| } |
| else if ( !archiveBaseDir.isDirectory() ) |
| { |
| throw new ArchiveCreationException( "The archive base directory '" + archiveBaseDir.getAbsolutePath() |
| + "' exists, but it is not a directory" ); |
| } |
| } |
| |
| for ( final FileSet fileSet : fileSets ) |
| { |
| addFileSet( fileSet, archiver, configSource, archiveBaseDir ); |
| } |
| } |
| |
| void addFileSet( final FileSet fileSet, final Archiver archiver, final AssemblerConfigurationSource configSource, |
| final File archiveBaseDir ) |
| throws AssemblyFormattingException, ArchiveCreationException |
| { |
| // throw this check in just in case someone extends this class... |
| checkLogger(); |
| |
| if ( project == null ) |
| { |
| project = configSource.getProject(); |
| } |
| |
| final File basedir = project.getBasedir(); |
| |
| String destDirectory = fileSet.getOutputDirectory(); |
| |
| if ( destDirectory == null ) |
| { |
| destDirectory = fileSet.getDirectory(); |
| } |
| |
| AssemblyFormatUtils.warnForPlatformSpecifics( logger, destDirectory ); |
| |
| destDirectory = |
| AssemblyFormatUtils.getOutputDirectory( destDirectory, configSource.getFinalName(), configSource, |
| AssemblyFormatUtils.moduleProjectInterpolator( moduleProject ), |
| AssemblyFormatUtils.artifactProjectInterpolator( project ) ); |
| |
| if ( logger.isDebugEnabled() ) |
| { |
| logger.debug( "FileSet[" + destDirectory + "]" + " dir perms: " + Integer.toString( |
| archiver.getOverrideDirectoryMode(), 8 ) + " file perms: " + Integer.toString( |
| archiver.getOverrideFileMode(), 8 ) + ( fileSet.getLineEnding() == null |
| ? "" |
| : " lineEndings: " + fileSet.getLineEnding() ) ); |
| } |
| |
| logger.debug( "The archive base directory is '" + archiveBaseDir + "'" ); |
| |
| File fileSetDir = getFileSetDirectory( fileSet, basedir, archiveBaseDir ); |
| |
| if ( fileSetDir.exists() ) |
| { |
| InputStreamTransformer fileSetTransformers = |
| ReaderFormatter.getFileSetTransformers( configSource, fileSet.isFiltered(), fileSet.getLineEnding() ); |
| if ( fileSetTransformers == null ) |
| { |
| logger.debug( "NOT reformatting any files in " + fileSetDir ); |
| } |
| |
| if ( fileSetDir.getPath().equals( File.separator ) ) |
| { |
| throw new AssemblyFormattingException( |
| "Your assembly descriptor specifies a directory of " + File.separator |
| + ", which is your *entire* file system.\nThese are not the files you are looking for" ); |
| } |
| final AddDirectoryTask task = new AddDirectoryTask( fileSetDir, fileSetTransformers ); |
| |
| final int dirMode = TypeConversionUtils.modeToInt( fileSet.getDirectoryMode(), logger ); |
| if ( dirMode != -1 ) |
| { |
| task.setDirectoryMode( dirMode ); |
| } |
| |
| final int fileMode = TypeConversionUtils.modeToInt( fileSet.getFileMode(), logger ); |
| if ( fileMode != -1 ) |
| { |
| task.setFileMode( fileMode ); |
| } |
| |
| task.setUseDefaultExcludes( fileSet.isUseDefaultExcludes() ); |
| task.setExcludes( fileSet.getExcludes() ); |
| task.setIncludes( fileSet.getIncludes() ); |
| task.setOutputDirectory( destDirectory ); |
| |
| task.execute( archiver ); |
| } |
| } |
| |
| File getFileSetDirectory( final FileSet fileSet, final File basedir, final File archiveBaseDir ) |
| throws ArchiveCreationException, AssemblyFormattingException |
| { |
| String sourceDirectory = fileSet.getDirectory(); |
| |
| if ( sourceDirectory == null || sourceDirectory.trim().length() < 1 ) |
| { |
| sourceDirectory = basedir.getAbsolutePath(); |
| } |
| |
| File fileSetDir; |
| |
| if ( archiveBaseDir == null ) |
| { |
| fileSetDir = new File( sourceDirectory ); |
| |
| if ( !fileSetDir.isAbsolute() ) |
| { |
| fileSetDir = new File( basedir, sourceDirectory ); |
| } |
| } |
| else |
| { |
| fileSetDir = new File( archiveBaseDir, sourceDirectory ); |
| } |
| |
| return fileSetDir; |
| } |
| |
| private void checkLogger() |
| { |
| if ( logger == null ) |
| { |
| logger = new ConsoleLogger( Logger.LEVEL_INFO, "AddFileSetsTask-internal" ); |
| } |
| } |
| |
| public void setLogger( final Logger logger ) |
| { |
| this.logger = logger; |
| } |
| |
| public void setProject( final MavenProject project ) |
| { |
| this.project = project; |
| } |
| |
| public void setModuleProject( final MavenProject moduleProject ) |
| { |
| this.moduleProject = moduleProject; |
| } |
| |
| } |