X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/5116bd99e26954fb83621863ff26e351d0a08cfd..106a2324e113d997db71f00a63ecda3ad828f098:/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 e2e9cb85..8f4ccb67 100644 --- a/src/com/owncloud/android/files/services/IndexedForest.java +++ b/src/com/owncloud/android/files/services/IndexedForest.java @@ -1,4 +1,7 @@ -/* ownCloud Android client application +/** + * ownCloud Android client application + * + * @author David A. Velasco * Copyright (C) 2015 ownCloud Inc. * * This program is free software: you can redistribute it and/or modify @@ -21,6 +24,7 @@ import android.accounts.Account; import android.util.Pair; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.common.utils.Log_OC; import java.io.File; import java.util.HashSet; @@ -35,8 +39,6 @@ import java.util.concurrent.ConcurrentMap; * A map provides the indexation based in hashing. * * A tree is created per account. - * - * @author David A. Velasco */ public class IndexedForest { @@ -99,38 +101,45 @@ public class IndexedForest { public /* synchronized */ Pair putIfAbsent(Account account, String remotePath, V value) { String targetKey = buildKey(account, remotePath); Node valuedNode = new Node(targetKey, value); - mMap.putIfAbsent( - targetKey, - valuedNode + Node previousValue = mMap.putIfAbsent( + targetKey, + valuedNode ); + if (previousValue != null) { + // remotePath already known; not replaced + return null; - String currentPath = remotePath, parentPath = null, parentKey = null; - Node currentNode = valuedNode, parentNode = null; - boolean linked = false; - while (!OCFile.ROOT_PATH.equals(currentPath) && !linked) { - parentPath = new File(currentPath).getParent(); - if (!parentPath.endsWith(OCFile.PATH_SEPARATOR)) { - parentPath += OCFile.PATH_SEPARATOR; + } else { + // value really added + String currentPath = remotePath, parentPath = null, parentKey = null; + Node currentNode = valuedNode, parentNode = null; + boolean linked = false; + while (!OCFile.ROOT_PATH.equals(currentPath) && !linked) { + parentPath = new File(currentPath).getParent(); + if (!parentPath.endsWith(OCFile.PATH_SEPARATOR)) { + parentPath += OCFile.PATH_SEPARATOR; + } + parentKey = buildKey(account, parentPath); + parentNode = mMap.get(parentKey); + if (parentNode == null) { + parentNode = new Node(parentKey, null); + parentNode.addChild(currentNode); + mMap.put(parentKey, parentNode); + } else { + parentNode.addChild(currentNode); + linked = true; + } + currentPath = parentPath; + currentNode = parentNode; } - parentKey = buildKey(account, parentPath); - parentNode = mMap.get(parentKey); - if (parentNode == null) { - parentNode = new Node(parentKey, null); - parentNode.addChild(currentNode); - mMap.put(parentKey, parentNode); - } else { - parentNode.addChild(currentNode); - linked = true; + + String linkedTo = OCFile.ROOT_PATH; + if (linked) { + linkedTo = parentNode.getKey().substring(account.name.length()); } - currentPath = parentPath; - currentNode = parentNode; - } - String linkedTo = OCFile.ROOT_PATH; - if (linked) { - linkedTo = parentNode.getKey().substring(account.name.length()); + return new Pair(targetKey, linkedTo); } - return new Pair(targetKey, linkedTo); }; @@ -211,6 +220,21 @@ public class IndexedForest { /** + * Remove the elements that contains account as a part of its key + * @param account + */ + public void remove(Account account){ + Iterator it = mMap.keySet().iterator(); + while (it.hasNext()) { + String key = it.next(); + Log_OC.d("IndexedForest", "Number of pending downloads= " + mMap.size()); + if (key.startsWith(account.name)) { + mMap.remove(key); + } + } + } + + /** * Builds a key to index files * * @param account Account where the file to download is stored @@ -220,6 +244,4 @@ public class IndexedForest { return account.name + remotePath; } - - }