@Override protected Resource getUndefined() { return store.get("NonTestUndef"); } }
@Override public Resource get(String resourcePath) { if (resourcePath == null) { throw new NullPointerException("Resource path required"); } if ("".equals(resourcePath)) { return this; } return FileSystemResourceStore.this.get(Paths.path(path, resourcePath)); }
@Override protected Resource getResource(String path) throws Exception { return store.get(path); }
@Override public List<Resource> list() { if (!file.exists()) { return Collections.emptyList(); } if (file.isFile()) { return Collections.emptyList(); } String array[] = file.list(); if (array == null) { return Collections.emptyList(); } List<Resource> list = new ArrayList<Resource>(array.length); for (String filename : array) { Resource resource = FileSystemResourceStore.this.get(Paths.path(path, filename)); list.add(resource); } return list; }
@Override protected Resource getResource() { try { folder.newFile("NonTestFile"); } catch (IOException e) { fail(); } return store.get("NonTestFile"); }
@Override protected Resource getDirectory() { try { folder.newFolder("NonTestDir"); } catch (IOException e) { fail(); } return store.get("NonTestDir"); }
@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()); }
@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 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 invalid() { try { Resource resource = store.get(".."); assertNotNull(resource); fail(".. invalid"); } catch (IllegalArgumentException expected) { } }
@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)); }
System.currentTimeMillis(), SimpleResourceNotificationDispatcher.createEvents( store.get("DirB/DirNew/FileNew"), Kind.ENTRY_CREATE)));
@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 testCreateNotification() { Resource res = store.get("DirA/DirC/DirD/FileQ"); watcher.addListener(store.get("DirA/DirC/DirD").path(), chkDirD); watcher.addListener(store.get("DirA/DirC").path(), chkDirC); watcher.addListener(store.get("DirA").path(), chkDirA); 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));
@Test public void fileEvents() throws Exception { File fileD = Paths.toFile(store.baseDirectory, "DirC/FileD"); AwaitResourceListener listener = new AwaitResourceListener(); store.get("DirC/FileD").addListener(listener); store.watcher.schedule(30, TimeUnit.MILLISECONDS); long before = fileD.lastModified(); long after = touch(fileD); assertTrue("touched", after > before); ResourceNotification n = listener.await(5, TimeUnit.SECONDS); assertNotNull("detected event", n); assertEquals("file modified", Kind.ENTRY_MODIFY, n.getKind()); assertTrue("Resource only", n.events().isEmpty()); listener.reset(); fileD.delete(); n = listener.await(5, TimeUnit.SECONDS); assertEquals("file removed", Kind.ENTRY_DELETE, n.getKind()); listener.reset(); fileD.createNewFile(); n = listener.await(5, TimeUnit.SECONDS); assertEquals("file created", Kind.ENTRY_CREATE, n.getKind()); store.get("DirC/FileD").removeListener(listener); } /**
@Test public void testDeleteNotification() { Resource res = store.get("DirA");
@Override protected Resource getDirectory() { try { folder.newFolder("NonTestDir"); } catch (IOException e) { fail(); } return store.get("NonTestDir"); }
@Test public void invalid() { try { Resource resource = store.get(".."); assertNotNull(resource); fail(".. invalid"); } catch (IllegalArgumentException expected) { } }