Class AbstractRetrieveFileTransfer
- All Implemented Interfaces:
org.eclipse.core.runtime.IAdaptable
,IIdentifiable
,IFileTransfer
,IFileTransferPausable
,IIncomingFileTransfer
,IRetrieveFileTransferContainerAdapter
,IRetrieveFileTransfer
- Direct Known Subclasses:
HttpClientRetrieveFileTransfer
,HttpClientRetrieveFileTransfer
,UrlConnectionRetrieveFileTransfer
-
Field Summary
Modifier and TypeFieldDescriptionprotected int
protected long
protected static final int
protected boolean
protected IConnectContext
static final int
protected boolean
protected double
protected Exception
protected long
protected org.eclipse.core.runtime.jobs.Job
protected Object
protected long
protected IFileTransferListener
protected OutputStream
protected Map
protected boolean
protected static final int
protected Proxy
protected IFileRangeSpecification
protected static final int
protected InputStream
protected IFileID
protected URL
protected Map
protected static final int
protected long
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
cancel()
Cancel this file transfer.protected String
protected String
protected abstract boolean
doPause()
Subclass overridable version ofpause()
.protected abstract boolean
doResume()
Subclass overridable version ofresume()
.protected void
protected void
protected void
protected void
protected void
<T> T
getAdapter
(Class<T> adapter) long
Get number of bytes received so far.Get any exception associated with this file transfer.long
Return resulting file length (in bytes) for this file transfer instance.Get file range specification for this incoming file transfer instance.protected org.eclipse.core.runtime.IStatus
getFinalStatus
(Throwable exception1) getID()
Return the ID for this 'identifiable' object.Get listener assigned to this incoming file transfer.protected Map
double
Get the percent complete for this file transfer.Obtains the name of the remote file if possible.protected URL
Obtains the timestamp that reflects the time when the remote file was last modified if possible.Get namespace to be used for creation of remoteFileID for retrieve request.protected int
protected int
protected void
handleReceivedData
(byte[] buf, int bytes, double factor, org.eclipse.core.runtime.IProgressMonitor monitor) protected void
protected boolean
boolean
isDone()
Return true if this file transfer is done, false if not yet completed.boolean
isPaused()
protected UserCancelledException
protected abstract void
Open incoming and outgoing streams associated with this file transfer.boolean
pause()
Pause file transfer.protected void
boolean
resume()
Resume file transfer after having been paused.protected org.eclipse.core.net.proxy.IProxyData
selectProxyFromProxies
(String protocol, org.eclipse.core.net.proxy.IProxyData[] proxies) Select a single proxy from a set of proxies available for the given host.void
sendRetrieveRequest
(IFileID rFileID, IFileRangeSpecification rangeSpec, IFileTransferListener transferListener, Map ops) Send request for transfer of a remote file to local file storage.void
sendRetrieveRequest
(IFileID remoteFileID1, IFileTransferListener transferListener, Map options1) Send request for transfer of a remote file to local file storage.protected void
setCloseOutputStream
(boolean close) void
setConnectContextForAuthentication
(IConnectContext connectContext) Set connect context for authentication upon subsequentIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
.protected void
setDone
(boolean done) protected void
protected void
protected void
protected void
setFileLength
(long length) protected void
protected void
setLastModifiedTime
(long timestamp) protected void
setOutputStream
(OutputStream outs) void
Set proxy for use upon subsequentIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
.protected void
setupAndScheduleJob
(FileTransferJob fileTransferJob) protected void
protected abstract void
setupProxy
(Proxy proxy) Setup ECF proxy.protected boolean
targetHasGzSuffix
(String target) static String
toHumanReadableBytes
(double size) protected InputStream
wrapTransferReadInputStream
(InputStream inputStream, org.eclipse.core.runtime.IProgressMonitor monitor)
-
Field Details
-
DEFAULT_BUF_LENGTH
public static final int DEFAULT_BUF_LENGTH- See Also:
-
POLLING_RETRY_ATTEMPTS
protected static final int POLLING_RETRY_ATTEMPTS -
TIMEOUT_INPUTSTREAM_BUFFER_SIZE
protected static final int TIMEOUT_INPUTSTREAM_BUFFER_SIZE- See Also:
-
READ_TIMEOUT
protected static final int READ_TIMEOUT -
CLOSE_TIMEOUT
protected static final int CLOSE_TIMEOUT -
jobLock
-
job
protected org.eclipse.core.runtime.jobs.Job job -
remoteFileURL
-
remoteFileID
-
listener
-
buff_length
protected int buff_length -
done
protected boolean done -
bytesReceived
protected volatile long bytesReceived -
remoteFileContents
-
localFileContents
-
closeOutputStream
protected boolean closeOutputStream -
exception
-
fileLength
protected long fileLength -
lastModifiedTime
protected long lastModifiedTime -
options
-
paused
protected boolean paused -
rangeSpecification
-
proxy
-
connectContext
-
transferStartTime
protected long transferStartTime -
downloadRateBytesPerSecond
protected double downloadRateBytesPerSecond -
responseHeaders
- Since:
- 3.1
-
-
Constructor Details
-
AbstractRetrieveFileTransfer
public AbstractRetrieveFileTransfer()
-
-
Method Details
-
wrapTransferReadInputStream
protected InputStream wrapTransferReadInputStream(InputStream inputStream, org.eclipse.core.runtime.IProgressMonitor monitor) -
getRemoteFileURL
-
getSocketReadTimeout
protected int getSocketReadTimeout() -
getSocketCloseTimeout
protected int getSocketCloseTimeout() -
setInputStream
-
setOutputStream
-
setCloseOutputStream
protected void setCloseOutputStream(boolean close) -
setFileLength
protected void setFileLength(long length) -
setLastModifiedTime
protected void setLastModifiedTime(long timestamp) -
getOptions
-
handleReceivedData
protected void handleReceivedData(byte[] buf, int bytes, double factor, org.eclipse.core.runtime.IProgressMonitor monitor) throws IOException - Throws:
IOException
-
toHumanReadableBytes
-
getID
Description copied from interface:IIdentifiable
Return the ID for this 'identifiable' object. The returned ID should be unique within its namespace. May returnnull
.- Specified by:
getID
in interfaceIIdentifiable
- Returns:
- the ID for this identifiable object. May return
null
.
-
getFinalStatus
-
hardClose
protected void hardClose() -
fireTransferReceivePausedEvent
protected void fireTransferReceivePausedEvent() -
fireTransferReceiveDoneEvent
protected void fireTransferReceiveDoneEvent() -
fireTransferReceiveDataEvent
protected void fireTransferReceiveDataEvent() -
setConnectContextForAuthentication
Description copied from interface:IRetrieveFileTransferContainerAdapter
Set connect context for authentication upon subsequentIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
. This method should be called with a non-null connectContext in order to allow authentication to occur during call toIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
.- Specified by:
setConnectContextForAuthentication
in interfaceIRetrieveFileTransferContainerAdapter
- Parameters:
connectContext
- the connect context to use for authenticating during subsequent call toIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
. Ifnull
, then no authentication will be attempted.
-
setProxy
Description copied from interface:IRetrieveFileTransferContainerAdapter
Set proxy for use upon subsequentIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
. This method should be called with proxy to allow the given proxy to be used in subsequent calls toIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
.When proxy is
null
or has not been called providers must use theorg.eclipse.core.net
proxy API to obtain proxy information and proxy credentials if they support proxies of the type(s) supported by that API. The API is provided by an OSGi service of typeorg.eclipse.core.net.proxy.IProxyService
.If no information is available via
IProxyService
providers may use other defaults.- Specified by:
setProxy
in interfaceIRetrieveFileTransferContainerAdapter
- Parameters:
proxy
- the proxy to use for subsequent calls toIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
. Ifnull
, then proxy information is obtained fromIProxyService
if available. Otherwise provider defined defaults may be used.
-
getBytesReceived
public long getBytesReceived()Description copied from interface:IIncomingFileTransfer
Get number of bytes received so far. If provider does not support reporting the number of bytes received, will return -1.- Specified by:
getBytesReceived
in interfaceIIncomingFileTransfer
- Returns:
- long number of bytes received. Returns -1 if provider does not support reporting of number of bytes received during transfer
-
newUserCancelledException
- Returns:
- UserCancelledException if some user cancellation
- Since:
- 3.0
-
resetDoneAndException
protected void resetDoneAndException() -
setDone
protected void setDone(boolean done) -
setDoneException
-
isCanceled
protected boolean isCanceled() -
setDoneCanceled
protected void setDoneCanceled() -
setDoneCanceled
-
cancel
public void cancel()Description copied from interface:IFileTransfer
Cancel this file transfer. If file transfer has already been completed, then this method has no effect. If the file transfer has not been completed then calling this method will result in anIFileTransferEvent
being delivered to theIFileTransferListener
indicating that transfer is done (IFileTransfer.isDone()
returns true), and some exception will be made available- Specified by:
cancel
in interfaceIFileTransfer
-
getException
Description copied from interface:IFileTransfer
Get any exception associated with this file transfer. The value returned from this method is valid only ifIFileTransfer.isDone()
method returns true. If the file transfer completed successfully,IFileTransfer.isDone()
will return true, and this method will return null. If the file transfer completed unsuccessfully (some exception occurred), thenIFileTransfer.isDone()
will return true, and this method will return a non-null Exception instance that occurred.If the the file transfer was canceled by the user, then the exception returned will be an instance of
UserCancelledException
.- Specified by:
getException
in interfaceIFileTransfer
- Returns:
- Exception associated with this file transfer.
null
if transfer completed successfully, non-null if transfer completed with some exception. Only valid afterIFileTransfer.isDone()
returns true.
-
getPercentComplete
public double getPercentComplete()Description copied from interface:IFileTransfer
Get the percent complete for this file transfer. The returned value will be either -1.0, meaning that the underlying provider does not support reporting percent complete for this file transfer, or a value between 0 and 1 reflecting the percent complete for this file transfer. If 0.0 no data has been sent, if 1.0, the file transfer is 100 percent complete. The value returned from this method should not be used to determine whether the transfer has completed, as it may not show completion in the event of an transfer failure. Note that theIFileTransfer.isDone()
method should be consulted to determine if the file transfer has completed (with or without error).- Specified by:
getPercentComplete
in interfaceIFileTransfer
- Returns:
- double percent complete. Returns -1.0 if the underlying provider does not support reporting percentage complete, or between 0 and 1 to indicate actual percent complete for this file transfer
-
getFileLength
public long getFileLength()Description copied from interface:IFileTransfer
Return resulting file length (in bytes) for this file transfer instance. If the length is not known, -1 will be returned. Note that if aIFileRangeSpecification
is provided that the returned file length is the expected file length of just the range retrieved (and not the entire file).- Specified by:
getFileLength
in interfaceIFileTransfer
- Returns:
- long file length
-
getRemoteLastModified
Description copied from interface:IIncomingFileTransfer
Obtains the timestamp that reflects the time when the remote file was last modified if possible.- Specified by:
getRemoteLastModified
in interfaceIIncomingFileTransfer
- Returns:
- The time the remote file was last modified or
null
if that information was not available.
-
isDone
public boolean isDone()Description copied from interface:IFileTransfer
Return true if this file transfer is done, false if not yet completed. The file transfer can be completed successfully, or an exception can occur and the file transfer will have failed. In either case of successful or unsuccessful transfer, this method will return true when the file transfer is complete. To determine whether the transfer completed successfully, it is necessary to also consult theIFileTransfer.getException()
method.- Specified by:
isDone
in interfaceIFileTransfer
- Returns:
- boolean true if file transfer is done, false if file transfer is still in progress.
-
getAdapter
- Specified by:
getAdapter
in interfaceorg.eclipse.core.runtime.IAdaptable
-
openStreams
Open incoming and outgoing streams associated with this file transfer. Subclasses must implement this method to open input and output streams. TheremoteFileContents
andlocalFileContent
must be non-null
after successful completion of the implementation of this method.- Throws:
IncomingFileTransferException
- if some problem
-
sendRetrieveRequest
public void sendRetrieveRequest(IFileID remoteFileID1, IFileTransferListener transferListener, Map options1) throws IncomingFileTransferException Description copied from interface:IRetrieveFileTransferContainerAdapter
Send request for transfer of a remote file to local file storage. This method is used to initiate a file retrieve for a remoteFileID (first parameter). File transfer events are asynchronously delivered a file transfer listener (second parameter). The given remoteFileID and transferListener must not be null.NOTE: if this method completes successfully, the given transferListener will be asynchronously notified via an IIncomingFileTransferReceiveDoneEvent (along with other possible events). All implementations are required to issue this event whether successful or failed. Listeners can consult
IIncomingFileTransferReceiveDoneEvent.getException()
to determine whether the transfer operation completed successfully.- Specified by:
sendRetrieveRequest
in interfaceIRetrieveFileTransferContainerAdapter
- Parameters:
remoteFileID1
- reference to the remote target file (e.g. http://www.eclipse.org/index.html) or a reference to a resource that specifies the location of a target file. Implementing providers will determine what protocol schemes are supported (e.g. ftp, http, torrent, file, etc) and the required format of the scheme-specific information. If a protocol is specified that is not supported, or the scheme-specific information is not well-formed, then an IncomingFileTransferException will be thrown. Typically, callers will create IFileID instances via calls such as:IFileID remoteFileID = FileIDFactory.getDefault().createID( ftc.getRetrieveNamespace(), "http://www.composent.com/index.html");
Must not benull
.transferListener
- a listener for file transfer events. Must not be null. Must not be null. See Note above.options1
- a Map of options associated with sendRetrieveRequest. The particular name/value pairs will be unique to the individual providers. May benull
.- Throws:
IncomingFileTransferException
- if the provider is not connected or is not in the correct state for initiating file transfer
-
getRetrieveNamespace
Description copied from interface:IRetrieveFileTransferContainerAdapter
Get namespace to be used for creation of remoteFileID for retrieve request. Result typically used as first parameter forIDFactory.createID(Namespace, String)
to be used as first inIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
- Specified by:
getRetrieveNamespace
in interfaceIRetrieveFileTransferContainerAdapter
- Returns:
- Namespace to use for ID creation via
IDFactory.createID(Namespace, String)
. Will not benull
.
-
isPaused
public boolean isPaused()- Specified by:
isPaused
in interfaceIFileTransferPausable
- Returns:
- boolean true if file transfer paused, false if not paused
-
doPause
protected abstract boolean doPause()Subclass overridable version ofpause()
. Subclasses must provide an implementation of this method to supportIFileTransferPausable
.- Returns:
- true if the pause is successful.
false
otherwise.
-
pause
public boolean pause()Description copied from interface:IFileTransferPausable
Pause file transfer. Returns true if the associated IFileTransfer is successfully paused. Returns false if the implementing file transfer cannot be paused, or transfer has already completed.- Specified by:
pause
in interfaceIFileTransferPausable
- Returns:
- boolean true if file transfer successfully paused. False if cannot be paused, or the transfer has already completed
-
doResume
protected abstract boolean doResume()Subclass overridable version ofresume()
. Subclasses must provide an implementation of this method to supportIFileTransferPausable
.- Returns:
- true if the resume is successful.
false
otherwise.
-
resume
public boolean resume()Description copied from interface:IFileTransferPausable
Resume file transfer after having been paused. If successfully resumed, then returns true. If the associated IFileShare is not already paused, or has already completed then this method returns false.- Specified by:
resume
in interfaceIFileTransferPausable
- Returns:
- boolean true if transfer is successfully resumed, false otherwise
-
getListener
Description copied from interface:IIncomingFileTransfer
Get listener assigned to this incoming file transfer. May benull
if no listener has been provided.- Specified by:
getListener
in interfaceIIncomingFileTransfer
- Returns:
- listener the IFileTransferListener provided for this incoming file transfer.
-
createRangeName
-
createJobName
-
setupAndScheduleJob
-
fireReceiveStartEvent
protected void fireReceiveStartEvent() -
fireReceiveResumedEvent
protected void fireReceiveResumedEvent() -
getFileRangeSpecification
Description copied from interface:IIncomingFileTransfer
Get file range specification for this incoming file transfer instance. Will returnnull
if the retrieval is of the entire file.- Specified by:
getFileRangeSpecification
in interfaceIIncomingFileTransfer
- Returns:
- file range specification for this incoming file transfer instance. Returns
null
if the retrieval is of the entire file.
-
sendRetrieveRequest
public void sendRetrieveRequest(IFileID rFileID, IFileRangeSpecification rangeSpec, IFileTransferListener transferListener, Map ops) throws IncomingFileTransferException Description copied from interface:IRetrieveFileTransferContainerAdapter
Send request for transfer of a remote file to local file storage. This method is used to initiate a file retrieve for a remoteFileID (first parameter). File transfer events are asynchronously delivered a file transfer listener (third parameter). The given remoteFileID and transferListener must not be null.NOTE: if this method completes successfully, the given transferListener will be asynchronously notified via an IIncomingFileTransferReceiveDoneEvent (along with other possible events). All implementations are required to issue this event whether successful or failed. Listeners can consult
IIncomingFileTransferReceiveDoneEvent.getException()
to determine whether the transfer operation completed successfully.- Specified by:
sendRetrieveRequest
in interfaceIRetrieveFileTransferContainerAdapter
- Parameters:
rFileID
- reference to the remote target file (e.g. http://www.eclipse.org/index.html) or a reference to a resource that specifies the location of a target file. Implementing providers will determine what protocol schemes are supported (e.g. ftp, http, torrent, file, etc) and the required format of the scheme-specific information. If a protocol is specified that is not supported, or the scheme-specific information is not well-formed, then an IncomingFileTransferException will be thrown. Typically, callers will create IFileID instances via calls such as:IFileID remoteFileID = FileIDFactory.getDefault().createID( ftc.getRetrieveNamespace(), "http://www.composent.com/index.html");
Must not benull
.rangeSpec
- a range specification for retrieving a portion of the given remote file. Ifnull
the entire file will be retrieved (as perIRetrieveFileTransferContainerAdapter.sendRetrieveRequest(IFileID, IFileTransferListener, Map)
. If non-null
the given file range will be used to retrieve the given file. For example, if the rangeSpecification has a start value of 1 and end value of 3, and the total length of the file is 5 bytes with content [a, b, c, d, e], a successful retrieve request would transfer bytes 'b', 'c', and 'd', but not 'a', and 'e'.transferListener
- a listener for file transfer events. Must not be null. See Note above.ops
- a Map of options associated with sendRetrieveRequest. The particular name/value pairs will be unique to the individual providers. May benull
.- Throws:
IncomingFileTransferException
- if some problem sending retrieve request
-
setupProxy
Setup ECF proxy. Subclasses must override this method to do appropriate proxy setup. This method will be called from withinsendRetrieveRequest(IFileID, IFileTransferListener, Map)
andsendRetrieveRequest(IFileID, IFileRangeSpecification, IFileTransferListener, Map)
, prior to the actual call toopenStreams()
.- Parameters:
proxy
- the proxy to be setup. Will not benull
.
-
selectProxyFromProxies
protected org.eclipse.core.net.proxy.IProxyData selectProxyFromProxies(String protocol, org.eclipse.core.net.proxy.IProxyData[] proxies) Select a single proxy from a set of proxies available for the given host. This implementation selects in the following manner: 1) If proxies provided is null or array of 0 length, null is returned. If only one proxy is available (array of length 1) then the entry is returned. If proxies provided is length greater than 1, then if the type of a proxy in the array matches the given protocol (e.g. http, https), then the first matching proxy is returned. If the protocol does not match any of the proxies, then the *first* proxy (i.e. proxies[0]) is returned. Subclasses may override if desired.- Parameters:
protocol
- the target protocol (e.g. http, https, scp, etc). Will not benull
.proxies
- the proxies to select from. May benull
or array of length 0.- Returns:
- proxy data selected from the proxies provided.
-
setupProxies
protected void setupProxies() -
getRemoteFileName
Description copied from interface:IIncomingFileTransfer
Obtains the name of the remote file if possible. The name will typically but not necessarily be the same as the leaf part of the path to the remote file.- Specified by:
getRemoteFileName
in interfaceIIncomingFileTransfer
- Returns:
- The name of the remote file or
null
if no such name can be determined.
-
targetHasGzSuffix
-