com.sshtools.common.files.nio.AbstractFileDirectoryStream Maven / Gradle / Ivy
/**
* (c) 2002-2021 JADAPTIVE Limited. All Rights Reserved.
*
* This file is part of the Maverick Synergy Java SSH API.
*
* Maverick Synergy is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Maverick Synergy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Maverick Synergy. If not, see .
*/
package com.sshtools.common.files.nio;
import java.io.IOException;
import java.nio.file.ClosedDirectoryStreamException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.NotDirectoryException;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class AbstractFileDirectoryStream implements DirectoryStream {
private final DirectoryStream.Filter super Path> filter;
private final AbstractFileNIOFileSystem fs;
private volatile Iterator iterator;
private volatile boolean open = true;
private final Path path;
AbstractFileDirectoryStream(AbstractFilePath path, DirectoryStream.Filter super Path> filter) throws IOException {
this.fs = path.getFileSystem();
this.path = path.normalize();
this.filter = filter;
if (!Files.isDirectory(path))
throw new NotDirectoryException(path.toString());
}
@Override
public synchronized void close() throws IOException {
open = false;
}
@Override
public synchronized Iterator iterator() {
if (!open)
throw new ClosedDirectoryStreamException();
if (iterator != null)
throw new IllegalStateException();
try {
iterator = fs.iterator(path, filter);
} catch (IOException e) {
throw new IllegalStateException(e);
}
return new Iterator() {
@Override
public boolean hasNext() {
if (!open)
return false;
return iterator.hasNext();
}
@Override
public synchronized Path next() {
if (!open)
throw new NoSuchElementException();
return iterator.next();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}