Skip to content

Commit

Permalink
[IO-632] Add PathUtils for operations on NIO Path.
Browse files Browse the repository at this point in the history
Add PathUtils.cleanDirectory(Path).
  • Loading branch information
Gary Gregory committed Oct 12, 2019
1 parent 7c111fe commit b2ea4fa
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 24 deletions.
2 changes: 1 addition & 1 deletion src/main/java/org/apache/commons/io/file/Counters.java
Expand Up @@ -37,7 +37,7 @@ private static class AbstractPathCounters implements PathCounters {

/**
* Constructs a new instance.
*
*
* @param byteCounter the byte counter.
* @param directoryCounter the directory counter.
* @param fileCounter the file counter.
Expand Down
Expand Up @@ -87,7 +87,7 @@ public String toString() {

/**
* Updates the counters for visiting the given file.
*
*
* @param file the visited file.
* @param attrs the visited file attributes.
*/
Expand Down
17 changes: 14 additions & 3 deletions src/main/java/org/apache/commons/io/file/PathUtils.java
Expand Up @@ -35,6 +35,17 @@
*/
public final class PathUtils {

/**
* Cleans a directory including sub-directories without deleting directories.
*
* @param directory directory to clean.
* @return The visitor used to clean the given directory.
* @throws IOException if an I/O error is thrown by a visitor method.
*/
public static PathCounters cleanDirectory(final Path directory) throws IOException {
return visitFileTree(CleaningPathVisitor.withLongCounters(), directory).getPathCounters();
}

/**
* Counts aspects of a directory including sub-directories.
*
Expand Down Expand Up @@ -74,7 +85,7 @@ public static PathCounters delete(final Path path) throws IOException {
* @throws IOException if an I/O error is thrown by a visitor method.
*/
public static PathCounters deleteDirectory(final Path directory) throws IOException {
return visitFileTree(new DeletingPathVisitor(Counters.longPathCounters()), directory).getPathCounters();
return visitFileTree(DeletingPathVisitor.withLongCounters(), directory).getPathCounters();
}

/**
Expand Down Expand Up @@ -168,8 +179,8 @@ public static <T extends FileVisitor<? super Path>> T visitFileTree(final T visi
*
* @throws IOException if an I/O error is thrown by a visitor method
*/
public static <T extends FileVisitor<? super Path>> T visitFileTree(final T visitor, final String first, final String... more)
throws IOException {
public static <T extends FileVisitor<? super Path>> T visitFileTree(final T visitor, final String first,
final String... more) throws IOException {
return visitFileTree(visitor, Paths.get(first, more));
}

Expand Down
Expand Up @@ -50,6 +50,11 @@ public void afterEach() throws IOException {
}
}

private void applyCleanEmptyDirectory(final CleaningPathVisitor visitor) throws IOException {
Files.walkFileTree(tempDir, visitor);
assertCounts(1, 0, 0, visitor);
}

@BeforeEach
public void beforeEach() throws IOException {
tempDir = Files.createTempDirectory(getClass().getCanonicalName());
Expand All @@ -64,11 +69,6 @@ public void testCleanEmptyDirectory(final CleaningPathVisitor visitor) throws IO
applyCleanEmptyDirectory(visitor);
}

private void applyCleanEmptyDirectory(final CleaningPathVisitor visitor) throws IOException {
Files.walkFileTree(tempDir, visitor);
assertCounts(1, 0, 0, visitor);
}

/**
* Tests an empty folder.
*/
Expand Down
Expand Up @@ -47,6 +47,11 @@ public void afterEach() throws IOException {
}
}

private void applyDeleteEmptyDirectory(final DeletingPathVisitor visitor) throws IOException {
Files.walkFileTree(tempDir, visitor);
assertCounts(1, 0, 0, visitor);
}

@BeforeEach
public void beforeEach() throws IOException {
tempDir = Files.createTempDirectory(getClass().getCanonicalName());
Expand All @@ -63,11 +68,6 @@ public void testDeleteEmptyDirectory(final DeletingPathVisitor visitor) throws I
Files.deleteIfExists(tempDir);
}

private void applyDeleteEmptyDirectory(final DeletingPathVisitor visitor) throws IOException {
Files.walkFileTree(tempDir, visitor);
assertCounts(1, 0, 0, visitor);
}

/**
* Tests an empty folder.
*/
Expand Down
@@ -0,0 +1,92 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.commons.io.file;

import static org.apache.commons.io.file.CounterAssertions.assertCounts;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

/**
* Tests {@link DeletingPathVisitor}.
*/
public class PathUtilsCleanDirectoryTest {

private Path tempDir;

@AfterEach
public void afterEach() throws IOException {
// temp dir should still exist since we are cleaning and not deleting.
assertTrue(Files.exists(tempDir));
// backstop
if (Files.exists(tempDir) && PathUtils.isEmptyDirectory(tempDir)) {
Files.deleteIfExists(tempDir);
}
}

@BeforeEach
public void beforeEach() throws IOException {
tempDir = Files.createTempDirectory(getClass().getCanonicalName());
}

/**
* Tests a directory with one file of size 0.
*/
@Test
public void testCleanDirectory1FileSize0() throws IOException {
FileUtils.copyDirectory(Paths.get("src/test/resources/org/apache/commons/io/dirs-1-file-size-0").toFile(),
tempDir.toFile());
assertCounts(1, 1, 0, PathUtils.cleanDirectory(tempDir));
}

/**
* Tests a directory with one file of size 1.
*/
@Test
public void testCleanDirectory1FileSize1() throws IOException {
FileUtils.copyDirectory(Paths.get("src/test/resources/org/apache/commons/io/dirs-1-file-size-1").toFile(),
tempDir.toFile());
assertCounts(1, 1, 1, PathUtils.cleanDirectory(tempDir));
}

/**
* Tests a directory with two subdirectorys, each containing one file of size 1.
*/
@Test
public void testCleanDirectory2FileSize2() throws IOException {
FileUtils.copyDirectory(Paths.get("src/test/resources/org/apache/commons/io/dirs-2-file-size-2").toFile(),
tempDir.toFile());
assertCounts(3, 2, 2, PathUtils.cleanDirectory(tempDir));
}

/**
* Tests an empty folder.
*/
@Test
public void testCleanEmptyDirectory() throws IOException {
assertCounts(1, 0, 0, PathUtils.cleanDirectory(tempDir));
}
}
18 changes: 9 additions & 9 deletions src/test/java/org/apache/commons/io/file/TestArguments.java
Expand Up @@ -23,11 +23,11 @@

class TestArguments {

static Stream<Arguments> numberCounters() {
static Stream<Arguments> cleaningPathVisitors() {
// @formatter:off
return Stream.of(
Arguments.of(Counters.longCounter()),
Arguments.of(Counters.bigIntegerCounter()));
Arguments.of(CleaningPathVisitor.withBigIntegerCounters()),
Arguments.of(CleaningPathVisitor.withLongCounters()));
// @formatter:on
}

Expand All @@ -39,19 +39,19 @@ static Stream<Arguments> countingPathVisitors() {
// @formatter:on
}

static Stream<Arguments> cleaningPathVisitors() {
static Stream<Arguments> deletingPathVisitors() {
// @formatter:off
return Stream.of(
Arguments.of(CleaningPathVisitor.withBigIntegerCounters()),
Arguments.of(CleaningPathVisitor.withLongCounters()));
Arguments.of(DeletingPathVisitor.withBigIntegerCounters()),
Arguments.of(DeletingPathVisitor.withLongCounters()));
// @formatter:on
}

static Stream<Arguments> deletingPathVisitors() {
static Stream<Arguments> numberCounters() {
// @formatter:off
return Stream.of(
Arguments.of(DeletingPathVisitor.withBigIntegerCounters()),
Arguments.of(DeletingPathVisitor.withLongCounters()));
Arguments.of(Counters.longCounter()),
Arguments.of(Counters.bigIntegerCounter()));
// @formatter:on
}

Expand Down

0 comments on commit b2ea4fa

Please sign in to comment.