Skip to content

Commit

Permalink
Merge pull request #424 from cherylking/fixDevModeFileWatching
Browse files Browse the repository at this point in the history
Fix for dev mode file watching problem
  • Loading branch information
cherylking authored Oct 20, 2023
2 parents 590c6da + 82bc11a commit 44eb8d7
Showing 1 changed file with 47 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
import org.apache.commons.io.filefilter.NameFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.io.input.CloseShieldInputStream;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.w3c.dom.Document;
Expand Down Expand Up @@ -3257,11 +3258,13 @@ private void registerSingleFile(final File registerFile, final ThreadPoolExecuto
tempCombinedObservers.addAll(fileObservers);
tempCombinedObservers.addAll(newFileObservers);

FileAlterationObserver existingObserver = null;

// if this path is already observed, ignore it
for (FileAlterationObserver observer : tempCombinedObservers) {
if (parentPath.equals(observer.getDirectory().getCanonicalPath())) {
debug("Skipping single file polling for " + registerFile.toString() + " since its parent directory is already being observed");
return;
debug("Updating file polling for " + registerFile.toString() + " since its parent directory is already being observed");
existingObserver = observer;
}
}

Expand All @@ -3282,8 +3285,14 @@ public boolean accept(File file) {
};

try {
debug("Adding single file observer for: " + registerFile.toString());
FileAlterationObserver observer = addFileAlterationObserver(executor, parentPath, singleFileFilter);
FileAlterationObserver observer = existingObserver;
if (observer != null) {
debug("Updating parent file observer for: " + registerFile.toString());
observer = addFileAlterationObserver(executor, observer, parentPath, singleFileFilter);
} else {
debug("Adding single file observer for: " + registerFile.toString());
observer = addFileAlterationObserver(executor, parentPath, singleFileFilter);
}
if (removeOnContainerRebuild) {
debug("Adding file to containerfileDirectoriesFileObservers: " + registerFile.toString());
containerfileDirectoriesFileObservers.add(observer);
Expand All @@ -3293,6 +3302,7 @@ public boolean accept(File file) {
}
}
}

if (trackingMode == FileTrackMode.FILE_WATCHER || trackingMode == FileTrackMode.NOT_SET) {
debug("Adding directory to WatchService " + registerFile.getParentFile().toPath() + " for single file " + registerFile.getName());
WatchKey key = registerFile.getParentFile().toPath().register(
Expand All @@ -3307,6 +3317,29 @@ public boolean accept(File file) {
}
}

private FileAlterationObserver addFileAlterationObserver(final ThreadPoolExecutor executor, FileAlterationObserver observer, String parentPath, FileFilter filter)
throws Exception {
// create new observer for filter
FileAlterationObserver newObserver = getFileAlterationObserver(executor, parentPath, filter);
// iterate through existing listeners on observer and add them to newObserver
for (FileAlterationListener nextListener: observer.getListeners()) {
newObserver.addListener(nextListener);
}
newObserver.initialize();
// clean up previous observer
fileObservers.remove(observer);
newFileObservers.remove(observer);
try {
// destroy the observer
observer.destroy();
} catch (Exception e) {
debug("Could not destroy file observer", e);
}
// add new observer with the combined listeners
newFileObservers.add(newObserver);
return newObserver;
}

private FileAlterationObserver addFileAlterationObserver(final ThreadPoolExecutor executor, String parentPath, FileFilter filter)
throws Exception {
FileAlterationObserver observer = getFileAlterationObserver(executor, parentPath, filter);
Expand All @@ -3315,8 +3348,13 @@ private FileAlterationObserver addFileAlterationObserver(final ThreadPoolExecuto
return observer;
}

private FileAlterationObserver getFileAlterationObserver(final ThreadPoolExecutor executor, final String parentPath, FileFilter filter) {
private FileAlterationObserver getFileAlterationObserver(final ThreadPoolExecutor executor, final String parentPath, FileFilter filter) throws Exception {
FileAlterationObserver observer = new FileAlterationObserver(parentPath, filter);
addFileAlterationListener(executor, observer, parentPath, filter);
return observer;
}

private void addFileAlterationListener(final ThreadPoolExecutor executor, FileAlterationObserver observer, final String parentPath, FileFilter filter) {
observer.addListener(new FileAlterationListenerAdaptor() {
@Override
public void onDirectoryCreate(File file) {
Expand Down Expand Up @@ -3354,18 +3392,21 @@ private void onAlteration(final ThreadPoolExecutor executor, final String parent
try {
WatchKey wk = null;
if (watcher != null) {
wk = watcher.poll(100, TimeUnit.MILLISECONDS);
// use bigger timeout on first file change to determine FILE_WATCHER vs POLLING (issue 1741)
wk = watcher.poll(1000, TimeUnit.MILLISECONDS);
}
List<WatchEvent<?>> events = null;
if (wk != null) {
events = wk.pollEvents();
}
if ((events == null) || events.isEmpty()) {
debug("Setting file track mode to POLLING since no file watcher events were found.");
trackingMode = FileTrackMode.POLLING;
if (watcher != null) {
watcher.close();
}
} else {
debug("Setting file track mode to FILE_WATCHER.");
trackingMode = FileTrackMode.FILE_WATCHER;
disablePolling();
}
Expand All @@ -3381,7 +3422,6 @@ private void onAlteration(final ThreadPoolExecutor executor, final String parent
}
}
});
return observer;
}

/**
Expand Down

0 comments on commit 44eb8d7

Please sign in to comment.