diff --git a/filescanner/src/FileCounterTask.java b/filescanner/src/FileCounterTask.java new file mode 100644 index 0000000..dd5b708 --- /dev/null +++ b/filescanner/src/FileCounterTask.java @@ -0,0 +1,68 @@ +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.RecursiveTask; +import java.util.concurrent.atomic.AtomicLong; + +public class FileCounterTask extends RecursiveTask { + + /** + * Current processed file + */ + protected final File mFile; + /** + * All documents in folder + */ + protected final AtomicLong mDocumentCount; + /** + * Directories count + */ + protected final AtomicLong mFolderCount; + FileCounterTask(File file, AtomicLong mDocumentCount, AtomicLong mFolderCount) { + this.mFile = file; + this.mDocumentCount = new AtomicLong(0); + this.mFolderCount = new AtomicLong(0); + } + + /** + * + * @return files number + */ + public AtomicLong documentCount() { + return mDocumentCount; + }; + + /** + * + * @return directories number + */ + public AtomicLong folderCount() { + return mFolderCount; + } + + @Override + protected Long compute() { + if (mFile.isFile()) { + mDocumentCount.incrementAndGet(); + } else { + mFolderCount.incrementAndGet(); + } + + List> forkJoinTaskList = new ArrayList<>(); + for(File file: Objects.requireNonNull(mFile.listFiles())) { + //the task for each File + forkJoinTaskList.add( + new FileCounterTask(file, mDocumentCount, mFolderCount).fork()); + } + + long sum = 0; + + for (ForkJoinTask forkJoinTask: forkJoinTaskList) { + sum += forkJoinTask.join(); + } + + return sum; + } +}