Lines 239-244
Link Here
|
239 |
assertGC("FileChangeListener not collected.", ref); |
239 |
assertGC("FileChangeListener not collected.", ref); |
240 |
} |
240 |
} |
241 |
|
241 |
|
|
|
242 |
public void testAddRecursiveListener() throws IOException, InterruptedException { |
243 |
clearWorkDir(); |
244 |
File rootF = getWorkDir(); |
245 |
File dirF = new File(rootF, "dir"); |
246 |
File fileF = new File(dirF, "subdir"); |
247 |
|
248 |
// adding listeners |
249 |
TestFileChangeListener fcl = new TestFileChangeListener(); |
250 |
FileUtil.addRecursiveListener(fcl, fileF); |
251 |
try { |
252 |
FileUtil.addRecursiveListener(fcl, fileF); |
253 |
fail("Should not be possible to add listener for the same path."); |
254 |
} catch (IllegalArgumentException iae) { |
255 |
// ok |
256 |
} |
257 |
TestFileChangeListener fcl2 = new TestFileChangeListener(); |
258 |
try { |
259 |
FileUtil.removeRecursiveListener(fcl2, fileF); |
260 |
fail("Should not be possible to remove listener which is not registered."); |
261 |
} catch (IllegalArgumentException iae) { |
262 |
// ok |
263 |
} |
264 |
FileUtil.addRecursiveListener(fcl2, fileF); |
265 |
|
266 |
// creation |
267 |
final FileObject rootFO = FileUtil.toFileObject(rootF); |
268 |
FileObject dirFO = rootFO.createFolder("dir"); |
269 |
assertEquals("Event fired when just parent dir created.", 0, fcl.checkAll()); |
270 |
FileObject fileFO = FileUtil.createData(dirFO, "subdir/subsubdir/file"); |
271 |
assertEquals("Event not fired when file was created.", 3, fcl.check(EventType.FOLDER_CREATED)); |
272 |
assertEquals("Event not fired when file was created.", 3, fcl2.check(EventType.FOLDER_CREATED)); |
273 |
FileObject fileFO2 = FileUtil.createData(dirFO, "subdir/subsubdir/file2"); |
274 |
assertEquals("Event not fired when file was created.", 2, fcl.check(EventType.DATA_CREATED)); |
275 |
assertEquals("Event not fired when file was created.", 2, fcl2.check(EventType.DATA_CREATED)); |
276 |
FileObject fileAFO = FileUtil.createData(dirFO, "fileA"); |
277 |
assertEquals("No other events should be fired.", 0, fcl.checkAll()); |
278 |
|
279 |
// remove listener |
280 |
FileUtil.removeRecursiveListener(fcl2, fileF); |
281 |
fcl2.disabled = true; |
282 |
assertEquals("No other events should be fired.", 0, fcl2.checkAll()); |
283 |
|
284 |
// modification |
285 |
fileFO.getOutputStream().close(); |
286 |
fileFO.getOutputStream().close(); |
287 |
assertEquals("Event not fired when file was modified.", 2, fcl.check(EventType.CHANGED)); |
288 |
// no event fired when other file modified |
289 |
fileAFO.getOutputStream().close(); |
290 |
assertEquals("No other events should be fired.", 0, fcl.checkAll()); |
291 |
|
292 |
// deletion |
293 |
fileFO.delete(); |
294 |
assertEquals("Event not fired when file deleted.", 1, fcl.check(EventType.DELETED)); |
295 |
dirFO.delete(); |
296 |
assertEquals("Event not fired when parent dir deleted.", 2, fcl.checkAll()); |
297 |
dirFO = rootFO.createFolder("dir"); |
298 |
fileFO = FileUtil.createData(dirFO, "subdir/subsubdir/file"); |
299 |
assertEquals("Event not fired when file was created.", 1, fcl.check(EventType.DATA_CREATED)); |
300 |
assertEquals("Event not fired when dirs created.", 3, fcl.check(EventType.FOLDER_CREATED)); |
301 |
dirFO.delete(); |
302 |
assertEquals("Event not fired when parent dir deleted.", 2, fcl.check(EventType.DELETED)); |
303 |
assertEquals("No other events should be fired.", 0, fcl.checkAll()); |
304 |
|
305 |
// atomic action |
306 |
FileUtil.runAtomicAction(new Runnable() { |
307 |
|
308 |
public void run() { |
309 |
FileObject dirFO; |
310 |
try { |
311 |
dirFO = rootFO.createFolder("dir"); |
312 |
rootFO.createFolder("fakedir"); |
313 |
rootFO.setAttribute("fake", "fake"); |
314 |
rootFO.createData("fakefile"); |
315 |
FileUtil.createData(dirFO, "subdir/subsubdir/file"); |
316 |
} catch (IOException ex) { |
317 |
throw new RuntimeException(ex); |
318 |
} |
319 |
|
320 |
} |
321 |
}); |
322 |
assertEquals("Notifying the folder creation only.", 1, fcl.check(EventType.FOLDER_CREATED)); |
323 |
assertEquals("No other events should be fired.", 0, fcl.checkAll()); |
324 |
|
325 |
// rename |
326 |
dirFO = FileUtil.toFileObject(dirF); |
327 |
fileFO = FileUtil.toFileObject(fileF); |
328 |
FileLock lock = dirFO.lock(); |
329 |
dirFO.rename(lock, "dirRenamed", null); |
330 |
lock.releaseLock(); |
331 |
assertEquals("Event fired when parent dir renamed.", 0, fcl.checkAll()); |
332 |
lock = fileFO.lock(); |
333 |
fileFO.rename(lock, "fileRenamed", null); |
334 |
lock.releaseLock(); |
335 |
assertEquals("Renamed event not fired.", 2, fcl.check(EventType.RENAMED)); |
336 |
assertEquals("No other events should be fired.", 0, fcl.checkAll()); |
337 |
|
338 |
// disk changes |
339 |
dirF.mkdir(); |
340 |
final File subdir = new File(fileF, "subdir"); |
341 |
subdir.mkdirs(); |
342 |
final File newfile = new File(subdir, "newfile"); |
343 |
assertTrue(newfile.createNewFile()); |
344 |
FileUtil.refreshAll(); |
345 |
assertEquals("Event not fired when file was created.", 1, fcl.check(EventType.FOLDER_CREATED)); |
346 |
Thread.sleep(1000); // make sure timestamp changes |
347 |
new FileOutputStream(newfile).close(); |
348 |
FileUtil.refreshAll(); |
349 |
assertEquals("Event not fired when file was modified.", 2, fcl.check(EventType.CHANGED)); |
350 |
assertEquals("Attribute change event not fired (see #129178).", 2, fcl.check(EventType.ATTRIBUTE_CHANGED)); |
351 |
newfile.delete(); |
352 |
FileUtil.refreshAll(); |
353 |
assertEquals("Event not fired when file deleted.", 1, fcl.check(EventType.DELETED)); |
354 |
assertEquals("No other events should be fired.", 0, fcl.checkAll()); |
355 |
|
356 |
// disk changes #66444 |
357 |
File fileX = new File(fileF, "oscilating.file"); |
358 |
for (int cntr = 0; cntr < 50; cntr++) { |
359 |
fileX.getParentFile().mkdirs(); |
360 |
new FileOutputStream(fileX).close(); |
361 |
FileUtil.refreshAll(); |
362 |
assertEquals("Event not fired when file was created; count=" + cntr, 2, fcl.check(EventType.DATA_CREATED)); |
363 |
fileX.delete(); |
364 |
fileX.getParentFile().delete(); |
365 |
FileUtil.refreshAll(); |
366 |
assertEquals("Event not fired when file deleted; count=" + cntr, 2, fcl.check(EventType.DELETED)); |
367 |
} |
368 |
|
369 |
// removed listener |
370 |
assertEquals("No other events should be fired in removed listener.", 0, fcl2.checkAll()); |
371 |
|
372 |
// weakness |
373 |
WeakReference ref = new WeakReference(fcl); |
374 |
fcl = null; |
375 |
assertGC("FileChangeListener not collected.", ref); |
376 |
} |
377 |
|
242 |
/** Tests FileChangeListener on folder. As declared in |
378 |
/** Tests FileChangeListener on folder. As declared in |
243 |
* {@link FileUtil#addFileChangeListener(org.openide.filesystems.FileChangeListener, java.io.File) } |
379 |
* {@link FileUtil#addFileChangeListener(org.openide.filesystems.FileChangeListener, java.io.File) } |
244 |
* - fileFolderCreated event is fired when the folder is created or a child folder created |
380 |
* - fileFolderCreated event is fired when the folder is created or a child folder created |
Lines 315-320
Link Here
|
315 |
}; |
451 |
}; |
316 |
|
452 |
|
317 |
private static class TestFileChangeListener implements FileChangeListener { |
453 |
private static class TestFileChangeListener implements FileChangeListener { |
|
|
454 |
boolean disabled; |
318 |
|
455 |
|
319 |
private final Map<EventType, List<FileEvent>> type2Event = new HashMap<EventType, List<FileEvent>>(); |
456 |
private final Map<EventType, List<FileEvent>> type2Event = new HashMap<EventType, List<FileEvent>>(); |
320 |
|
457 |
|
Lines 356-381
Link Here
|
356 |
} |
493 |
} |
357 |
|
494 |
|
358 |
public void fileFolderCreated(FileEvent fe) { |
495 |
public void fileFolderCreated(FileEvent fe) { |
|
|
496 |
assertFalse("No changes expected", disabled); |
359 |
type2Event.get(EventType.FOLDER_CREATED).add(fe); |
497 |
type2Event.get(EventType.FOLDER_CREATED).add(fe); |
360 |
} |
498 |
} |
361 |
|
499 |
|
362 |
public void fileDataCreated(FileEvent fe) { |
500 |
public void fileDataCreated(FileEvent fe) { |
|
|
501 |
assertFalse("No changes expected", disabled); |
363 |
type2Event.get(EventType.DATA_CREATED).add(fe); |
502 |
type2Event.get(EventType.DATA_CREATED).add(fe); |
364 |
} |
503 |
} |
365 |
|
504 |
|
366 |
public void fileChanged(FileEvent fe) { |
505 |
public void fileChanged(FileEvent fe) { |
|
|
506 |
assertFalse("No changes expected", disabled); |
367 |
type2Event.get(EventType.CHANGED).add(fe); |
507 |
type2Event.get(EventType.CHANGED).add(fe); |
368 |
} |
508 |
} |
369 |
|
509 |
|
370 |
public void fileDeleted(FileEvent fe) { |
510 |
public void fileDeleted(FileEvent fe) { |
|
|
511 |
assertFalse("No changes expected", disabled); |
371 |
type2Event.get(EventType.DELETED).add(fe); |
512 |
type2Event.get(EventType.DELETED).add(fe); |
372 |
} |
513 |
} |
373 |
|
514 |
|
374 |
public void fileRenamed(FileRenameEvent fe) { |
515 |
public void fileRenamed(FileRenameEvent fe) { |
|
|
516 |
assertFalse("No changes expected", disabled); |
375 |
type2Event.get(EventType.RENAMED).add(fe); |
517 |
type2Event.get(EventType.RENAMED).add(fe); |
376 |
} |
518 |
} |
377 |
|
519 |
|
378 |
public void fileAttributeChanged(FileAttributeEvent fe) { |
520 |
public void fileAttributeChanged(FileAttributeEvent fe) { |
|
|
521 |
assertFalse("No changes expected", disabled); |
379 |
type2Event.get(EventType.ATTRIBUTE_CHANGED).add(fe); |
522 |
type2Event.get(EventType.ATTRIBUTE_CHANGED).add(fe); |
380 |
} |
523 |
} |
381 |
} |
524 |
} |