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 ); } }