@Test public void testPropagation() throws IOException { SimpleResourceNotificationDispatcher dispatch = new SimpleResourceNotificationDispatcher(); dispatch.addListener( "DirB", new ResourceListener() { dispatch.changed( new ResourceNotification( "DirB/DirNew/FileNew", Kind.ENTRY_CREATE, System.currentTimeMillis(), SimpleResourceNotificationDispatcher.createEvents( store.get("DirB/DirNew/FileNew"), Kind.ENTRY_CREATE)));
@Test public void testRenameEvents() { Resource src = store.get("DirA"); Resource dest = store.get("DirB"); List<Event> events = SimpleResourceNotificationDispatcher.createRenameEvents(src, dest); assertEquals(6, events.size()); Set<String> set = new HashSet<String>(); set.add("DirB"); set.add("DirB/FileA1"); set.add("DirB/FileA2"); set.add("DirB/DirC"); set.add("DirB/DirC/FileC1"); set.add("DirB/DirC/FileC2"); for (Event event : events) { String path = event.getPath(); assertEquals( path.equals("DirB") || path.equals("DirB/FileA2") ? Kind.ENTRY_MODIFY : Kind.ENTRY_CREATE, event.getKind()); assertTrue(set.remove(path)); } assertTrue(set.isEmpty()); }
@Override public void changed(ResourceNotification notification) { changedInternal(notification); for (Event event : notification.events()) { if (!notification.getPath().equals(event.getPath())) { changedInternal( new ResourceNotification( event.getPath(), while (path != null) { boolean isCreate = createdParents.contains(path); changedInternal( new ResourceNotification( path, isCreate ? Kind.ENTRY_CREATE : Kind.ENTRY_MODIFY, notification.getTimestamp(), relative(notification.events(), path)));
@Test public void testDeleteEvents() { Resource res = store.get("DirA"); List<Event> events = SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_DELETE); assertEquals(6, events.size()); Set<String> set = new HashSet<String>(); set.add("DirA"); set.add("DirA/FileA1"); set.add("DirA/FileA2"); set.add("DirA/DirC"); set.add("DirA/DirC/FileC1"); set.add("DirA/DirC/FileC2"); for (Event event : events) { assertEquals(Kind.ENTRY_DELETE, event.getKind()); assertTrue(set.remove(event.getPath())); } assertTrue(set.isEmpty()); }
@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; }
@Override public void changed(ResourceNotification event) { ITopic<ResourceNotification> topic = topic(); if (topic != null) { topic.publish(event); } else { LOGGER.warning( "Failed to publish resource notification, cluster not initialized (yet)."); super.changed(event); } }
@Override protected ResourceNotificationDispatcher initWatcher() { return new SimpleResourceNotificationDispatcher(); }
@Test public void testCreateEvents() { Resource res = store.get("DirD/DirE/DirF/FileQ"); List<Event> events = SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_CREATE); assertEquals(4, events.size()); Set<String> set = new HashSet<String>(); set.add("DirD"); set.add("DirD/DirE"); set.add("DirD/DirE/DirF"); set.add("DirD/DirE/DirF/FileQ"); for (Event event : events) { assertEquals(Kind.ENTRY_CREATE, event.getKind()); assertTrue(set.remove(event.getPath())); } assertTrue(set.isEmpty()); }
@Override public void onMessage(Message<ResourceNotification> msg) { LOGGER.info("Received ResourceNotification from HazelCast: " + msg.getMessageObject()); super.changed(msg.getMessageObject()); } }
@Override protected ResourceNotificationDispatcher initWatcher() { return new SimpleResourceNotificationDispatcher(); }
@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)); }
@Test public void testRenameEvents() { Resource src = store.get("DirA"); Resource dest = store.get("DirB"); List<Event> events = SimpleResourceNotificationDispatcher.createRenameEvents(src, dest); assertEquals(6, events.size()); Set<String> set = new HashSet<String>(); set.add("DirB"); set.add("DirB/FileA1"); set.add("DirB/FileA2"); set.add("DirB/DirC"); set.add("DirB/DirC/FileC1"); set.add("DirB/DirC/FileC2"); for (Event event : events) { String path = event.getPath(); assertEquals( path.equals("DirB") || path.equals("DirB/FileA2") ? Kind.ENTRY_MODIFY : Kind.ENTRY_CREATE, event.getKind()); assertTrue(set.remove(path)); } assertTrue(set.isEmpty()); }
SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_CREATE); watcher.changed( new ResourceNotification(
SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_DELETE); watcher.changed( new ResourceNotification(
@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 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(); } } }
@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(); } } }
@Test public void testCreateEvents() { Resource res = store.get("DirD/DirE/DirF/FileQ"); List<Event> events = SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_CREATE); assertEquals(4, events.size()); Set<String> set = new HashSet<String>(); set.add("DirD"); set.add("DirD/DirE"); set.add("DirD/DirE/DirF"); set.add("DirD/DirE/DirF/FileQ"); for (Event event : events) { assertEquals(Kind.ENTRY_CREATE, event.getKind()); assertTrue(set.remove(event.getPath())); } assertTrue(set.isEmpty()); } }
@Test public void testDeleteEvents() { Resource res = store.get("DirA"); List<Event> events = SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_DELETE); assertEquals(6, events.size()); Set<String> set = new HashSet<String>(); set.add("DirA"); set.add("DirA/FileA1"); set.add("DirA/FileA2"); set.add("DirA/DirC"); set.add("DirA/DirC/FileC1"); set.add("DirA/DirC/FileC2"); for (Event event : events) { assertEquals(Kind.ENTRY_DELETE, event.getKind()); assertTrue(set.remove(event.getPath())); } assertTrue(set.isEmpty()); }
@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)); }