/** {@inheritDoc} */
  public void onEvent(EventIterator eventIterator) {
    // waiting for Event.PROPERTY_ADDED, Event.PROPERTY_REMOVED,
    // Event.PROPERTY_CHANGED
    Session session = null;
    try {
      while (eventIterator.hasNext()) {
        Event event = eventIterator.nextEvent();
        String path = event.getPath();

        if (path.endsWith("/jcr:data")) {
          // jcr:data removed 'exo:groovyResourceContainer' then unbind resource
          if (event.getType() == Event.PROPERTY_REMOVED) {
            unloadScript(path.substring(0, path.lastIndexOf('/')));
          } else if (event.getType() == Event.PROPERTY_ADDED
              || event.getType() == Event.PROPERTY_CHANGED) {
            if (session == null) {
              session = repository.getSystemSession(workspaceName);
            }

            Node node = session.getItem(path).getParent();
            if (node.getProperty("exo:autoload").getBoolean()) loadScript(node);
          }
        }
      }
    } catch (Exception e) {
      LOG.error("Process event failed. ", e);
    } finally {
      if (session != null) {
        session.logout();
      }
    }
  }
    @SuppressWarnings("synthetic-access")
    @Override
    public void onEvent(EventIterator events) {
      while (events.hasNext()) {
        try {
          Event event = (Event) events.nextEvent();
          smokeCheckSequencingEvent(
              event,
              NODE_SEQUENCING_FAILURE,
              SEQUENCED_NODE_ID,
              SEQUENCED_NODE_PATH,
              Event.Sequencing.SEQUENCING_FAILURE_CAUSE,
              OUTPUT_PATH,
              SELECTED_PATH,
              SEQUENCER_NAME,
              USER_ID);
          String nodePath = event.getPath();

          sequencingEvents.putIfAbsent(nodePath, event);
          createWaitingLatchIfNecessary(nodePath, sequencingFailureLatches);
          sequencingFailureLatches.get(nodePath).countDown();
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      }
    }
  @Override
  public void onEvent(EventIterator eventIterator) {
    while (eventIterator.hasNext()) {
      try {
        Event currentEvent = eventIterator.nextEvent();

        if (currentEvent.getType() == Event.PROPERTY_ADDED
            || currentEvent.getType() == Event.PROPERTY_CHANGED
            || currentEvent.getType() == Event.PROPERTY_REMOVED) {
          clientLibraryCacheManager.invalidateCache(
              currentEvent.getPath().substring(0, currentEvent.getPath().lastIndexOf("/")));
        } else if (currentEvent.getType() == Event.NODE_REMOVED) {
          clientLibraryCacheManager.invalidateCache(currentEvent.getPath());
        } else if (currentEvent.getType() == Event.NODE_MOVED) {
          if (currentEvent.getInfo().containsKey("srcAbsPath")) {
            clientLibraryCacheManager.invalidateCache(
                (String) currentEvent.getInfo().get("srcAbsPath"));
          }
          clientLibraryCacheManager.invalidateCache(currentEvent.getPath());
        }
      } catch (RepositoryException e) {
        LOG.error("Repository Exception", e);
      } catch (ClientLibraryCachingException e) {
        LOG.error(
            "Client Library Caching Exception encountered while processing page content events", e);
      }
    }
  }
    @SuppressWarnings("synthetic-access")
    @Override
    public void onEvent(EventIterator events) {
      while (events.hasNext()) {
        try {
          Event event = (Event) events.nextEvent();
          smokeCheckSequencingEvent(
              event,
              NODE_SEQUENCED,
              SEQUENCED_NODE_ID,
              SEQUENCED_NODE_PATH,
              OUTPUT_PATH,
              SELECTED_PATH,
              SEQUENCER_NAME,
              USER_ID);
          sequencingEvents.putIfAbsent((String) event.getInfo().get(SEQUENCED_NODE_PATH), event);

          String nodePath = event.getPath();
          logger.debug("New sequenced node at: " + nodePath);
          sequencedNodes.put(nodePath, session.getNode(nodePath));

          // signal the node is available
          createWaitingLatchIfNecessary(nodePath, nodeSequencedLatches);
          nodeSequencedLatches.get(nodePath).countDown();
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      }
    }
 /** @see javax.jcr.observation.EventListener#onEvent(javax.jcr.observation.EventIterator) */
 public void onEvent(EventIterator iterator) {
   System.out.println("received events: ");
   for (; iterator.hasNext(); ) {
     try {
       System.out.println(toStringEvent(iterator.nextEvent()));
     } catch (RepositoryException e) {
       System.err.println(
           "exception while listnening " + SessionFactoryUtils.translateException(e));
     }
   }
 }