com.qcloud.cos.transfer.MultipleFileTransfer Maven / Gradle / Ivy
/*
* Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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.
* According to cos feature, we modify some class,comment, field name, etc.
*/
package com.qcloud.cos.transfer;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicBoolean;
import com.qcloud.cos.event.ProgressEventType;
import com.qcloud.cos.event.ProgressListenerChain;
/**
* Interface for multiple file transfers
*/
public abstract class MultipleFileTransfer extends AbstractTransfer {
protected final Collection extends T> subTransfers;
/** Whether any of the sub-transfers has started. **/
private AtomicBoolean subTransferStarted = new AtomicBoolean(false);
MultipleFileTransfer(String description, TransferProgress transferProgress,
ProgressListenerChain progressListenerChain, Collection extends T> subTransfers) {
super(description, transferProgress, progressListenerChain);
this.subTransfers = subTransfers;
}
/**
* Set the state based on the states of all file downloads. Assumes all file
* downloads are done.
*
* A single failed sub-transfer makes the entire transfer failed. If there
* are no failed sub-transfers, a single canceled sub-transfer makes the
* entire transfer canceled. Otherwise, we consider ourselves Completed.
*/
public void collateFinalState() {
boolean seenCanceled = false;
for ( T download : subTransfers ) {
if ( download.getState() == TransferState.Failed ) {
setState(TransferState.Failed);
return;
} else if ( download.getState() == TransferState.Canceled ) {
seenCanceled = true;
}
}
if ( seenCanceled )
setState(TransferState.Canceled);
else
setState(TransferState.Completed);
}
/**
* Override this method so that TransferState updates are also sent out to the
* progress listener chain in forms of ProgressEvent.
*/
@Override
public void setState(TransferState state) {
super.setState(state);
switch (state) {
case Waiting:
fireProgressEvent(ProgressEventType.TRANSFER_PREPARING_EVENT);
break;
case InProgress:
if ( subTransferStarted.compareAndSet(false, true) ) {
/* The first InProgress signal */
fireProgressEvent(ProgressEventType.TRANSFER_STARTED_EVENT);
}
/* Don't need any event code update for subsequent InProgress signals */
break;
case Completed:
fireProgressEvent(ProgressEventType.TRANSFER_COMPLETED_EVENT);
break;
case Canceled:
fireProgressEvent(ProgressEventType.TRANSFER_CANCELED_EVENT);
break;
case Failed:
fireProgressEvent(ProgressEventType.TRANSFER_FAILED_EVENT);
break;
default:
break;
}
}
}