X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/5b54915209ce26d977d9dabb97001ac06b24441a..ec6b9d7c70deb50152bfab5cb5f25c9a2dde28e7:/src/com/owncloud/android/files/services/IndexedForest.java diff --git a/src/com/owncloud/android/files/services/IndexedForest.java b/src/com/owncloud/android/files/services/IndexedForest.java index daf46a56..e2e9cb85 100644 --- a/src/com/owncloud/android/files/services/IndexedForest.java +++ b/src/com/owncloud/android/files/services/IndexedForest.java @@ -18,11 +18,13 @@ package com.owncloud.android.files.services; import android.accounts.Account; +import android.util.Pair; import com.owncloud.android.datamodel.OCFile; import java.io.File; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -87,10 +89,14 @@ public class IndexedForest { public void removeChild(Node removed) { mChildren.remove(removed); } + + public void clearPayload() { + mPayload = null; + } } - public /* synchronized */ String putIfAbsent(Account account, String remotePath, V value) { + public /* synchronized */ Pair putIfAbsent(Account account, String remotePath, V value) { String targetKey = buildKey(account, remotePath); Node valuedNode = new Node(targetKey, value); mMap.putIfAbsent( @@ -120,33 +126,68 @@ public class IndexedForest { currentNode = parentNode; } - return targetKey; + String linkedTo = OCFile.ROOT_PATH; + if (linked) { + linkedTo = parentNode.getKey().substring(account.name.length()); + } + return new Pair(targetKey, linkedTo); }; - public /* synchronized */ V remove(Account account, String remotePath) { + + public Pair removePayload(Account account, String remotePath) { + String targetKey = buildKey(account, remotePath); + Node target = mMap.get(targetKey); + if (target != null) { + target.clearPayload(); + if (!target.hasChildren()) { + return remove(account, remotePath); + } + } + return new Pair(null, null); + } + + + public /* synchronized */ Pair remove(Account account, String remotePath) { String targetKey = buildKey(account, remotePath); Node firstRemoved = mMap.remove(targetKey); + String unlinkedFrom = null; if (firstRemoved != null) { + /// remove children + removeDescendants(firstRemoved); + + /// remove ancestors if only here due to firstRemoved Node removed = firstRemoved; Node parent = removed.getParent(); + boolean unlinked = false; while (parent != null) { parent.removeChild(removed); if (!parent.hasChildren()) { removed = mMap.remove(parent.getKey()); parent = removed.getParent(); } else { - parent = null; + break; } } - } - if (firstRemoved != null) { - return firstRemoved.getPayload(); - } else { - return null; + if (parent != null) { + unlinkedFrom = parent.getKey().substring(account.name.length()); + } + + return new Pair(firstRemoved.getPayload(), unlinkedFrom); } + return new Pair(null, null); + } + + private void removeDescendants(Node removed) { + Iterator> childrenIt = removed.getChildren().iterator(); + Node child = null; + while (childrenIt.hasNext()) { + child = childrenIt.next(); + mMap.remove(child.getKey()); + removeDescendants(child); + } } public boolean contains(Account account, String remotePath) { @@ -163,6 +204,11 @@ public class IndexedForest { } } + public V get(Account account, String remotePath) { + String key = buildKey(account, remotePath); + return get(key); + } + /** * Builds a key to index files