Class TransactionAwareFeatureTransferManager

    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected <T extends RemoteFile>
      java.util.Map<java.lang.String,​T>
      addAndFilterFilesInTransaction​(java.lang.Class<T> remoteFileClass, java.util.Map<java.lang.String,​T> remoteFiles)
      Returns a list of remote files, excluding the files in transactions.
      void cleanTransactions()
      Checks if any transactions of the local machine were not completed and performs a rollback if any transactions were found.
      void clearPendingTransactions()
      clearPendingTransactions provides a way to delete the multiple transactions that might be queued after an interrupted up.
      void clearResumableTransactions()
      This methods deletes local copies of transactions that might be resumed.
      void connect()
      Establish a connection with the remote storage.
      protected java.io.File createTempFile​(java.lang.String name)
      Creates a temporary file, either using the config (if initialized) or using the global temporary directory.
      boolean delete​(RemoteFile remoteFile)
      Deletes an existing file from the remote storage permanently.
      void disconnect()
      Disconnect from the remote storage.
      void download​(RemoteFile remoteFile, java.io.File localFile)
      Download an existing remote file to the local disk.
      protected java.util.Set<RemoteFile> getFilesInTransactions​(java.util.Set<TransactionTO> transactions)
      Returns a Set of all files that are not temporary, but are listed in a transaction file.
      java.lang.String getRemoteFilePath​(java.lang.Class<? extends RemoteFile> remoteFileClass)
      Return the path for a concrete RemoteFile implementation as it is stored on the remote side *
      java.util.List<TransactionRemoteFile> getTransactionsByClient​(java.lang.String client)
      This function returns a list of all remote transaction files that belong to the client.
      void init​(boolean createIfRequired)
      Initialize remote storage.
      <T extends RemoteFile>
      java.util.Map<java.lang.String,​T>
      list​(java.lang.Class<T> remoteFileClass)
      Retrieves a list of all files in the remote repository, filtered by the type of the desired file, i.e.
      java.util.Collection<java.lang.Long> loadPendingTransactionList()
      Check if we have transactions from an Up operation that we can resume.
      void move​(RemoteFile sourceFile, RemoteFile targetFile)
      Moves an existing file in the online storage.
      void removeUnreferencedTemporaryFiles()
      Removes temporary files on the offsite storage that are not listed in any of the TransactionRemoteFiles available remotely.
      StorageTestResult test​(boolean testCreateTarget)
      Tests whether the repository parameters are valid.
      boolean testRepoFileExists()
      Tests whether the repository file exists (see SyncanyRemoteFile).
      boolean testTargetCanCreate()
      Tests whether the target path/folder can be created (if it does not exist already).
      boolean testTargetCanWrite()
      Tests whether the target path/folder is writable by the application.
      boolean testTargetExists()
      Tests whether the target path/folder exists.
      void upload​(java.io.File localFile, RemoteFile remoteFile)
      Update an existing local file to the online storage.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Method Detail

      • init

        public void init​(boolean createIfRequired)
                  throws StorageException
        Description copied from interface: TransferManager
        Initialize remote storage. This method is called to set up a new repository.
        Specified by:
        init in interface TransferManager
        Parameters:
        createIfRequired - true if the method should handle repo creation
        Throws:
        StorageException - If the connection drops, or any other exception occurs.
      • download

        public void download​(RemoteFile remoteFile,
                             java.io.File localFile)
                      throws StorageException
        Description copied from interface: TransferManager
        Download an existing remote file to the local disk.

        The file is either downloaded completely or nothing at all. In the latter case, a StorageException is thrown.

        Implementations must make sure that if a file matches the specified name schema, it must be complete and consistent.

        If remoteFile does not exist, a StorageFileNotFoundException is thrown.

        Specified by:
        download in interface TransferManager
        Parameters:
        remoteFile - Existing source file on the remote storage. The only required property of the remote file is the name.
        localFile - Not existing local file to which the remote file is going to be downloaded.
        Throws:
        StorageException - If the connection fails due to no Internet connection, authentication errors, etc.
      • upload

        public void upload​(java.io.File localFile,
                           RemoteFile remoteFile)
                    throws StorageException
        Description copied from interface: TransferManager
        Update an existing local file to the online storage.

        The file is either uploaded completely or nothing at all. In the latter case, a StorageException is thrown.

        Implementations must make sure that if a file matches the specified name schema, it must be complete and consistent.

        Implementations must NOT upload a file if it already exists and has the same file size as the local file.

        Specified by:
        upload in interface TransferManager
        Parameters:
        localFile - Existing local file that is going to be uploaded.
        remoteFile - Not existing destination file on the remote storage. The only required property of the remote file is the name.
        Throws:
        StorageException - If the connection fails due to no Internet connection, authentication errors, etc.
      • delete

        public boolean delete​(RemoteFile remoteFile)
                       throws StorageException
        Description copied from interface: TransferManager
        Deletes an existing file from the remote storage permanently.

        In case the remote file does not exist, it returns immediately without any notice. If the file cannot be deleted or the connection breaks, a StorageException is thrown.

        Specified by:
        delete in interface TransferManager
        Parameters:
        remoteFile - Existing remote file to be deleted. The only required property of the remote file is the name.
        Throws:
        StorageException - If the connection fails due to no Internet connection, authentication errors, etc
      • list

        public <T extends RemoteFile> java.util.Map<java.lang.String,​T> list​(java.lang.Class<T> remoteFileClass)
                                                                            throws StorageException
        Description copied from interface: TransferManager
        Retrieves a list of all files in the remote repository, filtered by the type of the desired file, i.e. by a sub-class of RemoteFile.
        Specified by:
        list in interface TransferManager
        Parameters:
        remoteFileClass - Filter class: RemoteFile or a sub-type thereof
        Returns:
        Returns a list of remote files. In the map, the key is the file name, the value the entire RemoteFile object.
        Throws:
        StorageException - If the connection fails due to no Internet connection, authentication errors, etc
      • getRemoteFilePath

        public java.lang.String getRemoteFilePath​(java.lang.Class<? extends RemoteFile> remoteFileClass)
        Description copied from interface: TransferManager
        Return the path for a concrete RemoteFile implementation as it is stored on the remote side *
        Specified by:
        getRemoteFilePath in interface TransferManager
        Parameters:
        remoteFileClass - The class to provide the path for
        Returns:
        A string pointing to the folder where a file is stored
      • cleanTransactions

        public void cleanTransactions()
                               throws StorageException,
                                      BlockingTransfersException
        Checks if any transactions of the local machine were not completed and performs a rollback if any transactions were found. The rollback itself is performed in a transaction.

        The method uses retrieveRemoteTransactions() to download all transaction files and then rolls back the local machines's transactions:

        • Files in the transaction marked "UPLOAD" are deleted.
        • Files in the transaction marked "DELETE" are moved back to their original place.
        Throws:
        BlockingTransfersException - if we cannot proceed (Deleting transaction by another client exists).
        StorageException
      • clearResumableTransactions

        public void clearResumableTransactions()
        This methods deletes local copies of transactions that might be resumed. This is done when a transaction is successfully resumed, or some other operations is performed, which implies that resuming is no longer an option.
      • clearPendingTransactions

        public void clearPendingTransactions()
                                      throws java.io.IOException
        clearPendingTransactions provides a way to delete the multiple transactions that might be queued after an interrupted up.
        Throws:
        java.io.IOException
      • loadPendingTransactionList

        public java.util.Collection<java.lang.Long> loadPendingTransactionList()
                                                                        throws java.io.IOException
        Check if we have transactions from an Up operation that we can resume.
        Throws:
        java.io.IOException
      • testTargetExists

        public boolean testTargetExists()
                                 throws StorageException
        Description copied from interface: TransferManager
        Tests whether the target path/folder exists. This might be done by listing the parent path/folder or by retrieving metadata about the target. The method returns true if the target exists, false otherwise.

        This method is called by the TransferManager.test(boolean) method (only during repository initialization or initial connection).

        Specified by:
        testTargetExists in interface TransferManager
        Returns:
        Returns true if the target exists, false otherwise
        Throws:
        StorageException - If the test cannot be performed, e.g. due to a connection failure
      • testTargetCanWrite

        public boolean testTargetCanWrite()
                                   throws StorageException
        Description copied from interface: TransferManager
        Tests whether the target path/folder is writable by the application. This method may either check the write permissions of the target or actually write a test file to check write access. If the target does not exist, false is returned. If the target exists and is writable, true is returned.

        This method is called by the TransferManager.test(boolean) method (only during repository initialization or initial connection).

        Specified by:
        testTargetCanWrite in interface TransferManager
        Returns:
        Returns true if the target can be written to, false otherwise
        Throws:
        StorageException - If the test cannot be performed, e.g. due to a connection failure
      • testTargetCanCreate

        public boolean testTargetCanCreate()
                                    throws StorageException
        Description copied from interface: TransferManager
        Tests whether the target path/folder can be created (if it does not exist already). This method may either check the permissions of the parent path/folder or actually create and delete the target to determine create permissions.

        If the target already exists, the method returns true. If it does not, but it can be created (according to tests of this method), it also returns true. In all other cases, false is returned.

        This method is called by the TransferManager.test(boolean) method, but only if the testCreateTarget flag is set to true!

        Specified by:
        testTargetCanCreate in interface TransferManager
        Returns:
        Returns true if the target can be created or already exists, false otherwise
        Throws:
        StorageException - If the test cannot be performed, e.g. due to a connection failure
      • addAndFilterFilesInTransaction

        protected <T extends RemoteFile> java.util.Map<java.lang.String,​T> addAndFilterFilesInTransaction​(java.lang.Class<T> remoteFileClass,
                                                                                                                java.util.Map<java.lang.String,​T> remoteFiles)
                                                                                                         throws StorageException
        Returns a list of remote files, excluding the files in transactions. The method is used to hide unfinished transactions from other clients.
        Throws:
        StorageException
      • createTempFile

        protected java.io.File createTempFile​(java.lang.String name)
                                       throws java.io.IOException
        Creates a temporary file, either using the config (if initialized) or using the global temporary directory.
        Throws:
        java.io.IOException