Example #1
0
 /**
  * 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();
   }
 }
Example #2
0
  /** 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;
        }
      }
    }
  }