mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00
GP-5908 Corrected excessive folder change notifications on first visit
to parent
This commit is contained in:
parent
6dd00be368
commit
c99af66f5f
2 changed files with 29 additions and 35 deletions
|
@ -339,11 +339,7 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
|
||||||
sharedFS.createFolder("/", "b");
|
sharedFS.createFolder("/", "b");
|
||||||
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
||||||
assertEquals(3, root.getFolders().length);
|
assertEquals(3, root.getFolders().length);
|
||||||
assertEventsSize(3);
|
assertEventsSize(0);
|
||||||
|
|
||||||
checkEvent(events.get(0), "Folder Added", null, "/a", null, null, null);
|
|
||||||
checkEvent(events.get(1), "Folder Added", null, "/b", null, null, null);
|
|
||||||
checkEvent(events.get(2), "Folder Added", null, "/c", null, null, null);
|
|
||||||
|
|
||||||
sharedFS.createFolder("/b", "subB");
|
sharedFS.createFolder("/b", "subB");
|
||||||
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
||||||
|
@ -487,12 +483,9 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
|
||||||
root.getFolders(); // visit root folder to receive change events for it
|
root.getFolders(); // visit root folder to receive change events for it
|
||||||
sharedFS.renameFolder("/", "a", "bigA");
|
sharedFS.renameFolder("/", "a", "bigA");
|
||||||
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
||||||
assertEventsSize(4);
|
assertEventsSize(1);
|
||||||
|
|
||||||
checkEvent(events.get(0), "Folder Added", null, "/a", null, null, null);
|
checkEvent(events.get(0), "Folder Added", null, "/bigA", null, null, null);
|
||||||
checkEvent(events.get(1), "Folder Added", null, "/b", null, null, null);
|
|
||||||
checkEvent(events.get(2), "Folder Added", null, "/c", null, null, null);
|
|
||||||
checkEvent(events.get(3), "Folder Added", null, "/bigA", null, null, null);
|
|
||||||
|
|
||||||
// versioned folder was renamed to /bigA, but private folder /a should still exist
|
// versioned folder was renamed to /bigA, but private folder /a should still exist
|
||||||
|
|
||||||
|
@ -516,11 +509,9 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
|
||||||
sharedFS.renameFolder("/a", "y", "bigY");
|
sharedFS.renameFolder("/a", "y", "bigY");
|
||||||
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
||||||
|
|
||||||
assertEventsSize(4);
|
assertEventsSize(2);
|
||||||
checkEvent(events.get(0), "Folder Added", null, "/a/x", null, null, null);
|
checkEvent(events.get(0), "Folder Removed", "/a", null, null, null, "y");
|
||||||
checkEvent(events.get(1), "Folder Added", null, "/a/y", null, null, null);
|
checkEvent(events.get(1), "Folder Added", null, "/a/bigY", null, null, null);
|
||||||
checkEvent(events.get(2), "Folder Removed", "/a", null, null, null, "y");
|
|
||||||
checkEvent(events.get(3), "Folder Added", null, "/a/bigY", null, null, null);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -532,12 +523,9 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
|
||||||
assertNull(root.getFolder("c"));
|
assertNull(root.getFolder("c"));
|
||||||
assertNotNull(root.getFolder("bigC"));
|
assertNotNull(root.getFolder("bigC"));
|
||||||
|
|
||||||
assertEventsSize(5);
|
assertEventsSize(2);
|
||||||
checkEvent(events.get(0), "Folder Added", null, "/a", null, null, null);
|
checkEvent(events.get(0), "Folder Removed", "/", null, null, null, "c");
|
||||||
checkEvent(events.get(1), "Folder Added", null, "/b", null, null, null);
|
checkEvent(events.get(1), "Folder Added", null, "/bigC", null, null, null);
|
||||||
checkEvent(events.get(2), "Folder Added", null, "/c", null, null, null);
|
|
||||||
checkEvent(events.get(3), "Folder Removed", "/", null, null, null, "c");
|
|
||||||
checkEvent(events.get(4), "Folder Added", null, "/bigC", null, null, null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -614,12 +602,9 @@ public class DefaultProjectDataTest extends AbstractGhidraHeadedIntegrationTest
|
||||||
|
|
||||||
sharedFS.moveFolder("/", "a", "/c");
|
sharedFS.moveFolder("/", "a", "/c");
|
||||||
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
flushFileSystemEvents(); // wait for FileSystemListener callback to update folder
|
||||||
assertEventsSize(4);
|
assertEventsSize(1);
|
||||||
|
|
||||||
checkEvent(events.get(0), "Folder Added", null, "/a", null, null, null);
|
checkEvent(events.get(0), "Folder Added", null, "/c/a", null, null, null);
|
||||||
checkEvent(events.get(1), "Folder Added", null, "/b", null, null, null);
|
|
||||||
checkEvent(events.get(2), "Folder Added", null, "/c", null, null, null);
|
|
||||||
checkEvent(events.get(3), "Folder Added", null, "/c/a", null, null, null);
|
|
||||||
|
|
||||||
// versioned folder was moved to /c/a, but private folder /a should still exist
|
// versioned folder was moved to /c/a, but private folder /a should still exist
|
||||||
|
|
||||||
|
|
|
@ -558,12 +558,14 @@ class GhidraFolderData {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Refresh set of sub-folder names and identify added/removed folders.
|
* Refresh set of sub-folder names and notify about adds/removes if appropriate
|
||||||
* @param recursive recurse into visited subfolders if true
|
* @param recursive recurse into visited subfolders if true
|
||||||
|
* @param notifyAdd true if listener should be notified about newly discovered subfolders
|
||||||
* @param monitor recursion task monitor - break from recursion if cancelled
|
* @param monitor recursion task monitor - break from recursion if cancelled
|
||||||
* @throws IOException if an IO error occurs during the refresh
|
* @throws IOException if an IO error occurs during the refresh
|
||||||
*/
|
*/
|
||||||
private void refreshFolders(boolean recursive, TaskMonitor monitor) throws IOException {
|
private void refreshFolders(boolean recursive, boolean notifyAdd, TaskMonitor monitor)
|
||||||
|
throws IOException {
|
||||||
|
|
||||||
// FIXME: inconsistent use of forced-recursive refresh and cached folderList
|
// FIXME: inconsistent use of forced-recursive refresh and cached folderList
|
||||||
|
|
||||||
|
@ -630,7 +632,7 @@ class GhidraFolderData {
|
||||||
GhidraFolderData folderData = addFolderData(folderName);
|
GhidraFolderData folderData = addFolderData(folderName);
|
||||||
if (folderData != null) {
|
if (folderData != null) {
|
||||||
folderList.add(folderName);
|
folderList.add(folderName);
|
||||||
if (visited) {
|
if (notifyAdd) {
|
||||||
listener.domainFolderAdded(folderData.getDomainFolder());
|
listener.domainFolderAdded(folderData.getDomainFolder());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -678,7 +680,13 @@ class GhidraFolderData {
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void refreshFiles(TaskMonitor monitor) throws IOException {
|
/**
|
||||||
|
* Refresh set of files and notify about adds/removes if appropriate
|
||||||
|
* @param notifyAdd true if listener should be notified about newly discovered files
|
||||||
|
* @param monitor return immediately if cancelled
|
||||||
|
* @throws IOException if an IO error occurs during the refresh
|
||||||
|
*/
|
||||||
|
private void refreshFiles(boolean notifyAdd, TaskMonitor monitor) throws IOException {
|
||||||
|
|
||||||
String path = getPathname();
|
String path = getPathname();
|
||||||
|
|
||||||
|
@ -744,7 +752,7 @@ class GhidraFolderData {
|
||||||
FolderItem versionedFolderItem = versionedItemMap.get(fileName);
|
FolderItem versionedFolderItem = versionedItemMap.get(fileName);
|
||||||
|
|
||||||
GhidraFileData fileData = addFileData(fileName, localFolderItem, versionedFolderItem);
|
GhidraFileData fileData = addFileData(fileName, localFolderItem, versionedFolderItem);
|
||||||
if (visited) {
|
if (notifyAdd) {
|
||||||
listener.domainFileAdded(fileData.getDomainFile());
|
listener.domainFileAdded(fileData.getDomainFile());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -791,6 +799,7 @@ class GhidraFolderData {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean notifyAdd = visited;
|
||||||
visited = true;
|
visited = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -812,13 +821,13 @@ class GhidraFolderData {
|
||||||
|
|
||||||
// FIXME: If forced we should be refreshing folder/file lists
|
// FIXME: If forced we should be refreshing folder/file lists
|
||||||
|
|
||||||
refreshFiles(monitor);
|
refreshFiles(notifyAdd, monitor);
|
||||||
|
|
||||||
if (monitor != null && monitor.isCancelled()) {
|
if (monitor != null && monitor.isCancelled()) {
|
||||||
return; // break-out from recursion on cancel
|
return; // break-out from recursion on cancel
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshFolders(recursive, monitor);
|
refreshFolders(recursive, notifyAdd, monitor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue