@Test public void testDeleteWhileListening() { Resource res = store.get("DirA"); final ResourceListener deletingListener = new ResourceListener() { @Override public void changed(ResourceNotification notify) { assertTrue(watcher.removeListener(notify.getPath(), this)); } }; watcher.addListener(res.path(), deletingListener); watcher.changed( new ResourceNotification( "DirA", Kind.ENTRY_DELETE, System.currentTimeMillis(), Collections.emptyList())); // verify already deleted assertFalse(watcher.removeListener(res.path(), deletingListener)); }
@Override public void addListener(ResourceListener listener) { getResourceNotificationDispatcher().addListener(path, listener); }
@Override public void removeListener(ResourceListener listener) { getResourceNotificationDispatcher().removeListener(path, listener); }
@Override public OutputStream out() { List<ResourceNotification.Event> events = SimpleResourceNotificationDispatcher.createEvents( this, ResourceNotification.Kind.ENTRY_CREATE); if (entry.createResource()) { resourceNotificationDispatcher.changed( new ResourceNotification( path(), ResourceNotification.Kind.ENTRY_CREATE, System.currentTimeMillis(), events)); } try { return new CachingOutputStreamWrapper(File.createTempFile("out.", entry.getName())); } catch (IOException ex) { throw new IllegalStateException(ex); } }
@Override public void addListener(ResourceListener listener) { resourceNotificationDispatcher.addListener(path(), listener); }
@Override public void changed(ResourceNotification notify) { assertTrue(watcher.removeListener(notify.getPath(), this)); } };
@Override public void close() throws IOException { final Lock lock = lock(); try { List<ResourceNotification.Event> events = SimpleResourceNotificationDispatcher.createEvents( JDBCResource.this, ResourceNotification.Kind.ENTRY_MODIFY); entry.setContent(new FileInputStream(tempFile)); resourceNotificationDispatcher.changed( new ResourceNotification( path(), ResourceNotification.Kind.ENTRY_MODIFY, System.currentTimeMillis(), events)); } finally { lock.release(); } } }
@Test public void testModifyNotification() { Resource res = store.get("DirA/DirC/FileC1"); final CheckingResourceListener chkDirA = new CheckingResourceListener(Kind.ENTRY_MODIFY), chkDirC = new CheckingResourceListener(Kind.ENTRY_MODIFY), chkFileC1 = new CheckingResourceListener(Kind.ENTRY_MODIFY); watcher.addListener(res.path(), chkFileC1); watcher.addListener(store.get("DirA/DirC").path(), chkDirC); watcher.addListener(store.get("DirA").path(), chkDirA); List<Event> events = SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_MODIFY); watcher.changed( new ResourceNotification( "DirA/DirC/FileC1", Kind.ENTRY_MODIFY, System.currentTimeMillis(), events)); // test that listeners received events assertFalse(chkDirA.isChecked()); assertTrue(chkDirC.isChecked()); assertTrue(chkFileC1.isChecked()); // remove listeners assertTrue(watcher.removeListener(res.path(), chkFileC1)); assertTrue(watcher.removeListener(store.get("DirA/DirC").path(), chkDirC)); assertTrue(watcher.removeListener(store.get("DirA").path(), chkDirA)); }
dispatcher = resourceLoader.getResourceNotificationDispatcher(); dispatcher.addListener( CONFIG_DIR_NAME, new ResourceListener() {
@Override public void removeListener(ResourceListener listener) { resourceNotificationDispatcher.removeListener(path(), listener); }
@Override public boolean renameTo(Resource dest) { List<ResourceNotification.Event> eventsDelete = SimpleResourceNotificationDispatcher.createEvents( this, ResourceNotification.Kind.ENTRY_DELETE); List<ResourceNotification.Event> eventsRename = SimpleResourceNotificationDispatcher.createRenameEvents(this, dest); boolean result; if (dest instanceof JDBCResource) { result = entry.renameTo(((JDBCResource) dest).entry); } else { result = Resources.renameByCopy(this, dest); } if (result) { resourceNotificationDispatcher.changed( new ResourceNotification( path(), ResourceNotification.Kind.ENTRY_DELETE, System.currentTimeMillis(), eventsDelete)); resourceNotificationDispatcher.changed( new ResourceNotification( path(), eventsRename.get(0).getKind(), System.currentTimeMillis(), eventsRename)); } return result; }
chkFileQ = new CheckingResourceListener(Kind.ENTRY_CREATE); watcher.addListener(res.path(), chkFileQ); watcher.addListener(store.get("DirA/DirC/DirD").path(), chkDirD); watcher.addListener(store.get("DirA/DirC").path(), chkDirC); watcher.addListener(store.get("DirA").path(), chkDirA); watcher.changed( new ResourceNotification( "DirA/DirC/DirD/FileQ", assertTrue(watcher.removeListener(res.path(), chkFileQ)); assertTrue(watcher.removeListener(store.get("DirA/DirC/DirD").path(), chkDirD)); assertTrue(watcher.removeListener(store.get("DirA/DirC").path(), chkDirC)); assertTrue(watcher.removeListener(store.get("DirA").path(), chkDirA));
.getFieldName()); resourceNotificationDispatcher.addListener( mergePath(path), new ResourceListener() {
@Override public void changed(ResourceNotification notify) { assertTrue(watcher.removeListener(notify.getPath(), this)); } };
@Override public boolean delete() { List<Lock> locks = new ArrayList<Lock>(); lockRecursively(locks); try { List<ResourceNotification.Event> events = SimpleResourceNotificationDispatcher.createEvents( this, ResourceNotification.Kind.ENTRY_DELETE); if (entry.delete()) { resourceNotificationDispatcher.changed( new ResourceNotification( path(), ResourceNotification.Kind.ENTRY_DELETE, System.currentTimeMillis(), events)); return true; } else { return false; } } finally { for (Lock lock : locks) { lock.release(); } } }
chkFileC2 = new CheckingResourceListener(Kind.ENTRY_DELETE); watcher.addListener(res.path(), chkDirA); watcher.addListener(res.get("FileA1").path(), chkFileA1); watcher.addListener(res.get("FileA2").path(), chkFileA2); watcher.addListener(res.get("DirC").path(), chkDirC); watcher.addListener(res.get("DirC/FileC1").path(), chkFileC1); watcher.addListener(res.get("DirC/FileC2").path(), chkFileC2); watcher.changed( new ResourceNotification( "DirA", Kind.ENTRY_DELETE, System.currentTimeMillis(), events)); assertTrue(watcher.removeListener(res.path(), chkDirA)); assertTrue(watcher.removeListener(res.get("FileA1").path(), chkFileA1)); assertTrue(watcher.removeListener(res.get("FileA2").path(), chkFileA2)); assertTrue(watcher.removeListener(res.get("DirC").path(), chkDirC)); assertTrue(watcher.removeListener(res.get("DirC/FileC1").path(), chkFileC1)); assertTrue(watcher.removeListener(res.get("DirC/FileC2").path(), chkFileC2));
@Test public void testDeleteWhileListening() { Resource res = store.get("DirA"); final ResourceListener deletingListener = new ResourceListener() { @Override public void changed(ResourceNotification notify) { assertTrue(watcher.removeListener(notify.getPath(), this)); } }; watcher.addListener(res.path(), deletingListener); watcher.changed( new ResourceNotification( "DirA", Kind.ENTRY_DELETE, System.currentTimeMillis(), Collections.emptyList())); // verify already deleted assertFalse(watcher.removeListener(res.path(), deletingListener)); }
@Test public void testModifyNotification() { Resource res = store.get("DirA/DirC/FileC1"); final CheckingResourceListener chkDirA = new CheckingResourceListener(Kind.ENTRY_MODIFY), chkDirC = new CheckingResourceListener(Kind.ENTRY_MODIFY), chkFileC1 = new CheckingResourceListener(Kind.ENTRY_MODIFY); watcher.addListener(res.path(), chkFileC1); watcher.addListener(store.get("DirA/DirC").path(), chkDirC); watcher.addListener(store.get("DirA").path(), chkDirA); List<Event> events = SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_MODIFY); watcher.changed( new ResourceNotification( "DirA/DirC/FileC1", Kind.ENTRY_MODIFY, System.currentTimeMillis(), events)); // test that listeners received events assertFalse(chkDirA.isChecked()); assertTrue(chkDirC.isChecked()); assertTrue(chkFileC1.isChecked()); // remove listeners assertTrue(watcher.removeListener(res.path(), chkFileC1)); assertTrue(watcher.removeListener(store.get("DirA/DirC").path(), chkDirC)); assertTrue(watcher.removeListener(store.get("DirA").path(), chkDirA)); }
chkFileQ = new CheckingResourceListener(Kind.ENTRY_CREATE); watcher.addListener(res.path(), chkFileQ); watcher.addListener(store.get("DirA/DirC/DirD").path(), chkDirD); watcher.addListener(store.get("DirA/DirC").path(), chkDirC); watcher.addListener(store.get("DirA").path(), chkDirA); watcher.changed( new ResourceNotification( "DirA/DirC/DirD/FileQ", assertTrue(watcher.removeListener(res.path(), chkFileQ)); assertTrue(watcher.removeListener(store.get("DirA/DirC/DirD").path(), chkDirD)); assertTrue(watcher.removeListener(store.get("DirA/DirC").path(), chkDirC)); assertTrue(watcher.removeListener(store.get("DirA").path(), chkDirA));
chkFileC2 = new CheckingResourceListener(Kind.ENTRY_DELETE); watcher.addListener(res.path(), chkDirA); watcher.addListener(res.get("FileA1").path(), chkFileA1); watcher.addListener(res.get("FileA2").path(), chkFileA2); watcher.addListener(res.get("DirC").path(), chkDirC); watcher.addListener(res.get("DirC/FileC1").path(), chkFileC1); watcher.addListener(res.get("DirC/FileC2").path(), chkFileC2); watcher.changed( new ResourceNotification( "DirA", Kind.ENTRY_DELETE, System.currentTimeMillis(), events)); assertTrue(watcher.removeListener(res.path(), chkDirA)); assertTrue(watcher.removeListener(res.get("FileA1").path(), chkFileA1)); assertTrue(watcher.removeListener(res.get("FileA2").path(), chkFileA2)); assertTrue(watcher.removeListener(res.get("DirC").path(), chkDirC)); assertTrue(watcher.removeListener(res.get("DirC/FileC1").path(), chkFileC1)); assertTrue(watcher.removeListener(res.get("DirC/FileC2").path(), chkFileC2));