Skip to content

Commit

Permalink
polish filter
Browse files Browse the repository at this point in the history
  • Loading branch information
dk900912 committed Oct 27, 2022
1 parent ae2545a commit aa11308
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 19 deletions.
14 changes: 12 additions & 2 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,21 @@
<a href="https://github.com/dk900912/file-watcher/stargazers"><img src="https://img.shields.io/github/stars/dk900912/file-watcher" alt="GitHub Stars"></a>
<a href="https://github.com/dk900912/file-watcher/fork"><img src="https://img.shields.io/github/forks/dk900912/file-watcher" alt="GitHub Forks"></a>
<a href="https://github.com/dk900912/file-watcher/issues"><img src="https://img.shields.io/github/issues/dk900912/file-watcher" alt="GitHub issues"></a>
<a href="https://github.com/dk900912/efile-watcher/graphs/contributors"><img src="https://img.shields.io/github/contributors/dk900912/file-watcher" alt="GitHub Contributors"></a>
<a href="https://github.com/dk900912/file-watcher/graphs/contributors"><img src="https://img.shields.io/github/contributors/dk900912/file-watcher" alt="GitHub Contributors"></a>
<a href="https://github.com/dk900912/file-watcher"><img src="https://img.shields.io/github/repo-size/dk900912/file-watcher" alt="GitHub repo size"></a>
</p>

>> 很简单的功能,但由于之前写的很 low,这次实现尽量更加地面向对象罢了。
>> 本地文件变更监听是很简单的功能,但由于之前写的很 low,这次实现尽量更加地面向对象罢了。对于文件的重命名会先触发 ADD 事件,然后才是 DELETE 事件!
### How to use
```xml
<dependency>
<groupId>io.github.dk900912</groupId>
<artifactId>file-watcher</artifactId>
<version>1.0.1</version>
</dependency>
```

```java
public class FileWatcherApplication {
public static void main(String[] args) {
Expand All @@ -21,6 +29,8 @@ public class FileWatcherApplication {
File directory1 = new File("C:\\Users\\dk900912\\IdeaProjects\\test");
File directory2 = new File("C:\\Users\\dk900912\\IdeaProjects\\tset");
fileWatcher.addSourceDirectories(Arrays.asList(directory1, directory2));
// 仅仅监听 txt 文本文件的变更
fileWatcher.setFileFilter(pathname -> pathname.getName().endsWith(".txt"));
fileWatcher.start();

for (;;){
Expand Down
10 changes: 8 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>io.github.dk900912</groupId>
<artifactId>file-watcher</artifactId>
<version>1.0.0</version>
<version>1.0.1</version>

<name>file-watcher</name>
<description>Watching specific directories for file changes.</description>
Expand Down Expand Up @@ -46,9 +46,15 @@
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
<version>${slf4j.version}</version>
</dependency>

</dependencies>

<distributionManagement>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public class FileSystemWatcher {

private Thread watchThread;

private FileFilter triggerFilter;
private FileFilter fileFilter;

private final Object monitor = new Object();

Expand Down Expand Up @@ -97,9 +97,9 @@ public void addSourceDirectory(File directory) {
}
}

public void setTriggerFilter(FileFilter triggerFilter) {
public void setFileFilter(FileFilter fileFilter) {
synchronized (this.monitor) {
this.triggerFilter = triggerFilter;
this.fileFilter = fileFilter;
}
}

Expand All @@ -117,7 +117,7 @@ public void start() {
createOrRestoreInitialSnapshots();
if (this.watchThread == null) {
Map<File, DirectorySnapshot> localDirectories = new HashMap<>(this.directories);
Watcher watcher = new Watcher(this.remainingScans, new ArrayList<>(this.listeners), this.triggerFilter,
Watcher watcher = new Watcher(this.remainingScans, new ArrayList<>(this.listeners), this.fileFilter,
this.pollInterval, this.quietPeriod, localDirectories, this.snapshotStateRepository);
this.watchThread = new Thread(watcher);
this.watchThread.setName("File Watcher");
Expand Down Expand Up @@ -174,7 +174,7 @@ private static final class Watcher implements Runnable {

private final List<FileChangeListener> listeners;

private final FileFilter triggerFilter;
private final FileFilter fileFilter;

private final long pollInterval;

Expand All @@ -184,12 +184,12 @@ private static final class Watcher implements Runnable {

private final SnapshotStateRepository snapshotStateRepository;

private Watcher(AtomicInteger remainingScans, List<FileChangeListener> listeners, FileFilter triggerFilter,
private Watcher(AtomicInteger remainingScans, List<FileChangeListener> listeners, FileFilter fileFilter,
long pollInterval, long quietPeriod, Map<File, DirectorySnapshot> directories,
SnapshotStateRepository snapshotStateRepository) {
this.remainingScans = remainingScans;
this.listeners = listeners;
this.triggerFilter = triggerFilter;
this.fileFilter = fileFilter;
this.pollInterval = pollInterval;
this.quietPeriod = quietPeriod;
this.directories = directories;
Expand Down Expand Up @@ -234,7 +234,7 @@ private boolean isDifferent(Map<File, DirectorySnapshot> previous, Map<File, Dir
for (Map.Entry<File, DirectorySnapshot> entry : previous.entrySet()) {
DirectorySnapshot previousDirectory = entry.getValue();
DirectorySnapshot currentDirectory = current.get(entry.getKey());
if (!previousDirectory.equals(currentDirectory, this.triggerFilter)) {
if (!previousDirectory.equals(currentDirectory, this.fileFilter)) {
return true;
}
}
Expand All @@ -255,7 +255,7 @@ private void updateSnapshots(Collection<DirectorySnapshot> snapshots) {
for (DirectorySnapshot snapshot : snapshots) {
DirectorySnapshot previous = this.directories.get(snapshot.getDirectory());
updated.put(snapshot.getDirectory(), snapshot);
ChangedFiles changedFiles = previous.getChangedFiles(snapshot, this.triggerFilter);
ChangedFiles changedFiles = previous.getChangedFiles(snapshot, this.fileFilter);
if (!changedFiles.getFiles().isEmpty()) {
changeSet.add(changedFiles);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.github.dk900912.filewatcher.listener;

import io.github.dk900912.filewatcher.SnapshotStateRepository;
import io.github.dk900912.filewatcher.model.ChangedFile;
import io.github.dk900912.filewatcher.model.ChangedFiles;
import org.slf4j.Logger;
Expand All @@ -8,6 +9,8 @@
import java.util.Set;

/**
* Simple implementation for {@link SnapshotStateRepository}, just logging.
*
* @author dukui
*/
public class SimpleFileChangeListener implements FileChangeListener {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
*/
public final class DirectorySnapshot {

private static final Set<String> DOTS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(".", "..")));
private static final Set<String> DOTS
= Collections.unmodifiableSet(new HashSet<>(Arrays.asList(".", "..")));

private final File directory;

Expand Down Expand Up @@ -59,15 +60,15 @@ private void collectFiles(File source, Set<FileSnapshot> result) {
}
}

public ChangedFiles getChangedFiles(DirectorySnapshot snapshot, FileFilter triggerFilter) {
public ChangedFiles getChangedFiles(DirectorySnapshot snapshot, FileFilter fileFilter) {
Assert.notNull(snapshot, "Snapshot must not be null");
File directory = this.directory;
Assert.isTrue(snapshot.directory.equals(directory),
() -> "Snapshot source directory must be '" + directory + "'");
Set<ChangedFile> changes = new LinkedHashSet<>();
Map<File, FileSnapshot> previousFiles = getFilesMap();
for (FileSnapshot currentFile : snapshot.files) {
if (acceptChangedFile(triggerFilter, currentFile)) {
if (acceptChangedFile(fileFilter, currentFile)) {
FileSnapshot previousFile = previousFiles.remove(currentFile.getFile());
if (previousFile == null) {
changes.add(new ChangedFile(directory, currentFile.getFile(), ADD));
Expand All @@ -77,7 +78,7 @@ public ChangedFiles getChangedFiles(DirectorySnapshot snapshot, FileFilter trigg
}
}
for (FileSnapshot previousFile : previousFiles.values()) {
if (acceptChangedFile(triggerFilter, previousFile)) {
if (acceptChangedFile(fileFilter, previousFile)) {
changes.add(new ChangedFile(directory, previousFile.getFile(), DELETE));
}
}
Expand Down Expand Up @@ -125,8 +126,8 @@ public String toString() {
return this.directory + " snapshot at " + this.time;
}

private boolean acceptChangedFile(FileFilter triggerFilter, FileSnapshot file) {
return (triggerFilter == null || !triggerFilter.accept(file.getFile()));
private boolean acceptChangedFile(FileFilter fileFilter, FileSnapshot file) {
return (fileFilter == null || fileFilter.accept(file.getFile()));
}

private Map<File, FileSnapshot> getFilesMap() {
Expand Down

0 comments on commit aa11308

Please sign in to comment.