/** * Updates FSML database instance to reflect file modification. * * @param path regular file that was changed * @param isDir whether path is a directory */ private void modifyEvent(final Path path, final boolean isDir) { if (isDir) { System.err.println(NAME + " No directory handling so far."); return; } try { // XPath expression to select affected file node. String xp = FSML.pn2xp(path.toAbsolutePath().toString(), false); // FSML fragment read from changed file ArrayOutput ao = new ArrayOutput(); FSML.out = new PrintWriter(ao, true); fsml.visitFile(path, null); // print new file entry in ao String fsentry = ao.toString(); // Update query StringBuilder sb = new StringBuilder(); sb.append("xquery replace node " + xp + " with " + fsentry); String query = sb.toString(); System.err.println(NAME + " Query: " + query); // System.err.println(session.execute(query)); // System.err.println(session.info()); } catch (Exception e) { e.printStackTrace(); } }
/** Process all events for keys queued to the watcher. */ public void processEvents() { for (; ; ) { // wait for key to be signaled WatchKey key; try { key = watcher.take(); } catch (InterruptedException x) { x.printStackTrace(); return; } Path dir = keys.get(key); if (dir == null) { System.err.println("WatchKey not recognized!!"); continue; } for (WatchEvent<?> event : key.pollEvents()) { WatchEvent.Kind<?> kind = event.kind(); // TBD - provide example of how OVERFLOW event is handled if (kind == OVERFLOW) { continue; } // Context for directory entry event is the file name of entry WatchEvent<Path> ev = cast(event); Path name = ev.context(); Path child = dir.resolve(name); // print out event System.err.format("%s %s: %s\n", NAME, event.kind().name(), child); // determine file type boolean isDir = FSML.isDirectory(child); // [MS] replace with this: // Files.isDirectory(child, NOFOLLOW_LINKS); if (kind == ENTRY_MODIFY) { modifyEvent(child, isDir); } // if directory is created, and watching recursively, then // register it and its sub-directories if (recursive && (kind == ENTRY_CREATE)) { try { if (isDir) { registerAll(child); } } catch (IOException x) { x.printStackTrace(); } } } // reset key and remove from set if directory no longer accessible boolean valid = key.reset(); if (!valid) { keys.remove(key); // all directories are inaccessible if (keys.isEmpty()) { break; } } } }