mirror of
https://github.com/iterate-ch/cyberduck.git
synced 2026-05-26 19:10:49 +00:00
Proxy querying features for delete through vault registry.
This commit is contained in:
@@ -55,7 +55,7 @@ public class BoxDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ public class BrickDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,13 +66,6 @@ public interface Delete {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return True if the implementation supports deleting folders recursively
|
||||
*/
|
||||
default boolean isRecursive() {
|
||||
return this.features().contains(Flags.recursive);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for every file deleted
|
||||
*/
|
||||
@@ -94,7 +87,7 @@ public interface Delete {
|
||||
/**
|
||||
* @return Supported features
|
||||
*/
|
||||
default EnumSet<Flags> features() {
|
||||
default EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.noneOf(Flags.class);
|
||||
}
|
||||
|
||||
|
||||
@@ -153,7 +153,7 @@ public class DefaultVersioningFeature implements Versioning {
|
||||
public void cleanup(final Path file, final ConnectionCallback callback) throws BackgroundException {
|
||||
final Delete delete = session.getFeature(Delete.class);
|
||||
if(file.isDirectory()) {
|
||||
if(!delete.isRecursive()) {
|
||||
if(!delete.features(file).contains(Delete.Flags.recursive)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,8 +75,13 @@ public class VaultRegistryDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
return proxy.features();
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
try {
|
||||
return registry.find(session, file).getFeature(session, Delete.class, proxy).features(file);
|
||||
}
|
||||
catch(VaultUnlockCancelException e) {
|
||||
return proxy.features(file);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -68,7 +68,7 @@ public class VaultRegistryTrashFeature implements Trash {
|
||||
@Override
|
||||
public void preflight(final Path file) throws BackgroundException {
|
||||
try {
|
||||
registry.find(session, file, false).getFeature(session, Delete.class, proxy).preflight(file);
|
||||
registry.find(session, file, false).getFeature(session, Trash.class, proxy).preflight(file);
|
||||
}
|
||||
catch(VaultUnlockCancelException e) {
|
||||
proxy.preflight(file);
|
||||
@@ -76,8 +76,13 @@ public class VaultRegistryTrashFeature implements Trash {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
return proxy.features();
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
try {
|
||||
return registry.find(session, file).getFeature(session, Trash.class, proxy).features(file);
|
||||
}
|
||||
catch(VaultUnlockCancelException e) {
|
||||
return proxy.features(file);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -117,8 +117,15 @@ public class DeleteWorker extends Worker<List<Path>> {
|
||||
recursive.putAll(this.compile(delete, list, new WorkerListProgressListener(this, listener), file));
|
||||
}
|
||||
// Iterate again to delete any files that can be omitted when recursive operation is supported
|
||||
if(delete.isRecursive()) {
|
||||
recursive.keySet().removeIf(f -> !f.getType().contains(Path.Type.decrypted) && recursive.keySet().stream().anyMatch(f::isChild));
|
||||
for(Iterator<Path> it = recursive.keySet().iterator(); it.hasNext(); ) {
|
||||
final Path file = it.next();
|
||||
if(delete.features(file).contains(Delete.Flags.recursive)) {
|
||||
if(!file.getType().contains(Path.Type.decrypted)) {
|
||||
if(recursive.keySet().stream().anyMatch(file::isChild)) {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
final HostPreferences preferences = HostPreferencesFactory.get(session.getHost());
|
||||
if(preferences.getBoolean("versioning.enable") && preferences.getBoolean("versioning.delete.enable")) {
|
||||
@@ -145,7 +152,7 @@ public class DeleteWorker extends Worker<List<Path>> {
|
||||
listener.message(MessageFormat.format(LocaleFactory.localizedString("Deleting {0}", "Status"), file.getName()));
|
||||
callback.delete(file);
|
||||
if(file.isDirectory()) {
|
||||
if(delete.isRecursive()) {
|
||||
if(delete.features(file).contains(Delete.Flags.recursive)) {
|
||||
files.stream().filter(f -> f.isChild(file)).forEach(callback::delete);
|
||||
}
|
||||
}
|
||||
@@ -178,7 +185,7 @@ public class DeleteWorker extends Worker<List<Path>> {
|
||||
recursive.put(file, new TransferStatus().setLockId(this.getLockId(file)));
|
||||
}
|
||||
else if(file.isDirectory()) {
|
||||
if(!delete.isRecursive() || file.getType().contains(Path.Type.decrypted)) {
|
||||
if(!delete.features(file).contains(Delete.Flags.recursive) || file.getType().contains(Path.Type.decrypted)) {
|
||||
for(Path child : list.list(file, listener).filter(filter)) {
|
||||
if(this.isCanceled()) {
|
||||
throw new ConnectionCanceledException();
|
||||
|
||||
@@ -87,8 +87,8 @@ public class DeleteWorkerTest {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRecursive() {
|
||||
return true;
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -133,8 +133,8 @@ public class DeleteWorkerTest {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRecursive() {
|
||||
return true;
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -182,11 +182,6 @@ public class DeleteWorkerTest {
|
||||
public void delete(final Map<Path, TransferStatus> files, final PasswordCallback prompt, final Callback callback) {
|
||||
assertEquals(new Path("/s", EnumSet.of(Path.Type.directory, AbstractPath.Type.symboliclink)), new ArrayList<>(files.keySet()).get(0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRecursive() {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
return super._getFeature(type);
|
||||
|
||||
@@ -69,11 +69,6 @@ public class MoveWorkerTest {
|
||||
count.incrementAndGet();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRecursive() {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
if(type == Directory.class) {
|
||||
|
||||
+3
-3
@@ -93,7 +93,7 @@ public class CryptoDeleteV6Feature implements Delete, Trash {
|
||||
if(f.equals(vault.getHome())) {
|
||||
log.warn("Recursively delete vault {}", f);
|
||||
final List<Path> metadata = new ArrayList<>();
|
||||
if(!proxy.isRecursive()) {
|
||||
if(!proxy.features(f).contains(Delete.Flags.recursive)) {
|
||||
final Find find = session._getFeature(Find.class);
|
||||
final Path dataRoot = new Path(f, "d", f.getType());
|
||||
if(find.find(dataRoot)) {
|
||||
@@ -128,8 +128,8 @@ public class CryptoDeleteV6Feature implements Delete, Trash {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
return proxy.features();
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return proxy.features(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+3
-3
@@ -114,7 +114,7 @@ public class CryptoDeleteV7Feature implements Delete, Trash {
|
||||
if(f.equals(vault.getHome())) {
|
||||
log.warn("Recursively delete vault {}", f);
|
||||
final List<Path> metadata = new ArrayList<>();
|
||||
if(!proxy.isRecursive()) {
|
||||
if(!proxy.features(f).contains(Delete.Flags.recursive)) {
|
||||
final Find find = session._getFeature(Find.class);
|
||||
final Path dataRoot = new Path(f, "d", f.getType());
|
||||
if(find.find(dataRoot)) {
|
||||
@@ -143,8 +143,8 @@ public class CryptoDeleteV7Feature implements Delete, Trash {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
return proxy.features();
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return proxy.features(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
-10
@@ -86,11 +86,6 @@ public class CryptoBulkFeatureTest {
|
||||
public void delete(final Map<Path, TransferStatus> files, final PasswordCallback prompt, final Callback callback) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRecursive() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}, cryptomator);
|
||||
final HashMap<TransferItem, TransferStatus> files = new HashMap<>();
|
||||
final Path directory = new Path("/vault/directory", EnumSet.of(Path.Type.directory));
|
||||
@@ -159,11 +154,6 @@ public class CryptoBulkFeatureTest {
|
||||
public void delete(final Map<Path, TransferStatus> files, final PasswordCallback prompt, final Callback callback) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRecursive() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}, cryptomator);
|
||||
final HashMap<TransferItem, TransferStatus> files = new HashMap<>();
|
||||
final Path directory = new Path("/vault/directory", EnumSet.of(Path.Type.directory));
|
||||
|
||||
@@ -67,7 +67,7 @@ public class DeepboxTrashFeature implements Trash {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ public class SDSBatchDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ public class SDSDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public class SDSThresholdDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ import ch.cyberduck.core.DisabledLoginCallback;
|
||||
import ch.cyberduck.core.Path;
|
||||
import ch.cyberduck.core.exception.NotfoundException;
|
||||
import ch.cyberduck.core.features.Delete;
|
||||
import ch.cyberduck.core.features.Home;
|
||||
import ch.cyberduck.core.transfer.TransferStatus;
|
||||
import ch.cyberduck.test.IntegrationTest;
|
||||
|
||||
@@ -101,6 +102,6 @@ public class SDSBatchDeleteFeatureTest extends AbstractSDSTest {
|
||||
@Test
|
||||
public void testIsRecursive() {
|
||||
final SDSNodeIdProvider nodeid = new SDSNodeIdProvider(session);
|
||||
assertTrue(new SDSBatchDeleteFeature(session, nodeid).isRecursive());
|
||||
assertTrue(new SDSBatchDeleteFeature(session, nodeid).features(Home.root()).contains(Delete.Flags.recursive));
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@ import ch.cyberduck.core.PathAttributes;
|
||||
import ch.cyberduck.core.exception.AntiVirusAccessDeniedException;
|
||||
import ch.cyberduck.core.exception.NotfoundException;
|
||||
import ch.cyberduck.core.features.Delete;
|
||||
import ch.cyberduck.core.features.Home;
|
||||
import ch.cyberduck.core.io.BandwidthThrottle;
|
||||
import ch.cyberduck.core.io.DisabledStreamListener;
|
||||
import ch.cyberduck.core.sds.io.swagger.client.api.NodesApi;
|
||||
@@ -132,7 +133,7 @@ public class SDSDeleteFeatureTest extends AbstractSDSTest {
|
||||
@Test
|
||||
public void testIsRecursive() {
|
||||
final SDSNodeIdProvider nodeid = new SDSNodeIdProvider(session);
|
||||
assertTrue(new SDSDeleteFeature(session, nodeid).isRecursive());
|
||||
assertTrue(new SDSDeleteFeature(session, nodeid).features(Home.root()).contains(Delete.Flags.recursive));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -15,6 +15,8 @@ package ch.cyberduck.core.sds;
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
import ch.cyberduck.core.features.Delete;
|
||||
import ch.cyberduck.core.features.Home;
|
||||
import ch.cyberduck.test.IntegrationTest;
|
||||
|
||||
import org.junit.Test;
|
||||
@@ -28,6 +30,6 @@ public class SDSThresholdDeleteFeatureTest extends AbstractSDSTest {
|
||||
@Test
|
||||
public void testIsRecursive() {
|
||||
final SDSNodeIdProvider nodeid = new SDSNodeIdProvider(session);
|
||||
assertTrue(new SDSThresholdDeleteFeature(session, nodeid).isRecursive());
|
||||
assertTrue(new SDSThresholdDeleteFeature(session, nodeid).features(Home.root()).contains(Delete.Flags.recursive));
|
||||
}
|
||||
}
|
||||
@@ -148,7 +148,7 @@ public class DropboxBatchDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ public class DropboxDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ public class DropboxThresholdDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ public class EueTrashFeature implements Trash {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -125,7 +125,7 @@ public class DriveBatchDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ public class DriveBatchTrashFeature implements Trash {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
@@ -73,7 +73,7 @@ public class DriveDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -49,7 +49,7 @@ public class DriveThresholdDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ public class DriveThresholdTrashFeature implements Trash {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ public class DriveTrashFeature implements Trash {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public class IRODSDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ public class MantaDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ public class GraphDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public class SMBDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ public class SpectraDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ public class StoregateDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ public class DAVDeleteFeature implements Delete {
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumSet<Flags> features() {
|
||||
public EnumSet<Flags> features(final Path file) {
|
||||
return EnumSet.of(Flags.recursive);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user