Rename of folders completed (by now)

This commit is contained in:
David A. Velasco 2012-11-06 13:35:08 +01:00
parent b27ebf0310
commit 1baa27a440
3 changed files with 78 additions and 35 deletions

View file

@ -145,6 +145,29 @@ public class FileDataStorageManager implements DataStorageManager {
+ e.getMessage());
}
}
} else if (fileExists(file.getFileId())) { // for renamed files; no more delete and create
OCFile oldFile = getFileById(file.getFileId());
if (file.getStoragePath() == null && oldFile.getStoragePath() != null)
file.setStoragePath(oldFile.getStoragePath());
if (!file.isDirectory());
cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath());
overriden = true;
if (getContentResolver() != null) {
getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv,
ProviderTableMeta._ID + "=?",
new String[] { String.valueOf(file.getFileId()) });
} else {
try {
getContentProvider().update(ProviderTableMeta.CONTENT_URI,
cv, ProviderTableMeta._ID + "=?",
new String[] { String.valueOf(file.getFileId()) });
} catch (RemoteException e) {
Log.e(TAG,
"Fail to insert insert file to database "
+ e.getMessage());
}
}
} else {
Uri result_uri = null;
if (getContentResolver() != null) {
@ -201,11 +224,12 @@ public class FileDataStorageManager implements DataStorageManager {
cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.keepInSync() ? 1 : 0);
if (fileExists(file.getRemotePath())) {
OCFile tmpfile = getFileByPath(file.getRemotePath());
file.setStoragePath(tmpfile.getStoragePath());
OCFile oldFile = getFileByPath(file.getRemotePath());
if (file.getStoragePath() == null && oldFile.getStoragePath() != null)
file.setStoragePath(oldFile.getStoragePath());
if (!file.isDirectory());
cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath());
file.setFileId(tmpfile.getFileId());
file.setFileId(oldFile.getFileId());
operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
withValues(cv).
@ -213,6 +237,19 @@ public class FileDataStorageManager implements DataStorageManager {
new String[] { String.valueOf(file.getFileId()) })
.build());
} else if (fileExists(file.getFileId())) {
OCFile oldFile = getFileById(file.getFileId());
if (file.getStoragePath() == null && oldFile.getStoragePath() != null)
file.setStoragePath(oldFile.getStoragePath());
if (!file.isDirectory());
cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath());
operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI).
withValues(cv).
withSelection( ProviderTableMeta._ID + "=?",
new String[] { String.valueOf(file.getFileId()) })
.build());
} else {
operations.add(ContentProviderOperation.newInsert(ProviderTableMeta.CONTENT_URI).withValues(cv).build());
}

View file

@ -212,7 +212,21 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
*/
public String getFileName() {
File f = new File(getRemotePath());
return f.getName().length() == 0 ? "/" : f.getName();
return f.getName().length() == 0 ? PATH_SEPARATOR : f.getName();
}
/**
* Sets the name of the file
*
* Does nothing if the new name is null, empty or includes "/" ; or if the file is the root directory
*/
public void setFileName(String name) {
if (name != null && name.length() > 0 && !name.contains(PATH_SEPARATOR) && !mRemotePath.equals(PATH_SEPARATOR)) {
mRemotePath = (new File(getRemotePath())).getParent() + name;
if (isDirectory()) {
mRemotePath += PATH_SEPARATOR;
}
}
}
/**
@ -370,7 +384,7 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
@Override
public String toString() {
String asString = "[id=%s, name=%s, mime=%s, downloaded=%s, local=%s, remote=%s, parentId=%s, keepInSinc=%s]";
asString = String.format(asString, new Long(mId), getFileName(), mMimeType, isDown(), mLocalPath, mRemotePath, new Long(mParentId), new Boolean(mKeepInSync));
asString = String.format(asString, Long.valueOf(mId), getFileName(), mMimeType, isDown(), mLocalPath, mRemotePath, Long.valueOf(mParentId), Boolean.valueOf(mKeepInSync));
return asString;
}

View file

@ -41,7 +41,7 @@ import eu.alefzero.webdav.WebdavUtils;
*/
public class RenameFileOperation extends RemoteOperation {
private static final String TAG = RenameFileOperation.class.getSimpleName();
private static final String TAG = RemoveFileOperation.class.getSimpleName();
private static final int RENAME_READ_TIMEOUT = 10000;
private static final int RENAME_CONNECTION_TIMEOUT = 5000;
@ -80,7 +80,6 @@ public class RenameFileOperation extends RemoteOperation {
RemoteOperationResult result = null;
LocalMoveMethod move = null;
//MoveMethod move = null; // TODO find out why not use this
String newRemotePath = null;
try {
if (mNewName.equals(mFile.getFileName())) {
@ -94,26 +93,25 @@ public class RenameFileOperation extends RemoteOperation {
return new RemoteOperationResult(ResultCode.INVALID_LOCAL_FILE_NAME);
}
// check if a remote file with the new name already exists
if (client.existsFile(newRemotePath)) {
// check if a file with the new name already exists
if (client.existsFile(newRemotePath) || // remote check could fail by network failure, or by indeterminate behavior of HEAD for folders ...
mStorageManager.getFileByPath(newRemotePath) != null) { // ... so local check is convenient
return new RemoteOperationResult(ResultCode.INVALID_OVERWRITE);
}
/*move = new MoveMethod( client.getBaseUri() + WebdavUtils.encodePath(mFile.getRemotePath()),
client.getBaseUri() + WebdavUtils.encodePath(newRemotePath),
false);*/
move = new LocalMoveMethod( client.getBaseUri() + WebdavUtils.encodePath(mFile.getRemotePath()),
client.getBaseUri() + WebdavUtils.encodePath(newRemotePath));
int status = client.executeMethod(move, RENAME_READ_TIMEOUT, RENAME_CONNECTION_TIMEOUT);
if (move.succeeded()) {
// create new OCFile instance for the renamed file
OCFile newFile = obtainUpdatedFile();
/*OCFile newFile = new OCFile(mStorageManager.getFileById(mFile.getParentId()).getRemotePath() + mNewName; // TODO - NOT CREATE NEW OCFILE; ADD setFileName METHOD
OCFile oldFile = mFile;
mFile = newFile;
mFile = newFile; */
mFile.setFileName(mNewName);
// try to rename the local copy of the file
if (oldFile.isDown()) {
File f = new File(oldFile.getStoragePath());
if (mFile.isDown()) {
File f = new File(mFile.getStoragePath());
String newStoragePath = f.getParent() + mNewName;
if (f.renameTo(new File(newStoragePath))) {
mFile.setStoragePath(newStoragePath);
@ -122,9 +120,21 @@ public class RenameFileOperation extends RemoteOperation {
// TODO - study conditions when this could be a problem
}
mStorageManager.removeFile(oldFile, false);
//mStorageManager.removeFile(oldFile, false);
mStorageManager.saveFile(mFile);
/*
*} else if (mFile.isDirectory() && (status == 207 || status >= 500)) {
* // TODO
* // if server fails in the rename of a folder, some children files could have been moved to a folder with the new name while some others
* // stayed in the old folder;
* //
* // easiest and heaviest solution is synchronizing the parent folder (or the full account);
* //
* // a better solution is synchronizing the folders with the old and new names;
*}
*/
}
move.getResponseBodyAsString(); // exhaust response, although not interesting
@ -180,24 +190,6 @@ public class RenameFileOperation extends RemoteOperation {
}
/**
* Creates a new OCFile for the new remote name of the renamed file.
*
* @return OCFile object with the same information than mFile, but the renamed remoteFile and the storagePath (empty)
*/
private OCFile obtainUpdatedFile() {
OCFile file = new OCFile(mStorageManager.getFileById(mFile.getParentId()).getRemotePath() + mNewName);
file.setCreationTimestamp(mFile.getCreationTimestamp());
file.setFileId(mFile.getFileId());
file.setFileLength(mFile.getFileLength());
file.setKeepInSync(mFile.keepInSync());
file.setLastSyncDate(mFile.getLastSyncDate());
file.setMimetype(mFile.getMimetype());
file.setModificationTimestamp(mFile.getModificationTimestamp());
file.setParentId(mFile.getParentId());
return file;
}
// move operation - TODO: find out why org.apache.jackrabbit.webdav.client.methods.MoveMethod is not used instead ¿?
private class LocalMoveMethod extends DavMethodBase {