Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@
import oap.testng.SystemTimerFixture;
import oap.testng.TestDirectoryFixture;
import org.apache.commons.io.FilenameUtils;
import org.jetbrains.annotations.NotNull;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.testng.annotations.Test;

import javax.annotation.Nonnull;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

Expand Down Expand Up @@ -144,13 +145,25 @@ public void testCopy() {
}
}

@NotNull
@Nonnull
private FileSystemConfiguration getFileSystemConfiguration() {
return new FileSystemConfiguration( Map.of(
return getFileSystemConfiguration( false );
}

@Nonnull
private FileSystemConfiguration getFileSystemConfiguration( boolean removeEmptyFolders ) {
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
map.putAll( Map.of(
"fs.default.clouds.scheme", "file",
"fs.default.clouds.container", "",
"fs.file.clouds.filesystem.basedir", basedir
) );

if( removeEmptyFolders ) {
map.put( "fs.file.clouds.filesystem.remove_empty_folders", true );
}

return new FileSystemConfiguration( map );
}

@Test
Expand Down Expand Up @@ -268,4 +281,38 @@ public void testFolder() {
assertThat( fileSystem.getMetadata( new CloudURI( "file://test-bucket/folder/" ) ).getContentType() ).isEqualTo( "application/x-directory" );
}
}

@Test
public void testDeleteFileAndParentFolderIfEmpty() {
// 1. remove_empty_folders disabled -> parent folders remain after delete
try( FileSystem fileSystem = new FileSystem( getFileSystemConfiguration() ) ) {
fileSystem.upload( new CloudURI( "file://case1/folder1/folder2/file.txt" ), BlobData.builder().content( "content" ).build() );

fileSystem.deleteBlob( new CloudURI( "file://case1/folder1/folder2/file.txt" ) );

assertFile( basedir.resolve( "case1/folder1/folder2/file.txt" ) ).doesNotExist();
assertThat( basedir.resolve( "case1/folder1/folder2" ) ).exists();
}

// 2. enabled -> empty folder2 removed, folder1 kept (still has file2.txt)
try( FileSystem fileSystem = new FileSystem( getFileSystemConfiguration( true ) ) ) {
fileSystem.upload( new CloudURI( "file://case2/folder1/folder2/file.txt" ), BlobData.builder().content( "content" ).build() );
fileSystem.upload( new CloudURI( "file://case2/folder1/file2.txt" ), BlobData.builder().content( "content2" ).build() );

fileSystem.deleteBlob( new CloudURI( "file://case2/folder1/folder2/file.txt" ) );

assertThat( basedir.resolve( "case2/folder1/folder2" ) ).doesNotExist();
assertThat( basedir.resolve( "case2/folder1" ) ).exists();
}

// 3. enabled -> whole empty chain removed up to basedir
try( FileSystem fileSystem = new FileSystem( getFileSystemConfiguration( true ) ) ) {
fileSystem.upload( new CloudURI( "file://case3/folder1/folder2/file.txt" ), BlobData.builder().content( "content" ).build() );

fileSystem.deleteBlob( new CloudURI( "file://case3/folder1/folder2/file.txt" ) );

assertThat( basedir.resolve( "case3/folder1/folder2" ) ).doesNotExist();
assertThat( basedir.resolve( "case3/folder1" ) ).doesNotExist();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
public class FileSystemCloudApiLocalFs implements FileSystemCloudApi {

private final Path basedir;
private final boolean removeEmptyFolders;

public FileSystemCloudApiLocalFs( FileSystemConfiguration fileSystemConfiguration, String container ) {
String basedir = ( String ) fileSystemConfiguration.get( "file", container, "jclouds.filesystem.basedir" );
Expand All @@ -37,6 +38,9 @@ public FileSystemCloudApiLocalFs( FileSystemConfiguration fileSystemConfiguratio
}

this.basedir = Paths.get( basedir );

Object removeEmptyFolders = fileSystemConfiguration.get( "file", container, "jclouds.filesystem.remove_empty_folders" );
this.removeEmptyFolders = removeEmptyFolders != null && Boolean.parseBoolean( removeEmptyFolders.toString() );
}

@Override
Expand All @@ -56,7 +60,17 @@ public CompletableFuture<Boolean> containerExistsAsync( CloudURI path ) throws C
@Override
public CompletableFuture<Void> deleteBlobAsync( CloudURI path ) {
try {
Files.delete( getPath( path ) );
Path fsPath = getPath( path );
Files.delete( fsPath );

if( removeEmptyFolders ) {
Path parent = fsPath.getParent();
while( parent != null && !parent.equals( basedir ) && parent.startsWith( basedir )
&& oap.io.Files.isDirectoryEmpty( parent ) ) {
Files.delete( parent );
parent = parent.getParent();
}
}

return CompletableFuture.completedFuture( null );
} catch( IOException e ) {
Expand Down
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>oap</groupId>
<artifactId>oap.maven</artifactId>
<version>25.1.0</version>
<version>25.3.0</version>
</parent>

<packaging>pom</packaging>
Expand All @@ -19,7 +19,7 @@
<dependency>
<groupId>oap</groupId>
<artifactId>oap-dependencies</artifactId>
<version>25.1.0</version>
<version>25.3.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand Down Expand Up @@ -66,7 +66,7 @@
</dependencies>

<properties>
<oap.project.version>25.9.0</oap.project.version>
<oap.project.version>25.9.1</oap.project.version>

<oap.deps.config.version>25.0.1</oap.deps.config.version>
<oap.deps.oap-teamcity.version>25.0.0</oap.deps.oap-teamcity.version>
Expand Down
Loading