blob: 5773cf0d2ef32530f015e82fedabe7993e5c09ad [file] [log] [blame]
package org.apache.maven.wagon;
/*
* 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.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.maven.wagon.authorization.AuthorizationException;
import org.apache.maven.wagon.events.TransferEvent;
import org.apache.maven.wagon.resource.Resource;
/**
* Base class for wagon which provide stream based API.
*
* @author <a href="mailto:michal@codehaus.org">Michal Maczka</a>
*
*/
public abstract class StreamWagon
extends AbstractWagon
implements StreamingWagon
{
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
public abstract void fillInputData( InputData inputData )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException;
public abstract void fillOutputData( OutputData outputData )
throws TransferFailedException;
public abstract void closeConnection()
throws ConnectionException;
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
public void get( String resourceName, File destination )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
getIfNewer( resourceName, destination, 0 );
}
protected void checkInputStream( InputStream is, Resource resource )
throws TransferFailedException
{
if ( is == null )
{
TransferFailedException e =
new TransferFailedException( getRepository().getUrl()
+ " - Could not open input stream for resource: '" + resource + "'" );
fireTransferError( resource, e, TransferEvent.REQUEST_GET );
throw e;
}
}
public boolean getIfNewer( String resourceName, File destination, long timestamp )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
boolean retValue = false;
Resource resource = new Resource( resourceName );
fireGetInitiated( resource, destination );
resource.setLastModified( timestamp );
InputStream is = getInputStream( resource );
// always get if timestamp is 0 (ie, target doesn't exist), otherwise only if older than the remote file
if ( timestamp == 0 || timestamp < resource.getLastModified() )
{
retValue = true;
checkInputStream( is, resource );
getTransfer( resource, destination, is );
}
else
{
try
{
if ( is != null )
{
is.close();
}
}
catch ( final IOException e )
{
throw new TransferFailedException( "Failure transferring " + resourceName, e );
}
}
return retValue;
}
protected InputStream getInputStream( Resource resource )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
InputData inputData = new InputData();
inputData.setResource( resource );
try
{
fillInputData( inputData );
}
catch ( TransferFailedException e )
{
fireTransferError( resource, e, TransferEvent.REQUEST_GET );
cleanupGetTransfer( resource );
throw e;
}
catch ( ResourceDoesNotExistException e )
{
fireTransferError( resource, e, TransferEvent.REQUEST_GET );
cleanupGetTransfer( resource );
throw e;
}
catch ( AuthorizationException e )
{
fireTransferError( resource, e, TransferEvent.REQUEST_GET );
cleanupGetTransfer( resource );
throw e;
}
finally
{
if ( inputData.getInputStream() == null )
{
cleanupGetTransfer( resource );
}
}
return inputData.getInputStream();
}
// source doesn't exist exception
public void put( File source, String resourceName )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
Resource resource = new Resource( resourceName );
firePutInitiated( resource, source );
resource.setContentLength( source.length() );
resource.setLastModified( source.lastModified() );
OutputStream os = getOutputStream( resource );
checkOutputStream( resource, os );
putTransfer( resource, source, os, true );
}
protected void checkOutputStream( Resource resource, OutputStream os )
throws TransferFailedException
{
if ( os == null )
{
TransferFailedException e =
new TransferFailedException( getRepository().getUrl()
+ " - Could not open output stream for resource: '" + resource + "'" );
fireTransferError( resource, e, TransferEvent.REQUEST_PUT );
throw e;
}
}
protected OutputStream getOutputStream( Resource resource )
throws TransferFailedException
{
OutputData outputData = new OutputData();
outputData.setResource( resource );
try
{
fillOutputData( outputData );
}
catch ( TransferFailedException e )
{
fireTransferError( resource, e, TransferEvent.REQUEST_PUT );
throw e;
}
finally
{
if ( outputData.getOutputStream() == null )
{
cleanupPutTransfer( resource );
}
}
return outputData.getOutputStream();
}
public boolean getIfNewerToStream( String resourceName, OutputStream stream, long timestamp )
throws ResourceDoesNotExistException, TransferFailedException, AuthorizationException
{
boolean retValue = false;
Resource resource = new Resource( resourceName );
fireGetInitiated( resource, null );
InputStream is = getInputStream( resource );
// always get if timestamp is 0 (ie, target doesn't exist), otherwise only if older than the remote file
if ( timestamp == 0 || timestamp < resource.getLastModified() )
{
retValue = true;
checkInputStream( is, resource );
fireGetStarted( resource, null );
getTransfer( resource, stream, is, true, Integer.MAX_VALUE );
fireGetCompleted( resource, null );
}
else
{
try
{
if ( is != null )
{
is.close();
}
}
catch ( final IOException e )
{
throw new TransferFailedException( "Failure transferring " + resourceName, e );
}
}
return retValue;
}
public void getToStream( String resourceName, OutputStream stream )
throws ResourceDoesNotExistException, TransferFailedException, AuthorizationException
{
getIfNewerToStream( resourceName, stream, 0 );
}
public void putFromStream( InputStream stream, String destination )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
Resource resource = new Resource( destination );
firePutInitiated( resource, null );
putFromStream( stream, resource );
}
public void putFromStream( InputStream stream, String destination, long contentLength, long lastModified )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
Resource resource = new Resource( destination );
firePutInitiated( resource, null );
resource.setContentLength( contentLength );
resource.setLastModified( lastModified );
putFromStream( stream, resource );
}
protected void putFromStream( InputStream stream, Resource resource )
throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException
{
OutputStream os = getOutputStream( resource );
checkOutputStream( resource, os );
firePutStarted( resource, null );
putTransfer( resource, stream, os, true );
firePutCompleted( resource, null );
}
}