--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.oc_framework_test_project.test;
+
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
+import com.owncloud.android.oc_framework_test_project.TestActivity;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+ * Class to test Read File Operation
+ * @author masensio
+ *
+ */
+
+public class ReadFileTest extends ActivityInstrumentationTestCase2<TestActivity> {
+
+ /* File data to read. This file must exist on the account */
+ private final String mRemoteFolderPath = "/fileToRead.txt";
+
+
+ private TestActivity mActivity;
+
+ public ReadFileTest() {
+ super(TestActivity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ setActivityInitialTouchMode(false);
+ mActivity = getActivity();
+ }
+
+ /**
+ * Test Read File
+ */
+ public void testReadFile() {
+
+ RemoteOperationResult result = mActivity.readFile(mRemoteFolderPath);
+ assertTrue(result.getData().size() == 1);
+ assertTrue(result.isSuccess());
+ }
+
+
+}
--- /dev/null
+package com.owncloud.android.oc_framework_test_project.test;
+
+
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
+import com.owncloud.android.oc_framework_test_project.TestActivity;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+ * Class to test Read Folder Operation
+ * @author masensio
+ *
+ */
+
+public class ReadFolderTest extends ActivityInstrumentationTestCase2<TestActivity> {
+
+
+ /* Folder data to read. This folder must exist on the account */
+ private final String mRemoteFolderPath = "/folderToRead";
+
+
+ private TestActivity mActivity;
+
+ public ReadFolderTest() {
+ super(TestActivity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ setActivityInitialTouchMode(false);
+ mActivity = getActivity();
+ }
+
+ /**
+ * Test Read Folder
+ */
+ public void testReadFolder() {
+
+ RemoteOperationResult result = mActivity.readFile(mRemoteFolderPath);
+ assertTrue(result.getData().size() > 1);
+ assertTrue(result.getData().size() == 4);
+ assertTrue(result.isSuccess());
+ }
+
+}
import android.test.ActivityInstrumentationTestCase2;
+/**
+ * Class to test Rename File Operation
+ * @author masensio
+ *
+ */
+
public class RenameFileTest extends ActivityInstrumentationTestCase2<TestActivity> {
/* Folder data to rename. This folder must exist on the account */
import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
import com.owncloud.android.oc_framework.operations.remote.CreateRemoteFolderOperation;
+import com.owncloud.android.oc_framework.operations.remote.ReadRemoteFolderOperation;
import com.owncloud.android.oc_framework.operations.remote.RemoveRemoteFileOperation;
import com.owncloud.android.oc_framework.operations.remote.RenameRemoteFileOperation;
return result;
}
+ /**
+ * Access to the library method to Read a Folder (PROPFIND DEPTH 1)
+ * @param remotePath
+ *
+ * @return
+ */
+ public RemoteOperationResult readFile(String remotePath) {
+
+ ReadRemoteFolderOperation readOperation= new ReadRemoteFolderOperation(remotePath);
+ RemoteOperationResult result = readOperation.execute(mClient);
+
+ return result;
+ }
}
-package com.owncloud.android.oc_framework.network;
/* ownCloud Android client application
* Copyright (C) 2012 ownCloud Inc.
*
*/
+package com.owncloud.android.oc_framework.network;
import java.util.Map;
public class RemoteFile implements Parcelable, Serializable {
- /** Generated - should be refreshed every time the class changes!! */
- private static final long serialVersionUID = 7256606476031992757L;
-
- private String mRemotePath;
- private String mMimeType;
- private long mLength;
- private long mCreationTimestamp;
- private long mModifiedTimestamp;
- private String mEtag;
-
- /**
- * Getters and Setters
- */
-
+ /** Generated - should be refreshed every time the class changes!! */
+ private static final long serialVersionUID = 7256606476031992757L;
+
+ private String mRemotePath;
+ private String mMimeType;
+ private long mLength;
+ private long mCreationTimestamp;
+ private long mModifiedTimestamp;
+ private String mEtag;
+
+ /**
+ * Getters and Setters
+ */
+
public String getRemotePath() {
- return mRemotePath;
- }
+ return mRemotePath;
+ }
- public void setRemotePath(String remotePath) {
- this.mRemotePath = remotePath;
- }
+ public void setRemotePath(String remotePath) {
+ this.mRemotePath = remotePath;
+ }
- public String getMimeType() {
- return mMimeType;
- }
+ public String getMimeType() {
+ return mMimeType;
+ }
- public void setMimeType(String mimeType) {
- this.mMimeType = mimeType;
- }
+ public void setMimeType(String mimeType) {
+ this.mMimeType = mimeType;
+ }
- public long getLength() {
- return mLength;
- }
+ public long getLength() {
+ return mLength;
+ }
- public void setLength(long length) {
- this.mLength = length;
- }
+ public void setLength(long length) {
+ this.mLength = length;
+ }
- public long getCreationTimestamp() {
- return mCreationTimestamp;
- }
+ public long getCreationTimestamp() {
+ return mCreationTimestamp;
+ }
- public void setCreationTimestamp(long creationTimestamp) {
- this.mCreationTimestamp = creationTimestamp;
- }
+ public void setCreationTimestamp(long creationTimestamp) {
+ this.mCreationTimestamp = creationTimestamp;
+ }
- public long getModifiedTimestamp() {
- return mModifiedTimestamp;
- }
+ public long getModifiedTimestamp() {
+ return mModifiedTimestamp;
+ }
- public void setModifiedTimestamp(long modifiedTimestamp) {
- this.mModifiedTimestamp = modifiedTimestamp;
- }
+ public void setModifiedTimestamp(long modifiedTimestamp) {
+ this.mModifiedTimestamp = modifiedTimestamp;
+ }
- public String getEtag() {
- return mEtag;
- }
+ public String getEtag() {
+ return mEtag;
+ }
- public void setEtag(String etag) {
- this.mEtag = etag;
- }
+ public void setEtag(String etag) {
+ this.mEtag = etag;
+ }
- /**
+ /**
* Create new {@link RemoteFile} with given path.
*
* The path received must be URL-decoded. Path separator must be OCFile.PATH_SEPARATOR, and it must be the first character in 'path'.
*
* @param path The remote path of the file.
*/
- public RemoteFile(String path) {
- resetData();
+ public RemoteFile(String path) {
+ resetData();
if (path == null || path.length() <= 0 || !path.startsWith(FileUtils.PATH_SEPARATOR)) {
throw new IllegalArgumentException("Trying to create a OCFile with a non valid remote path: " + path);
}
mRemotePath = path;
- }
+ }
- /**
+ /**
* Used internally. Reset all file properties
*/
private void resetData() {
mEtag = source.readString();
}
- @Override
- public int describeContents() {
- return this.hashCode();
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(mRemotePath);
- dest.writeString(mMimeType);
- dest.writeLong(mLength);
- dest.writeLong(mCreationTimestamp);
- dest.writeLong(mModifiedTimestamp);
- dest.writeString(mEtag);
- }
+ @Override
+ public int describeContents() {
+ return this.hashCode();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mRemotePath);
+ dest.writeString(mMimeType);
+ dest.writeLong(mLength);
+ dest.writeLong(mCreationTimestamp);
+ dest.writeLong(mModifiedTimestamp);
+ dest.writeString(mEtag);
+ }
-}
\ No newline at end of file
+}
*/
public class RemoteOperationResult implements Serializable {
- /** Generated - should be refreshed every time the class changes!! */
- private static final long serialVersionUID = -2469951225222759283L;
+ /** Generated - should be refreshed every time the class changes!! */
+ private static final long serialVersionUID = -2469951225222759283L;
private static final String TAG = "RemoteOperationResult";
private String mRedirectedLocation;
private ArrayList<RemoteFile> mFiles;
-
+
public RemoteOperationResult(ResultCode code) {
mCode = code;
mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL);
public void setData(ArrayList<RemoteFile> files){
- mFiles = files;
+ mFiles = files;
}
- public ArrayList<RemoteFile> getData(){
- return mFiles;
- }
+ public ArrayList<RemoteFile> getData(){
+ return mFiles;
+ }
public boolean isSuccess() {
return mSuccess;
mRedirectedLocation.toLowerCase().contains("wayf")));
}
-}
\ No newline at end of file
+}
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
package com.owncloud.android.oc_framework.operations.remote;
import org.apache.commons.httpclient.HttpStatus;
--- /dev/null
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.oc_framework.operations.remote;
+
+import java.util.ArrayList;
+
+import org.apache.http.HttpStatus;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.MultiStatus;
+import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
+
+import android.util.Log;
+
+import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
+import com.owncloud.android.oc_framework.network.webdav.WebdavEntry;
+import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
+import com.owncloud.android.oc_framework.operations.RemoteFile;
+import com.owncloud.android.oc_framework.operations.RemoteOperation;
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
+
+/**
+ * Remote operation performing the read of remote file or folder in the ownCloud server.
+ *
+ * @author David A. Velasco
+ * @author masensio
+ */
+
+public class ReadRemoteFolderOperation extends RemoteOperation {
+
+ private static final String TAG = ReadRemoteFolderOperation.class.getSimpleName();
+
+ private String mRemotePath;
+ private ArrayList<RemoteFile> mFolderAndFiles;
+
+ /**
+ * Constructor
+ *
+ * @param remotePath Remote path of the file.
+ */
+ public ReadRemoteFolderOperation(String remotePath) {
+ mRemotePath = remotePath;
+ }
+
+ /**
+ * Performs the read operation.
+ *
+ * @param client Client object to communicate with the remote ownCloud server.
+ */
+ @Override
+ protected RemoteOperationResult run(WebdavClient client) {
+ RemoteOperationResult result = null;
+ PropFindMethod query = null;
+
+ try {
+ // remote request
+ query = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath),
+ DavConstants.PROPFIND_ALL_PROP,
+ DavConstants.DEPTH_1);
+ int status = client.executeMethod(query);
+
+ // check and process response
+ if (isMultiStatus(status)) {
+ // get data from remote folder
+ MultiStatus dataInServer = query.getResponseBodyAsMultiStatus();
+ readData(dataInServer, client);
+
+ // Result of the operation
+ result = new RemoteOperationResult(true, status, query.getResponseHeaders());
+ // Add data to the result
+ if (result.isSuccess()) {
+ result.setData(mFolderAndFiles);
+ }
+ } else {
+ // synchronization failed
+ client.exhaustResponse(query.getResponseBodyAsStream());
+ result = new RemoteOperationResult(false, status, query.getResponseHeaders());
+ }
+
+ } catch (Exception e) {
+ result = new RemoteOperationResult(e);
+
+
+ } finally {
+ if (query != null)
+ query.releaseConnection(); // let the connection available for other methods
+ if (result.isSuccess()) {
+ Log.i(TAG, "Synchronized " + mRemotePath + ": " + result.getLogMessage());
+ } else {
+ if (result.isException()) {
+ Log.e(TAG, "Synchronized " + mRemotePath + ": " + result.getLogMessage(), result.getException());
+ } else {
+ Log.e(TAG, "Synchronized " + mRemotePath + ": " + result.getLogMessage());
+ }
+ }
+
+ }
+ return result;
+ }
+
+ public boolean isMultiStatus(int status) {
+ return (status == HttpStatus.SC_MULTI_STATUS);
+ }
+
+ /**
+ * Read the data retrieved from the server about the contents of the target folder
+ *
+ *
+ * @param dataInServer Full response got from the server with the data of the target
+ * folder and its direct children.
+ * @param client Client instance to the remote server where the data were
+ * retrieved.
+ * @return
+ */
+ private void readData(MultiStatus dataInServer, WebdavClient client) {
+ mFolderAndFiles = new ArrayList<RemoteFile>();
+
+ // parse data from remote folder
+ WebdavEntry we = new WebdavEntry(dataInServer.getResponses()[0], client.getBaseUri().getPath());
+ mFolderAndFiles.add(fillOCFile(we));
+
+ // loop to update every child
+ RemoteFile remoteFile = null;
+ for (int i = 1; i < dataInServer.getResponses().length; ++i) {
+ /// new OCFile instance with the data from the server
+ we = new WebdavEntry(dataInServer.getResponses()[i], client.getBaseUri().getPath());
+ remoteFile = fillOCFile(we);
+ mFolderAndFiles.add(remoteFile);
+ }
+
+ }
+
+ /**
+ * Creates and populates a new {@link RemoteFile} object with the data read from the server.
+ *
+ * @param we WebDAV entry read from the server for a WebDAV resource (remote file or folder).
+ * @return New OCFile instance representing the remote resource described by we.
+ */
+ private RemoteFile fillOCFile(WebdavEntry we) {
+ RemoteFile file = new RemoteFile(we.decodedPath());
+ file.setCreationTimestamp(we.createTimestamp());
+ file.setLength(we.contentLength());
+ file.setMimeType(we.contentType());
+ file.setModifiedTimestamp(we.modifiedTimestamp());
+ file.setEtag(we.etag());
+ return file;
+ }
+}
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
package com.owncloud.android.oc_framework.operations.remote;
import org.apache.commons.httpclient.HttpStatus;
+/* ownCloud Android client application
+ * Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
package com.owncloud.android.oc_framework.operations.remote;
import java.io.File;
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
+
package com.owncloud.android.oc_framework.utils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.http.HttpStatus;
-import org.apache.jackrabbit.webdav.DavConstants;
-import org.apache.jackrabbit.webdav.MultiStatus;
-import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
-
import android.accounts.Account;
import android.content.Context;
import android.content.Intent;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
import com.owncloud.android.oc_framework.network.webdav.WebdavEntry;
-import com.owncloud.android.oc_framework.network.webdav.WebdavUtils;
import com.owncloud.android.oc_framework.operations.RemoteOperation;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.oc_framework.operations.remote.ReadRemoteFileOperation;
+import com.owncloud.android.oc_framework.operations.remote.ReadRemoteFolderOperation;
+import com.owncloud.android.oc_framework.operations.RemoteFile;
import com.owncloud.android.syncadapter.FileSyncService;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.Log_OC;
private RemoteOperationResult fetchAndSyncRemoteFolder(WebdavClient client) {
- RemoteOperationResult result = null;
- String remotePath = null;
- PropFindMethod query = null;
- try {
- remotePath = mLocalFolder.getRemotePath();
- Log_OC.d(TAG, "Synchronizing " + mAccount.name + remotePath);
-
- // remote request
- query = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(remotePath),
- DavConstants.PROPFIND_ALL_PROP,
- DavConstants.DEPTH_1);
- int status = client.executeMethod(query);
-
- // check and process response
- if (isMultiStatus(status)) {
- synchronizeData(query.getResponseBodyAsMultiStatus(), client);
- if (mConflictsFound > 0 || mFailsInFavouritesFound > 0) {
- result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); // should be different result, but will do the job
- } else {
- result = new RemoteOperationResult(true, status, query.getResponseHeaders());
- }
-
- } else {
- // synchronization failed
- client.exhaustResponse(query.getResponseBodyAsStream());
- if (status == HttpStatus.SC_NOT_FOUND) {
- removeLocalFolder();
- }
- result = new RemoteOperationResult(false, status, query.getResponseHeaders());
- }
-
- } catch (Exception e) {
- result = new RemoteOperationResult(e);
-
-
- } finally {
- if (query != null)
- query.releaseConnection(); // let the connection available for other methods
- if (result.isSuccess()) {
- Log_OC.i(TAG, "Synchronized " + mAccount.name + remotePath + ": " + result.getLogMessage());
- } else {
- if (result.isException()) {
- Log_OC.e(TAG, "Synchronized " + mAccount.name + remotePath + ": " + result.getLogMessage(), result.getException());
- } else {
- Log_OC.e(TAG, "Synchronized " + mAccount.name + remotePath + ": " + result.getLogMessage());
- }
+ String remotePath = mLocalFolder.getRemotePath();
+ ReadRemoteFolderOperation operation = new ReadRemoteFolderOperation(remotePath);
+ RemoteOperationResult result = operation.execute(client);
+ Log_OC.d(TAG, "Synchronizing " + mAccount.name + remotePath);
+
+ if (result.isSuccess()) {
+ synchronizeData(result.getData(), client);
+ if (mConflictsFound > 0 || mFailsInFavouritesFound > 0) {
+ result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); // should be different result, but will do the job
}
-
+ } else {
+ if (result.getCode() == ResultCode.FILE_NOT_FOUND)
+ removeLocalFolder();
}
+
return result;
}
-
+
private void removeLocalFolder() {
if (mStorageManager.fileExists(mLocalFolder.getFileId())) {
String currentSavePath = FileStorageUtils.getSavePath(mAccount.name);
* with the current data in the local database.
*
* Grants that mChildren is updated with fresh data after execution.
- *
- * @param dataInServer Full response got from the server with the data of the target
- * folder and its direct children.
+ *
+ * @param folderAndFiles Remote folder and children files in Folder
+ *
* @param client Client instance to the remote server where the data were
* retrieved.
* @return 'True' when any change was made in the local data, 'false' otherwise.
*/
- private void synchronizeData(MultiStatus dataInServer, WebdavClient client) {
+ private void synchronizeData(ArrayList<RemoteFile> folderAndFiles, WebdavClient client) {
// get 'fresh data' from the database
mLocalFolder = mStorageManager.getFileByPath(mLocalFolder.getRemotePath());
// parse data from remote folder
- WebdavEntry we = new WebdavEntry(dataInServer.getResponses()[0], client.getBaseUri().getPath());
- OCFile remoteFolder = fillOCFile(we);
+ OCFile remoteFolder = fillOCFile(folderAndFiles.get(0));
remoteFolder.setParentId(mLocalFolder.getParentId());
remoteFolder.setFileId(mLocalFolder.getFileId());
Log_OC.d(TAG, "Remote folder " + mLocalFolder.getRemotePath() + " changed - starting update of local data ");
- List<OCFile> updatedFiles = new Vector<OCFile>(dataInServer.getResponses().length - 1);
+ List<OCFile> updatedFiles = new Vector<OCFile>(folderAndFiles.size() - 1);
List<SynchronizeFileOperation> filesToSyncContents = new Vector<SynchronizeFileOperation>();
// get current data about local contents of the folder to synchronize
// loop to update every child
OCFile remoteFile = null, localFile = null;
- for (int i = 1; i < dataInServer.getResponses().length; ++i) {
+ for (int i=1; i<folderAndFiles.size(); i++) {
/// new OCFile instance with the data from the server
- we = new WebdavEntry(dataInServer.getResponses()[i], client.getBaseUri().getPath());
- remoteFile = fillOCFile(we);
+ remoteFile = fillOCFile(folderAndFiles.get(i));
remoteFile.setParentId(mLocalFolder.getFileId());
/// retrieve local data for the read file
return (status == HttpStatus.SC_MULTI_STATUS);
}
-
+
/**
* Creates and populates a new {@link OCFile} object with the data read from the server.
*
file.setEtag(we.etag());
return file;
}
+
+ /**
+ * Creates and populates a new {@link OCFile} object with the data read from the server.
+ *
+ * @param remote remote file read from the server (remote file or folder).
+ * @return New OCFile instance representing the remote resource described by we.
+ */
+ private OCFile fillOCFile(RemoteFile remote) {
+ OCFile file = new OCFile(remote.getRemotePath());
+ file.setCreationTimestamp(remote.getCreationTimestamp());
+ file.setFileLength(remote.getLength());
+ file.setMimetype(remote.getMimeType());
+ file.setModificationTimestamp(remote.getModifiedTimestamp());
+ file.setEtag(remote.getEtag());
+ return file;
+ }
/**