blob: 42e2f2e1a8dc59aa1539710084d3dee37489e792 [file] [log] [blame]
package org.apache.maven.wagon.providers.file;
/*
* 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 java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;
import org.apache.maven.wagon.ConnectionException;
import org.apache.maven.wagon.InputData;
import org.apache.maven.wagon.LazyFileOutputStream;
import org.apache.maven.wagon.OutputData;
import org.apache.maven.wagon.ResourceDoesNotExistException;
import org.apache.maven.wagon.StreamWagon;
import org.apache.maven.wagon.TransferFailedException;
import org.apache.maven.wagon.authorization.AuthorizationException;
import org.apache.maven.wagon.resource.Resource;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.StringUtils;
/**
* Wagon Provider for Local File System
*
* @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id$
* @plexus.component role="org.apache.maven.wagon.Wagon" role-hint="file" instantiation-strategy="per-lookup"
*/
public class FileWagon
extends StreamWagon
{
public void fillInputData( InputData inputData )
throws TransferFailedException, ResourceDoesNotExistException
{
if ( getRepository().getBasedir() == null )
{
throw new TransferFailedException( "Unable to operate with a null basedir." );
}
Resource resource = inputData.getResource();
File file = new File( getRepository().getBasedir(), resource.getName() );
if ( !file.exists() )
{
throw new ResourceDoesNotExistException( "File: " + file + " does not exist" );
}
try
{
InputStream in = new BufferedInputStream( new FileInputStream( file ) );
inputData.setInputStream( in );
resource.setContentLength( file.length() );
resource.setLastModified( file.lastModified() );
}
catch ( FileNotFoundException e )
{
throw new TransferFailedException( "Could not read from file: " + file.getAbsolutePath(), e );
}
}
public void fillOutputData( OutputData outputData )
throws TransferFailedException
{
if ( getRepository().getBasedir() == null )
{
throw new TransferFailedException( "Unable to operate with a null basedir." );
}
Resource resource = outputData.getResource();
File file = new File( getRepository().getBasedir(), resource.getName() );
createParentDirectories( file );
OutputStream outputStream = new BufferedOutputStream( new LazyFileOutputStream( file ) );
outputData.setOutputStream( outputStream );
}
protected void openConnectionInternal()
throws ConnectionException
{
if ( getRepository() == null )
{
throw new ConnectionException( "Unable to operate with a null repository." );
}
if ( getRepository().getBasedir() == null )
{
// This condition is possible when using wagon-file under integration testing conditions.
fireSessionDebug( "Using a null basedir." );
return;
}
// Check the File repository exists
File basedir = new File( getRepository().getBasedir() );
if ( !basedir.exists() )
{
if ( !basedir.mkdirs() )
{
throw new ConnectionException( "Repository path " + basedir + " does not exist, and cannot be created." );
}
}
if ( !basedir.canRead() )
{
throw new ConnectionException( "Repository path " + basedir + " cannot be read" );
}
}
public void closeConnection()
{
}
public boolean supportsDirectoryCopy()
{
// TODO: should we test for null basedir here?
return true;
}
public void putDirectory( File sourceDirectory, String destinationDirectory )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
if ( getRepository().getBasedir() == null )
{
throw new TransferFailedException( "Unable to putDirectory() with a null basedir." );
}
File path = resolveDestinationPath( destinationDirectory );
try
{
/*
* Done to address issue found in HP-UX with regards to "." directory references. Details found in ..
* WAGON-30 - wagon-file failed when used by maven-site-plugin WAGON-33 - FileWagon#putDirectory() fails in
* HP-UX if destinationDirectory is "."
* http://www.nabble.com/With-maven-2.0.2-site%3Adeploy-doesn%27t-work-t934716.html for details. Using
* path.getCanonicalFile() ensures that the path is fully resolved before an attempt to create it. TODO:
* consider moving this to FileUtils.mkdirs()
*/
File realFile = path.getCanonicalFile();
realFile.mkdirs();
}
catch ( IOException e )
{
// Fall back to standard way if getCanonicalFile() fails.
path.mkdirs();
}
if ( !path.exists() || !path.isDirectory() )
{
String emsg = "Could not make directory '" + path.getAbsolutePath() + "'.";
// Add assistive message in case of failure.
File basedir = new File( getRepository().getBasedir() );
if ( !basedir.canWrite() )
{
emsg += " The base directory " + basedir + " is read-only.";
}
throw new TransferFailedException( emsg );
}
try
{
FileUtils.copyDirectoryStructure( sourceDirectory, path );
}
catch ( IOException e )
{
throw new TransferFailedException( "Error copying directory structure", e );
}
}
private File resolveDestinationPath( String destinationPath )
{
String basedir = getRepository().getBasedir();
destinationPath = StringUtils.replace( destinationPath, "\\", "/" );
File path;
if ( destinationPath.equals( "." ) )
{
path = new File( basedir );
}
else
{
path = new File( basedir, destinationPath );
}
return path;
}
public List getFileList( String destinationDirectory )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
if ( getRepository().getBasedir() == null )
{
throw new TransferFailedException( "Unable to getFileList() with a null basedir." );
}
File path = resolveDestinationPath( destinationDirectory );
if ( !path.exists() )
{
throw new ResourceDoesNotExistException( "Directory does not exist: " + destinationDirectory );
}
if ( !path.isDirectory() )
{
throw new ResourceDoesNotExistException( "Path is not a directory: " + destinationDirectory );
}
String files[] = path.list();
return Arrays.asList( files );
}
public boolean resourceExists( String resourceName )
throws TransferFailedException, AuthorizationException
{
if ( getRepository().getBasedir() == null )
{
throw new TransferFailedException( "Unable to getFileList() with a null basedir." );
}
File file = resolveDestinationPath( resourceName );
return file.exists();
}
}