http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java b/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java deleted file mode 100644 index 27f2285..0000000 --- a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java +++ /dev/null @@ -1,595 +0,0 @@ -package org.eclipse.aether.connector.basic; - -/* - * 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.net.URI; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import org.eclipse.aether.ConfigurationProperties; -import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.RequestTrace; -import org.eclipse.aether.repository.RemoteRepository; -import org.eclipse.aether.spi.connector.ArtifactDownload; -import org.eclipse.aether.spi.connector.ArtifactUpload; -import org.eclipse.aether.spi.connector.MetadataDownload; -import org.eclipse.aether.spi.connector.MetadataUpload; -import org.eclipse.aether.spi.connector.RepositoryConnector; -import org.eclipse.aether.spi.connector.checksum.ChecksumPolicy; -import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider; -import org.eclipse.aether.spi.connector.layout.RepositoryLayout; -import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider; -import org.eclipse.aether.spi.connector.transport.GetTask; -import org.eclipse.aether.spi.connector.transport.PeekTask; -import org.eclipse.aether.spi.connector.transport.PutTask; -import org.eclipse.aether.spi.connector.transport.Transporter; -import org.eclipse.aether.spi.connector.transport.TransporterProvider; -import org.eclipse.aether.spi.io.FileProcessor; -import org.eclipse.aether.spi.log.Logger; -import org.eclipse.aether.transfer.ChecksumFailureException; -import org.eclipse.aether.transfer.NoRepositoryConnectorException; -import org.eclipse.aether.transfer.NoRepositoryLayoutException; -import org.eclipse.aether.transfer.NoTransporterException; -import org.eclipse.aether.transfer.TransferEvent; -import org.eclipse.aether.transfer.TransferResource; -import org.eclipse.aether.util.ChecksumUtils; -import org.eclipse.aether.util.ConfigUtils; -import org.eclipse.aether.util.concurrency.RunnableErrorForwarder; -import org.eclipse.aether.util.concurrency.WorkerThreadFactory; - -/** - */ -final class BasicRepositoryConnector - implements RepositoryConnector -{ - - private static final String CONFIG_PROP_THREADS = "aether.connector.basic.threads"; - - private static final String CONFIG_PROP_RESUME = "aether.connector.resumeDownloads"; - - private static final String CONFIG_PROP_RESUME_THRESHOLD = "aether.connector.resumeThreshold"; - - private static final String CONFIG_PROP_SMART_CHECKSUMS = "aether.connector.smartChecksums"; - - private final Logger logger; - - private final FileProcessor fileProcessor; - - private final RemoteRepository repository; - - private final RepositorySystemSession session; - - private final Transporter transporter; - - private final RepositoryLayout layout; - - private final ChecksumPolicyProvider checksumPolicyProvider; - - private final PartialFile.Factory partialFileFactory; - - private final int maxThreads; - - private final boolean smartChecksums; - - private final boolean persistedChecksums; - - private Executor executor; - - private boolean closed; - - public BasicRepositoryConnector( RepositorySystemSession session, RemoteRepository repository, - TransporterProvider transporterProvider, RepositoryLayoutProvider layoutProvider, - ChecksumPolicyProvider checksumPolicyProvider, FileProcessor fileProcessor, - Logger logger ) - throws NoRepositoryConnectorException - { - try - { - layout = layoutProvider.newRepositoryLayout( session, repository ); - } - catch ( NoRepositoryLayoutException e ) - { - throw new NoRepositoryConnectorException( repository, e.getMessage(), e ); - } - try - { - transporter = transporterProvider.newTransporter( session, repository ); - } - catch ( NoTransporterException e ) - { - throw new NoRepositoryConnectorException( repository, e.getMessage(), e ); - } - this.checksumPolicyProvider = checksumPolicyProvider; - - this.session = session; - this.repository = repository; - this.fileProcessor = fileProcessor; - this.logger = logger; - - maxThreads = ConfigUtils.getInteger( session, 5, CONFIG_PROP_THREADS, "maven.artifact.threads" ); - smartChecksums = ConfigUtils.getBoolean( session, true, CONFIG_PROP_SMART_CHECKSUMS ); - persistedChecksums = - ConfigUtils.getBoolean( session, ConfigurationProperties.DEFAULT_PERSISTED_CHECKSUMS, - ConfigurationProperties.PERSISTED_CHECKSUMS ); - - boolean resumeDownloads = - ConfigUtils.getBoolean( session, true, CONFIG_PROP_RESUME + '.' + repository.getId(), CONFIG_PROP_RESUME ); - long resumeThreshold = - ConfigUtils.getLong( session, 64 * 1024, CONFIG_PROP_RESUME_THRESHOLD + '.' + repository.getId(), - CONFIG_PROP_RESUME_THRESHOLD ); - int requestTimeout = - ConfigUtils.getInteger( session, ConfigurationProperties.DEFAULT_REQUEST_TIMEOUT, - ConfigurationProperties.REQUEST_TIMEOUT + '.' + repository.getId(), - ConfigurationProperties.REQUEST_TIMEOUT ); - partialFileFactory = new PartialFile.Factory( resumeDownloads, resumeThreshold, requestTimeout, logger ); - } - - private Executor getExecutor( Collection<?> artifacts, Collection<?> metadatas ) - { - if ( maxThreads <= 1 ) - { - return DirectExecutor.INSTANCE; - } - int tasks = safe( artifacts ).size() + safe( metadatas ).size(); - if ( tasks <= 1 ) - { - return DirectExecutor.INSTANCE; - } - if ( executor == null ) - { - executor = - new ThreadPoolExecutor( maxThreads, maxThreads, 3, TimeUnit.SECONDS, - new LinkedBlockingQueue<Runnable>(), - new WorkerThreadFactory( getClass().getSimpleName() + '-' - + repository.getHost() + '-' ) ); - } - return executor; - } - - @Override - protected void finalize() - throws Throwable - { - try - { - close(); - } - finally - { - super.finalize(); - } - } - - public void close() - { - if ( !closed ) - { - closed = true; - if ( executor instanceof ExecutorService ) - { - ( (ExecutorService) executor ).shutdown(); - } - transporter.close(); - } - } - - public void get( Collection<? extends ArtifactDownload> artifactDownloads, - Collection<? extends MetadataDownload> metadataDownloads ) - { - if ( closed ) - { - throw new IllegalStateException( "connector closed" ); - } - - Executor executor = getExecutor( artifactDownloads, metadataDownloads ); - RunnableErrorForwarder errorForwarder = new RunnableErrorForwarder(); - - for ( MetadataDownload transfer : safe( metadataDownloads ) ) - { - URI location = layout.getLocation( transfer.getMetadata(), false ); - - TransferResource resource = newTransferResource( location, transfer.getFile(), transfer.getTrace() ); - TransferEvent.Builder builder = newEventBuilder( resource, false, false ); - MetadataTransportListener listener = new MetadataTransportListener( transfer, repository, builder ); - - ChecksumPolicy checksumPolicy = newChecksumPolicy( transfer.getChecksumPolicy(), resource ); - List<RepositoryLayout.Checksum> checksums = null; - if ( checksumPolicy != null ) - { - checksums = layout.getChecksums( transfer.getMetadata(), false, location ); - } - - Runnable task = new GetTaskRunner( location, transfer.getFile(), checksumPolicy, checksums, listener ); - executor.execute( errorForwarder.wrap( task ) ); - } - - for ( ArtifactDownload transfer : safe( artifactDownloads ) ) - { - URI location = layout.getLocation( transfer.getArtifact(), false ); - - TransferResource resource = newTransferResource( location, transfer.getFile(), transfer.getTrace() ); - TransferEvent.Builder builder = newEventBuilder( resource, false, transfer.isExistenceCheck() ); - ArtifactTransportListener listener = new ArtifactTransportListener( transfer, repository, builder ); - - Runnable task; - if ( transfer.isExistenceCheck() ) - { - task = new PeekTaskRunner( location, listener ); - } - else - { - ChecksumPolicy checksumPolicy = newChecksumPolicy( transfer.getChecksumPolicy(), resource ); - List<RepositoryLayout.Checksum> checksums = null; - if ( checksumPolicy != null ) - { - checksums = layout.getChecksums( transfer.getArtifact(), false, location ); - } - - task = new GetTaskRunner( location, transfer.getFile(), checksumPolicy, checksums, listener ); - } - executor.execute( errorForwarder.wrap( task ) ); - } - - errorForwarder.await(); - } - - public void put( Collection<? extends ArtifactUpload> artifactUploads, - Collection<? extends MetadataUpload> metadataUploads ) - { - if ( closed ) - { - throw new IllegalStateException( "connector closed" ); - } - - for ( ArtifactUpload transfer : safe( artifactUploads ) ) - { - URI location = layout.getLocation( transfer.getArtifact(), true ); - - TransferResource resource = newTransferResource( location, transfer.getFile(), transfer.getTrace() ); - TransferEvent.Builder builder = newEventBuilder( resource, true, false ); - ArtifactTransportListener listener = new ArtifactTransportListener( transfer, repository, builder ); - - List<RepositoryLayout.Checksum> checksums = layout.getChecksums( transfer.getArtifact(), true, location ); - - Runnable task = new PutTaskRunner( location, transfer.getFile(), checksums, listener ); - task.run(); - } - - for ( MetadataUpload transfer : safe( metadataUploads ) ) - { - URI location = layout.getLocation( transfer.getMetadata(), true ); - - TransferResource resource = newTransferResource( location, transfer.getFile(), transfer.getTrace() ); - TransferEvent.Builder builder = newEventBuilder( resource, true, false ); - MetadataTransportListener listener = new MetadataTransportListener( transfer, repository, builder ); - - List<RepositoryLayout.Checksum> checksums = layout.getChecksums( transfer.getMetadata(), true, location ); - - Runnable task = new PutTaskRunner( location, transfer.getFile(), checksums, listener ); - task.run(); - } - } - - private static <T> Collection<T> safe( Collection<T> items ) - { - return ( items != null ) ? items : Collections.<T>emptyList(); - } - - private TransferResource newTransferResource( URI path, File file, RequestTrace trace ) - { - return new TransferResource( repository.getUrl(), path.toString(), file, trace ); - } - - private TransferEvent.Builder newEventBuilder( TransferResource resource, boolean upload, boolean peek ) - { - TransferEvent.Builder builder = new TransferEvent.Builder( session, resource ); - if ( upload ) - { - builder.setRequestType( TransferEvent.RequestType.PUT ); - } - else if ( !peek ) - { - builder.setRequestType( TransferEvent.RequestType.GET ); - } - else - { - builder.setRequestType( TransferEvent.RequestType.GET_EXISTENCE ); - } - return builder; - } - - private ChecksumPolicy newChecksumPolicy( String policy, TransferResource resource ) - { - return checksumPolicyProvider.newChecksumPolicy( session, repository, resource, policy ); - } - - @Override - public String toString() - { - return String.valueOf( repository ); - } - - abstract class TaskRunner - implements Runnable - { - - protected final URI path; - - protected final TransferTransportListener<?> listener; - - public TaskRunner( URI path, TransferTransportListener<?> listener ) - { - this.path = path; - this.listener = listener; - } - - public void run() - { - try - { - listener.transferInitiated(); - runTask(); - listener.transferSucceeded(); - } - catch ( Exception e ) - { - listener.transferFailed( e, transporter.classify( e ) ); - } - } - - protected abstract void runTask() - throws Exception; - - } - - class PeekTaskRunner - extends TaskRunner - { - - public PeekTaskRunner( URI path, TransferTransportListener<?> listener ) - { - super( path, listener ); - } - - protected void runTask() - throws Exception - { - transporter.peek( new PeekTask( path ) ); - } - - } - - class GetTaskRunner - extends TaskRunner - implements PartialFile.RemoteAccessChecker, ChecksumValidator.ChecksumFetcher - { - - private final File file; - - private final ChecksumValidator checksumValidator; - - public GetTaskRunner( URI path, File file, ChecksumPolicy checksumPolicy, - List<RepositoryLayout.Checksum> checksums, TransferTransportListener<?> listener ) - { - super( path, listener ); - this.file = file; - checksumValidator = - new ChecksumValidator( logger, file, fileProcessor, this, checksumPolicy, safe( checksums ) ); - } - - public void checkRemoteAccess() - throws Exception - { - transporter.peek( new PeekTask( path ) ); - } - - public boolean fetchChecksum( URI remote, File local ) - throws Exception - { - try - { - transporter.get( new GetTask( remote ).setDataFile( local ) ); - } - catch ( Exception e ) - { - if ( transporter.classify( e ) == Transporter.ERROR_NOT_FOUND ) - { - return false; - } - throw e; - } - return true; - } - - protected void runTask() - throws Exception - { - if ( file == null ) - { - throw new IllegalArgumentException( "destination file has not been specified" ); - } - fileProcessor.mkdirs( file.getParentFile() ); - - PartialFile partFile = partialFileFactory.newInstance( file, this ); - if ( partFile == null ) - { - logger.debug( "Concurrent download of " + file + " just finished, skipping download" ); - return; - } - - try - { - File tmp = partFile.getFile(); - listener.setChecksumCalculator( checksumValidator.newChecksumCalculator( tmp ) ); - for ( int firstTrial = 0, lastTrial = 1, trial = firstTrial;; trial++ ) - { - boolean resume = partFile.isResume() && trial <= firstTrial; - GetTask task = new GetTask( path ).setDataFile( tmp, resume ).setListener( listener ); - transporter.get( task ); - try - { - checksumValidator.validate( listener.getChecksums(), smartChecksums ? task.getChecksums() - : null ); - break; - } - catch ( ChecksumFailureException e ) - { - boolean retry = trial < lastTrial && e.isRetryWorthy(); - if ( !retry && !checksumValidator.handle( e ) ) - { - throw e; - } - listener.transferCorrupted( e ); - if ( retry ) - { - checksumValidator.retry(); - } - else - { - break; - } - } - } - fileProcessor.move( tmp, file ); - if ( persistedChecksums ) - { - checksumValidator.commit(); - } - } - finally - { - partFile.close(); - checksumValidator.close(); - } - } - - } - - class PutTaskRunner - extends TaskRunner - { - - private final File file; - - private final Collection<RepositoryLayout.Checksum> checksums; - - public PutTaskRunner( URI path, File file, List<RepositoryLayout.Checksum> checksums, - TransferTransportListener<?> listener ) - { - super( path, listener ); - this.file = file; - this.checksums = safe( checksums ); - } - - protected void runTask() - throws Exception - { - if ( file == null ) - { - throw new IllegalArgumentException( "source file has not been specified" ); - } - transporter.put( new PutTask( path ).setDataFile( file ).setListener( listener ) ); - uploadChecksums( file, path ); - } - - private void uploadChecksums( File file, URI location ) - { - if ( checksums.isEmpty() ) - { - return; - } - try - { - Set<String> algos = new HashSet<String>(); - for ( RepositoryLayout.Checksum checksum : checksums ) - { - algos.add( checksum.getAlgorithm() ); - } - Map<String, Object> sumsByAlgo = ChecksumUtils.calc( file, algos ); - for ( RepositoryLayout.Checksum checksum : checksums ) - { - uploadChecksum( checksum.getLocation(), sumsByAlgo.get( checksum.getAlgorithm() ) ); - } - } - catch ( IOException e ) - { - String msg = "Failed to upload checksums for " + file + ": " + e.getMessage(); - if ( logger.isDebugEnabled() ) - { - logger.warn( msg, e ); - } - else - { - logger.warn( msg ); - } - } - } - - private void uploadChecksum( URI location, Object checksum ) - { - try - { - if ( checksum instanceof Exception ) - { - throw (Exception) checksum; - } - transporter.put( new PutTask( location ).setDataString( (String) checksum ) ); - } - catch ( Exception e ) - { - String msg = "Failed to upload checksum " + location + ": " + e.getMessage(); - if ( logger.isDebugEnabled() ) - { - logger.warn( msg, e ); - } - else - { - logger.warn( msg ); - } - } - } - - } - - private static class DirectExecutor - implements Executor - { - - static final Executor INSTANCE = new DirectExecutor(); - - public void execute( Runnable command ) - { - command.run(); - } - - } - -}
http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory.java ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory.java b/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory.java deleted file mode 100644 index 8338daf..0000000 --- a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory.java +++ /dev/null @@ -1,193 +0,0 @@ -package org.eclipse.aether.connector.basic; - -/* - * 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 javax.inject.Inject; -import javax.inject.Named; - -import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.repository.RemoteRepository; -import org.eclipse.aether.spi.connector.RepositoryConnector; -import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; -import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider; -import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider; -import org.eclipse.aether.spi.connector.transport.TransporterProvider; -import org.eclipse.aether.spi.io.FileProcessor; -import org.eclipse.aether.spi.locator.Service; -import org.eclipse.aether.spi.locator.ServiceLocator; -import org.eclipse.aether.spi.log.Logger; -import org.eclipse.aether.spi.log.LoggerFactory; -import org.eclipse.aether.spi.log.NullLoggerFactory; -import org.eclipse.aether.transfer.NoRepositoryConnectorException; - -/** - * A repository connector factory that employs pluggable - * {@link org.eclipse.aether.spi.connector.transport.TransporterFactory transporters} and - * {@link org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory repository layouts} for the transfers. - */ -@Named( "basic" ) -public final class BasicRepositoryConnectorFactory - implements RepositoryConnectorFactory, Service -{ - - private Logger logger = NullLoggerFactory.LOGGER; - - private TransporterProvider transporterProvider; - - private RepositoryLayoutProvider layoutProvider; - - private ChecksumPolicyProvider checksumPolicyProvider; - - private FileProcessor fileProcessor; - - private float priority; - - /** - * Creates an (uninitialized) instance of this connector factory. <em>Note:</em> In case of manual instantiation by - * clients, the new factory needs to be configured via its various mutators before first use or runtime errors will - * occur. - */ - public BasicRepositoryConnectorFactory() - { - // enables default constructor - } - - @Inject - BasicRepositoryConnectorFactory( TransporterProvider transporterProvider, RepositoryLayoutProvider layoutProvider, - ChecksumPolicyProvider checksumPolicyProvider, FileProcessor fileProcessor, - LoggerFactory loggerFactory ) - { - setTransporterProvider( transporterProvider ); - setRepositoryLayoutProvider( layoutProvider ); - setChecksumPolicyProvider( checksumPolicyProvider ); - setFileProcessor( fileProcessor ); - setLoggerFactory( loggerFactory ); - } - - public void initService( ServiceLocator locator ) - { - setLoggerFactory( locator.getService( LoggerFactory.class ) ); - setTransporterProvider( locator.getService( TransporterProvider.class ) ); - setRepositoryLayoutProvider( locator.getService( RepositoryLayoutProvider.class ) ); - setChecksumPolicyProvider( locator.getService( ChecksumPolicyProvider.class ) ); - setFileProcessor( locator.getService( FileProcessor.class ) ); - } - - /** - * Sets the logger factory to use for this component. - * - * @param loggerFactory The logger factory to use, may be {@code null} to disable logging. - * @return This component for chaining, never {@code null}. - */ - public BasicRepositoryConnectorFactory setLoggerFactory( LoggerFactory loggerFactory ) - { - this.logger = NullLoggerFactory.getSafeLogger( loggerFactory, BasicRepositoryConnector.class ); - return this; - } - - /** - * Sets the transporter provider to use for this component. - * - * @param transporterProvider The transporter provider to use, must not be {@code null}. - * @return This component for chaining, never {@code null}. - */ - public BasicRepositoryConnectorFactory setTransporterProvider( TransporterProvider transporterProvider ) - { - if ( transporterProvider == null ) - { - throw new IllegalArgumentException( "transporter provider has not been specified" ); - } - this.transporterProvider = transporterProvider; - return this; - } - - /** - * Sets the repository layout provider to use for this component. - * - * @param layoutProvider The repository layout provider to use, must not be {@code null}. - * @return This component for chaining, never {@code null}. - */ - public BasicRepositoryConnectorFactory setRepositoryLayoutProvider( RepositoryLayoutProvider layoutProvider ) - { - if ( layoutProvider == null ) - { - throw new IllegalArgumentException( "repository layout provider has not been specified" ); - } - this.layoutProvider = layoutProvider; - return this; - } - - /** - * Sets the checksum policy provider to use for this component. - * - * @param checksumPolicyProvider The checksum policy provider to use, must not be {@code null}. - * @return This component for chaining, never {@code null}. - */ - public BasicRepositoryConnectorFactory setChecksumPolicyProvider( ChecksumPolicyProvider checksumPolicyProvider ) - { - if ( checksumPolicyProvider == null ) - { - throw new IllegalArgumentException( "checksum policy provider has not been specified" ); - } - this.checksumPolicyProvider = checksumPolicyProvider; - return this; - } - - /** - * Sets the file processor to use for this component. - * - * @param fileProcessor The file processor to use, must not be {@code null}. - * @return This component for chaining, never {@code null}. - */ - public BasicRepositoryConnectorFactory setFileProcessor( FileProcessor fileProcessor ) - { - if ( fileProcessor == null ) - { - throw new IllegalArgumentException( "file processor has not been specified" ); - } - this.fileProcessor = fileProcessor; - return this; - } - - public float getPriority() - { - return priority; - } - - /** - * Sets the priority of this component. - * - * @param priority The priority. - * @return This component for chaining, never {@code null}. - */ - public BasicRepositoryConnectorFactory setPriority( float priority ) - { - this.priority = priority; - return this; - } - - public RepositoryConnector newInstance( RepositorySystemSession session, RemoteRepository repository ) - throws NoRepositoryConnectorException - { - return new BasicRepositoryConnector( session, repository, transporterProvider, layoutProvider, - checksumPolicyProvider, fileProcessor, logger ); - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/ChecksumCalculator.java ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/ChecksumCalculator.java b/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/ChecksumCalculator.java deleted file mode 100644 index e76f8a9..0000000 --- a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/ChecksumCalculator.java +++ /dev/null @@ -1,212 +0,0 @@ -package org.eclipse.aether.connector.basic; - -/* - * 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.FileInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.eclipse.aether.spi.connector.layout.RepositoryLayout; -import org.eclipse.aether.util.ChecksumUtils; - -/** - * Calculates checksums for a downloaded file. - */ -final class ChecksumCalculator -{ - - static class Checksum - { - final String algorithm; - - final MessageDigest digest; - - Exception error; - - public Checksum( String algorithm ) - { - this.algorithm = algorithm; - MessageDigest digest = null; - try - { - digest = MessageDigest.getInstance( algorithm ); - } - catch ( NoSuchAlgorithmException e ) - { - error = e; - } - this.digest = digest; - } - - public void update( ByteBuffer buffer ) - { - if ( digest != null ) - { - digest.update( buffer ); - } - } - - public void reset() - { - if ( digest != null ) - { - digest.reset(); - error = null; - } - } - - public void error( Exception error ) - { - if ( digest != null ) - { - this.error = error; - } - } - - public Object get() - { - if ( error != null ) - { - return error; - } - return ChecksumUtils.toHexString( digest.digest() ); - } - - } - - private final List<Checksum> checksums; - - private final File targetFile; - - public static ChecksumCalculator newInstance( File targetFile, Collection<RepositoryLayout.Checksum> checksums ) - { - if ( checksums == null || checksums.isEmpty() ) - { - return null; - } - return new ChecksumCalculator( targetFile, checksums ); - } - - private ChecksumCalculator( File targetFile, Collection<RepositoryLayout.Checksum> checksums ) - { - this.checksums = new ArrayList<Checksum>(); - Set<String> algos = new HashSet<String>(); - for ( RepositoryLayout.Checksum checksum : checksums ) - { - String algo = checksum.getAlgorithm(); - if ( algos.add( algo ) ) - { - this.checksums.add( new Checksum( algo ) ); - } - } - this.targetFile = targetFile; - } - - public void init( long dataOffset ) - { - for ( Checksum checksum : checksums ) - { - checksum.reset(); - } - if ( dataOffset <= 0 ) - { - return; - } - try - { - FileInputStream fis = new FileInputStream( targetFile ); - try - { - long total = 0; - ByteBuffer buffer = ByteBuffer.allocate( 1024 * 32 ); - for ( byte[] array = buffer.array(); total < dataOffset; ) - { - int read = fis.read( array ); - if ( read < 0 ) - { - if ( total < dataOffset ) - { - throw new IOException( targetFile + " contains only " + total - + " bytes, cannot resume download from offset " + dataOffset ); - } - break; - } - total += read; - if ( total > dataOffset ) - { - read -= total - dataOffset; - } - buffer.rewind(); - buffer.limit( read ); - update( buffer ); - } - } - finally - { - try - { - fis.close(); - } - catch ( IOException e ) - { - // irrelevant - } - } - } - catch ( IOException e ) - { - for ( Checksum checksum : checksums ) - { - checksum.error( e ); - } - } - } - - public void update( ByteBuffer data ) - { - for ( Checksum checksum : checksums ) - { - data.mark(); - checksum.update( data ); - data.reset(); - } - } - - public Map<String, Object> get() - { - Map<String, Object> results = new HashMap<String, Object>(); - for ( Checksum checksum : checksums ) - { - results.put( checksum.algorithm, checksum.get() ); - } - return results; - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/ChecksumValidator.java ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/ChecksumValidator.java b/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/ChecksumValidator.java deleted file mode 100644 index 8289997..0000000 --- a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/ChecksumValidator.java +++ /dev/null @@ -1,265 +0,0 @@ -package org.eclipse.aether.connector.basic; - -/* - * 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.net.URI; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Locale; -import java.util.Map; -import java.util.UUID; - -import org.eclipse.aether.spi.connector.checksum.ChecksumPolicy; -import org.eclipse.aether.spi.connector.layout.RepositoryLayout.Checksum; -import org.eclipse.aether.spi.io.FileProcessor; -import org.eclipse.aether.spi.log.Logger; -import org.eclipse.aether.transfer.ChecksumFailureException; -import org.eclipse.aether.util.ChecksumUtils; - -/** - * Performs checksum validation for a downloaded file. - */ -final class ChecksumValidator -{ - - interface ChecksumFetcher - { - - boolean fetchChecksum( URI remote, File local ) - throws Exception; - - } - - private final Logger logger; - - private final File dataFile; - - private final Collection<File> tempFiles; - - private final FileProcessor fileProcessor; - - private final ChecksumFetcher checksumFetcher; - - private final ChecksumPolicy checksumPolicy; - - private final Collection<Checksum> checksums; - - private final Map<File, Object> checksumFiles; - - public ChecksumValidator( Logger logger, File dataFile, FileProcessor fileProcessor, - ChecksumFetcher checksumFetcher, ChecksumPolicy checksumPolicy, - Collection<Checksum> checksums ) - { - this.logger = logger; - this.dataFile = dataFile; - this.tempFiles = new HashSet<File>(); - this.fileProcessor = fileProcessor; - this.checksumFetcher = checksumFetcher; - this.checksumPolicy = checksumPolicy; - this.checksums = checksums; - checksumFiles = new HashMap<File, Object>(); - } - - public ChecksumCalculator newChecksumCalculator( File targetFile ) - { - if ( checksumPolicy != null ) - { - return ChecksumCalculator.newInstance( targetFile, checksums ); - } - return null; - } - - public void validate( Map<String, ?> actualChecksums, Map<String, ?> inlinedChecksums ) - throws ChecksumFailureException - { - if ( checksumPolicy == null ) - { - return; - } - if ( inlinedChecksums != null && validateInlinedChecksums( actualChecksums, inlinedChecksums ) ) - { - return; - } - if ( validateExternalChecksums( actualChecksums ) ) - { - return; - } - checksumPolicy.onNoMoreChecksums(); - } - - private boolean validateInlinedChecksums( Map<String, ?> actualChecksums, Map<String, ?> inlinedChecksums ) - throws ChecksumFailureException - { - for ( Map.Entry<String, ?> entry : inlinedChecksums.entrySet() ) - { - String algo = entry.getKey(); - Object calculated = actualChecksums.get( algo ); - if ( !( calculated instanceof String ) ) - { - continue; - } - - String actual = String.valueOf( calculated ); - String expected = entry.getValue().toString(); - checksumFiles.put( getChecksumFile( algo ), expected ); - - if ( !isEqualChecksum( expected, actual ) ) - { - checksumPolicy.onChecksumMismatch( algo, ChecksumPolicy.KIND_UNOFFICIAL, - new ChecksumFailureException( expected, actual ) ); - } - else if ( checksumPolicy.onChecksumMatch( algo, ChecksumPolicy.KIND_UNOFFICIAL ) ) - { - return true; - } - } - return false; - } - - private boolean validateExternalChecksums( Map<String, ?> actualChecksums ) - throws ChecksumFailureException - { - for ( Checksum checksum : checksums ) - { - String algo = checksum.getAlgorithm(); - Object calculated = actualChecksums.get( algo ); - if ( calculated instanceof Exception ) - { - checksumPolicy.onChecksumError( algo, 0, new ChecksumFailureException( (Exception) calculated ) ); - continue; - } - try - { - File checksumFile = getChecksumFile( checksum.getAlgorithm() ); - File tmp = createTempFile( checksumFile ); - try - { - if ( !checksumFetcher.fetchChecksum( checksum.getLocation(), tmp ) ) - { - continue; - } - } - catch ( Exception e ) - { - checksumPolicy.onChecksumError( algo, 0, new ChecksumFailureException( e ) ); - continue; - } - - String actual = String.valueOf( calculated ); - String expected = ChecksumUtils.read( tmp ); - checksumFiles.put( checksumFile, tmp ); - - if ( !isEqualChecksum( expected, actual ) ) - { - checksumPolicy.onChecksumMismatch( algo, 0, new ChecksumFailureException( expected, actual ) ); - } - else if ( checksumPolicy.onChecksumMatch( algo, 0 ) ) - { - return true; - } - } - catch ( IOException e ) - { - checksumPolicy.onChecksumError( algo, 0, new ChecksumFailureException( e ) ); - } - } - return false; - } - - private static boolean isEqualChecksum( String expected, String actual ) - { - return expected.equalsIgnoreCase( actual ); - } - - private File getChecksumFile( String algorithm ) - { - String ext = algorithm.replace( "-", "" ).toLowerCase( Locale.ENGLISH ); - return new File( dataFile.getPath() + '.' + ext ); - } - - private File createTempFile( File path ) - throws IOException - { - File file = - File.createTempFile( path.getName() + "-" - + UUID.randomUUID().toString().replace( "-", "" ).substring( 0, 8 ), ".tmp", path.getParentFile() ); - tempFiles.add( file ); - return file; - } - - private void clearTempFiles() - { - for ( File file : tempFiles ) - { - if ( !file.delete() && file.exists() ) - { - logger.debug( "Could not delete temorary file " + file ); - } - } - tempFiles.clear(); - } - - public void retry() - { - checksumPolicy.onTransferRetry(); - checksumFiles.clear(); - clearTempFiles(); - } - - public boolean handle( ChecksumFailureException exception ) - { - return checksumPolicy.onTransferChecksumFailure( exception ); - } - - public void commit() - { - for ( Map.Entry<File, Object> entry : checksumFiles.entrySet() ) - { - File checksumFile = entry.getKey(); - Object tmp = entry.getValue(); - try - { - if ( tmp instanceof File ) - { - fileProcessor.move( (File) tmp, checksumFile ); - tempFiles.remove( tmp ); - } - else - { - fileProcessor.write( checksumFile, String.valueOf( tmp ) ); - } - } - catch ( IOException e ) - { - logger.debug( "Failed to write checksum file " + checksumFile + ": " + e.getMessage(), e ); - } - } - checksumFiles.clear(); - } - - public void close() - { - clearTempFiles(); - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/MetadataTransportListener.java ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/MetadataTransportListener.java b/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/MetadataTransportListener.java deleted file mode 100644 index 7f8bc6d..0000000 --- a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/MetadataTransportListener.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.eclipse.aether.connector.basic; - -/* - * 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.eclipse.aether.repository.RemoteRepository; -import org.eclipse.aether.spi.connector.MetadataTransfer; -import org.eclipse.aether.spi.connector.transport.Transporter; -import org.eclipse.aether.transfer.MetadataNotFoundException; -import org.eclipse.aether.transfer.MetadataTransferException; -import org.eclipse.aether.transfer.TransferEvent; - -final class MetadataTransportListener - extends TransferTransportListener<MetadataTransfer> -{ - - private final RemoteRepository repository; - - public MetadataTransportListener( MetadataTransfer transfer, RemoteRepository repository, - TransferEvent.Builder eventBuilder ) - { - super( transfer, eventBuilder ); - this.repository = repository; - } - - @Override - public void transferFailed( Exception exception, int classification ) - { - MetadataTransferException e; - if ( classification == Transporter.ERROR_NOT_FOUND ) - { - e = new MetadataNotFoundException( getTransfer().getMetadata(), repository ); - } - else - { - e = new MetadataTransferException( getTransfer().getMetadata(), repository, exception ); - } - getTransfer().setException( e ); - super.transferFailed( e, classification ); - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/PartialFile.java ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/PartialFile.java b/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/PartialFile.java deleted file mode 100644 index ad428d4..0000000 --- a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/PartialFile.java +++ /dev/null @@ -1,301 +0,0 @@ -package org.eclipse.aether.connector.basic; - -/* - * 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.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.channels.FileLock; -import java.nio.channels.OverlappingFileLockException; -import java.util.UUID; - -import org.eclipse.aether.spi.log.Logger; - -/** - * A partially downloaded file with optional support for resume. If resume is enabled, a well-known location is used for - * the partial file in combination with a lock file to prevent concurrent requests from corrupting it (and wasting - * network bandwith). Otherwise, a (non-locked) unique temporary file is used. - */ -final class PartialFile - implements Closeable -{ - - static final String EXT_PART = ".part"; - - static final String EXT_LOCK = ".lock"; - - interface RemoteAccessChecker - { - - void checkRemoteAccess() - throws Exception; - - } - - static class LockFile - { - - private final File lockFile; - - private final FileLock lock; - - private final boolean concurrent; - - public LockFile( File partFile, int requestTimeout, RemoteAccessChecker checker, Logger logger ) - throws Exception - { - lockFile = new File( partFile.getPath() + EXT_LOCK ); - boolean[] concurrent = { false }; - lock = lock( lockFile, partFile, requestTimeout, checker, logger, concurrent ); - this.concurrent = concurrent[0]; - } - - private static FileLock lock( File lockFile, File partFile, int requestTimeout, RemoteAccessChecker checker, - Logger logger, boolean[] concurrent ) - throws Exception - { - boolean interrupted = false; - try - { - for ( long lastLength = -1, lastTime = 0;; ) - { - FileLock lock = tryLock( lockFile ); - if ( lock != null ) - { - return lock; - } - - long currentLength = partFile.length(); - long currentTime = System.currentTimeMillis(); - if ( currentLength != lastLength ) - { - if ( lastLength < 0 ) - { - concurrent[0] = true; - /* - * NOTE: We're going with the optimistic assumption that the other thread is downloading the - * file from an equivalent repository. As a bare minimum, ensure the repository we are given - * at least knows about the file and is accessible to us. - */ - checker.checkRemoteAccess(); - logger.debug( "Concurrent download of " + partFile + " in progress, awaiting completion" ); - } - lastLength = currentLength; - lastTime = currentTime; - } - else if ( requestTimeout > 0 && currentTime - lastTime > Math.max( requestTimeout, 3 * 1000 ) ) - { - throw new IOException( "Timeout while waiting for concurrent download of " + partFile - + " to progress" ); - } - - try - { - Thread.sleep( 100 ); - } - catch ( InterruptedException e ) - { - interrupted = true; - } - } - } - finally - { - if ( interrupted ) - { - Thread.currentThread().interrupt(); - } - } - } - - private static FileLock tryLock( File lockFile ) - throws IOException - { - RandomAccessFile raf = new RandomAccessFile( lockFile, "rw" ); - try - { - FileLock lock = raf.getChannel().tryLock( 0, 1, false ); - if ( lock == null ) - { - close( raf ); - } - return lock; - } - catch ( OverlappingFileLockException e ) - { - close( raf ); - return null; - } - catch ( RuntimeException e ) - { - close( raf ); - lockFile.delete(); - throw e; - } - catch ( IOException e ) - { - close( raf ); - lockFile.delete(); - throw e; - } - } - - private static void close( Closeable file ) - { - try - { - file.close(); - } - catch ( IOException e ) - { - // irrelevant - } - } - - public boolean isConcurrent() - { - return concurrent; - } - - public void close() - { - close( lock.channel() ); - lockFile.delete(); - } - - @Override - public String toString() - { - return lockFile + " - " + lock.isValid(); - } - - } - - static class Factory - { - - private final boolean resume; - - private final long resumeThreshold; - - private final int requestTimeout; - - private final Logger logger; - - public Factory( boolean resume, long resumeThreshold, int requestTimeout, Logger logger ) - { - this.resume = resume; - this.resumeThreshold = resumeThreshold; - this.requestTimeout = requestTimeout; - this.logger = logger; - } - - public PartialFile newInstance( File dstFile, RemoteAccessChecker checker ) - throws Exception - { - if ( resume ) - { - File partFile = new File( dstFile.getPath() + EXT_PART ); - - long reqTimestamp = System.currentTimeMillis(); - LockFile lockFile = new LockFile( partFile, requestTimeout, checker, logger ); - if ( lockFile.isConcurrent() && dstFile.lastModified() >= reqTimestamp - 100 ) - { - lockFile.close(); - return null; - } - try - { - if ( !partFile.createNewFile() && !partFile.isFile() ) - { - throw new IOException( partFile.exists() ? "Path exists but is not a file" : "Unknown error" ); - } - return new PartialFile( partFile, lockFile, resumeThreshold, logger ); - } - catch ( IOException e ) - { - lockFile.close(); - logger.debug( "Cannot create resumable file " + partFile.getAbsolutePath() + ": " + e ); - // fall through and try non-resumable/temporary file location - } - } - - File tempFile = - File.createTempFile( dstFile.getName() + '-' + UUID.randomUUID().toString().replace( "-", "" ), ".tmp", - dstFile.getParentFile() ); - return new PartialFile( tempFile, logger ); - } - - } - - private final File partFile; - - private final LockFile lockFile; - - private final long threshold; - - private final Logger logger; - - private PartialFile( File partFile, Logger logger ) - { - this( partFile, null, 0, logger ); - } - - private PartialFile( File partFile, LockFile lockFile, long threshold, Logger logger ) - { - this.partFile = partFile; - this.lockFile = lockFile; - this.threshold = threshold; - this.logger = logger; - } - - public File getFile() - { - return partFile; - } - - public boolean isResume() - { - return lockFile != null && partFile.length() >= threshold; - } - - public void close() - { - if ( partFile.exists() && !isResume() ) - { - if ( !partFile.delete() && partFile.exists() ) - { - logger.debug( "Could not delete temorary file " + partFile ); - } - } - if ( lockFile != null ) - { - lockFile.close(); - } - } - - @Override - public String toString() - { - return String.valueOf( getFile() ); - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/TransferTransportListener.java ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/TransferTransportListener.java b/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/TransferTransportListener.java deleted file mode 100644 index bd95577..0000000 --- a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/TransferTransportListener.java +++ /dev/null @@ -1,141 +0,0 @@ -package org.eclipse.aether.connector.basic; - -/* - * 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.nio.ByteBuffer; -import java.util.Collections; -import java.util.Map; - -import org.eclipse.aether.spi.connector.Transfer; -import org.eclipse.aether.spi.connector.transport.TransportListener; -import org.eclipse.aether.transfer.TransferCancelledException; -import org.eclipse.aether.transfer.TransferEvent; -import org.eclipse.aether.transfer.TransferEvent.EventType; -import org.eclipse.aether.transfer.TransferListener; - -class TransferTransportListener<T extends Transfer> - extends TransportListener -{ - - private final T transfer; - - private final TransferListener listener; - - private final TransferEvent.Builder eventBuilder; - - private ChecksumCalculator checksumCalculator; - - protected TransferTransportListener( T transfer, TransferEvent.Builder eventBuilder ) - { - this.transfer = transfer; - this.listener = transfer.getListener(); - this.eventBuilder = eventBuilder; - } - - protected T getTransfer() - { - return transfer; - } - - public void transferInitiated() - throws TransferCancelledException - { - if ( listener != null ) - { - eventBuilder.resetType( EventType.INITIATED ); - listener.transferInitiated( eventBuilder.build() ); - } - } - - @Override - public void transportStarted( long dataOffset, long dataLength ) - throws TransferCancelledException - { - if ( checksumCalculator != null ) - { - checksumCalculator.init( dataOffset ); - } - if ( listener != null ) - { - eventBuilder.resetType( EventType.STARTED ).setTransferredBytes( dataOffset ); - TransferEvent event = eventBuilder.build(); - event.getResource().setContentLength( dataLength ).setResumeOffset( dataOffset ); - listener.transferStarted( event ); - } - } - - @Override - public void transportProgressed( ByteBuffer data ) - throws TransferCancelledException - { - if ( checksumCalculator != null ) - { - checksumCalculator.update( data ); - } - if ( listener != null ) - { - eventBuilder.resetType( EventType.PROGRESSED ).addTransferredBytes( data.remaining() ).setDataBuffer( data ); - listener.transferProgressed( eventBuilder.build() ); - } - } - - public void transferCorrupted( Exception exception ) - throws TransferCancelledException - { - if ( listener != null ) - { - eventBuilder.resetType( EventType.CORRUPTED ).setException( exception ); - listener.transferCorrupted( eventBuilder.build() ); - } - } - - public void transferFailed( Exception exception, int classification ) - { - if ( listener != null ) - { - eventBuilder.resetType( EventType.FAILED ).setException( exception ); - listener.transferFailed( eventBuilder.build() ); - } - } - - public void transferSucceeded() - { - if ( listener != null ) - { - eventBuilder.resetType( EventType.SUCCEEDED ); - listener.transferSucceeded( eventBuilder.build() ); - } - } - - public Map<String, Object> getChecksums() - { - if ( checksumCalculator == null ) - { - return Collections.emptyMap(); - } - return checksumCalculator.get(); - } - - public void setChecksumCalculator( ChecksumCalculator checksumCalculator ) - { - this.checksumCalculator = checksumCalculator; - } - -} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/package-info.java ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/package-info.java b/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/package-info.java deleted file mode 100644 index df86897..0000000 --- a/aether-connector-basic/src/main/java/org/eclipse/aether/connector/basic/package-info.java +++ /dev/null @@ -1,24 +0,0 @@ -// CHECKSTYLE_OFF: RegexpHeader -/* - * 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. - */ -/** - * Support for downloads/uploads using remote repositories that have a URI-based content structure/layout. - */ -package org.eclipse.aether.connector.basic; - http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/site/site.xml ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/site/site.xml b/aether-connector-basic/src/site/site.xml deleted file mode 100644 index 25a0b9d..0000000 --- a/aether-connector-basic/src/site/site.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<!-- -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. ---> - -<project xmlns="http://maven.apache.org/DECORATION/1.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd" - name="Connector Basic"> - <body> - <menu name="Overview"> - <item name="Introduction" href="index.html"/> - <item name="JavaDocs" href="apidocs/index.html"/> - <item name="Source Xref" href="xref/index.html"/> - <!--item name="FAQ" href="faq.html"/--> - </menu> - - <menu ref="parent"/> - <menu ref="reports"/> - </body> -</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/3a1b8ae0/aether-connector-basic/src/test/java/org/eclipse/aether/connector/basic/ChecksumCalculatorTest.java ---------------------------------------------------------------------- diff --git a/aether-connector-basic/src/test/java/org/eclipse/aether/connector/basic/ChecksumCalculatorTest.java b/aether-connector-basic/src/test/java/org/eclipse/aether/connector/basic/ChecksumCalculatorTest.java deleted file mode 100644 index 0dc43af..0000000 --- a/aether-connector-basic/src/test/java/org/eclipse/aether/connector/basic/ChecksumCalculatorTest.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.eclipse.aether.connector.basic; - -/* - * 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 static org.junit.Assert.*; - -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.nio.ByteBuffer; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.eclipse.aether.internal.test.util.TestFileUtils; -import org.eclipse.aether.spi.connector.layout.RepositoryLayout; -import org.junit.Before; -import org.junit.Test; - -public class ChecksumCalculatorTest -{ - - private static final String SHA1 = "SHA-1"; - - private static final String MD5 = "MD5"; - - private File file; - - private ChecksumCalculator newCalculator( String... algos ) - { - List<RepositoryLayout.Checksum> checksums = new ArrayList<RepositoryLayout.Checksum>(); - for ( String algo : algos ) - { - checksums.add( new RepositoryLayout.Checksum( algo, URI.create( "irrelevant" ) ) ); - } - return ChecksumCalculator.newInstance( file, checksums ); - } - - private ByteBuffer toBuffer( String data ) - { - try - { - return ByteBuffer.wrap( data.getBytes( "UTF-8" ) ); - } - catch ( UnsupportedEncodingException e ) - { - throw new IllegalStateException( e ); - } - } - - @Before - public void init() - throws Exception - { - file = TestFileUtils.createTempFile( "Hello World!" ); - } - - @Test - public void testNoOffset() - { - ChecksumCalculator calculator = newCalculator( SHA1, MD5 ); - calculator.init( 0 ); - calculator.update( toBuffer( "Hello World!" ) ); - Map<String, Object> digests = calculator.get(); - assertNotNull( digests ); - assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) ); - assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) ); - assertEquals( 2, digests.size() ); - } - - @Test - public void testWithOffset() - { - ChecksumCalculator calculator = newCalculator( SHA1, MD5 ); - calculator.init( 6 ); - calculator.update( toBuffer( "World!" ) ); - Map<String, Object> digests = calculator.get(); - assertNotNull( digests ); - assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) ); - assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) ); - assertEquals( 2, digests.size() ); - } - - @Test - public void testWithExcessiveOffset() - { - ChecksumCalculator calculator = newCalculator( SHA1, MD5 ); - calculator.init( 100 ); - calculator.update( toBuffer( "World!" ) ); - Map<String, Object> digests = calculator.get(); - assertNotNull( digests ); - assertTrue( digests.get( SHA1 ) instanceof IOException ); - assertTrue( digests.get( MD5 ) instanceof IOException ); - assertEquals( 2, digests.size() ); - } - - @Test - public void testUnknownAlgorithm() - { - ChecksumCalculator calculator = newCalculator( "unknown", SHA1 ); - calculator.init( 0 ); - calculator.update( toBuffer( "Hello World!" ) ); - Map<String, Object> digests = calculator.get(); - assertNotNull( digests ); - assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) ); - assertTrue( digests.get( "unknown" ) instanceof NoSuchAlgorithmException ); - assertEquals( 2, digests.size() ); - } - - @Test - public void testNoInitCall() - { - ChecksumCalculator calculator = newCalculator( SHA1, MD5 ); - calculator.update( toBuffer( "Hello World!" ) ); - Map<String, Object> digests = calculator.get(); - assertNotNull( digests ); - assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) ); - assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) ); - assertEquals( 2, digests.size() ); - } - - @Test - public void testRestart() - { - ChecksumCalculator calculator = newCalculator( SHA1, MD5 ); - calculator.init( 0 ); - calculator.update( toBuffer( "Ignored" ) ); - calculator.init( 0 ); - calculator.update( toBuffer( "Hello World!" ) ); - Map<String, Object> digests = calculator.get(); - assertNotNull( digests ); - assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) ); - assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) ); - assertEquals( 2, digests.size() ); - } - - @Test - public void testRestartAfterError() - { - ChecksumCalculator calculator = newCalculator( SHA1, MD5 ); - calculator.init( 100 ); - calculator.init( 0 ); - calculator.update( toBuffer( "Hello World!" ) ); - Map<String, Object> digests = calculator.get(); - assertNotNull( digests ); - assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) ); - assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) ); - assertEquals( 2, digests.size() ); - } - -}