/**
  * Generates a document view export using a {@link
  * org.apache.jackrabbit.commons.xml.DocumentViewExporter} instance.
  *
  * @param path of the node to be exported
  * @param handler handler for the SAX events of the export
  * @param skipBinary whether binary values should be skipped
  * @param noRecurse whether to export just the identified node
  * @throws PathNotFoundException if a node at the given path does not exist
  * @throws SAXException if the SAX event handler failed
  * @throws RepositoryException if another error occurs
  */
 public void exportDocumentView(
     String path, ContentHandler handler, boolean skipBinary, boolean noRecurse)
     throws PathNotFoundException, SAXException, RepositoryException {
   DocumentViewExporter exporter = new DocumentViewExporter(this, handler, skipBinary, noRecurse);
   Item item = getItem(path);
   if (item.isNode()) {
     exporter.export((JCRNodeWrapper) item);
   } else {
     throw new PathNotFoundException("XML export is not defined for properties: " + path);
   }
 }
  /**
   * Generates a system view export using a {@link
   * org.apache.jackrabbit.commons.xml.SystemViewExporter} instance.
   *
   * @param path of the node to be exported
   * @param handler handler for the SAX events of the export
   * @param skipBinary whether binary values should be skipped
   * @param noRecurse whether to export just the identified node
   * @throws PathNotFoundException if a node at the given path does not exist
   * @throws SAXException if the SAX event handler failed
   * @throws RepositoryException if another error occurs
   */
  public void exportSystemView(
      String path, ContentHandler handler, boolean skipBinary, boolean noRecurse)
      throws PathNotFoundException, SAXException, RepositoryException {

    // todo implement our own system view .. ?
    SystemViewExporter exporter = new SystemViewExporter(this, handler, !noRecurse, !skipBinary);
    Item item = getItem(path);
    if (item.isNode()) {
      exporter.export((JCRNodeWrapper) item);
    } else {
      throw new PathNotFoundException("XML export is not defined for properties: " + path);
    }
  }
  public JCRItemWrapper getItem(String path, final boolean checkVersion)
      throws PathNotFoundException, RepositoryException {
    if (sessionCacheByPath.containsKey(path)) {
      return sessionCacheByPath.get(path);
    }
    if (path.contains(DEREF_SEPARATOR)) {
      JCRNodeWrapper parent =
          (JCRNodeWrapper)
              getItem(StringUtils.substringBeforeLast(path, DEREF_SEPARATOR), checkVersion);
      return dereference(parent, StringUtils.substringAfterLast(path, DEREF_SEPARATOR));
    }
    Map<String, JCRStoreProvider> dynamicMountPoints = sessionFactory.getDynamicMountPoints();
    for (Map.Entry<String, JCRStoreProvider> mp : dynamicMountPoints.entrySet()) {
      if (path.startsWith(mp.getKey() + "/")) {
        String localPath = path.substring(mp.getKey().length());
        JCRStoreProvider provider = mp.getValue();
        Item item = getProviderSession(provider).getItem(provider.getRelativeRoot() + localPath);
        if (item.isNode()) {
          return provider.getNodeWrapper((Node) item, localPath, null, this);
        } else {
          return provider.getPropertyWrapper((Property) item, this);
        }
      }
    }
    Map<String, JCRStoreProvider> mountPoints = sessionFactory.getMountPoints();
    for (Map.Entry<String, JCRStoreProvider> mp : mountPoints.entrySet()) {
      String key = mp.getKey();
      if (key.equals("/") || path.equals(key) || path.startsWith(key + "/")) {
        String localPath = path;
        if (!key.equals("/")) {
          localPath = localPath.substring(key.length());
        }
        JCRStoreProvider provider = mp.getValue();
        if (localPath.equals("")) {
          localPath = "/";
        }
        //                Item item = getProviderSession(provider).getItem(localPath);
        Session session = getProviderSession(provider);
        if (session instanceof JahiaSessionImpl
            && getUser() != null
            && sessionFactory.getCurrentAliasedUser() != null
            && sessionFactory.getCurrentAliasedUser().equals(getUser())) {
          ((JahiaSessionImpl) session).toggleThisSessionAsAliased();
        }
        Item item = session.getItem(provider.getRelativeRoot() + localPath);
        if (item.isNode()) {
          final Node node = (Node) item;
          JCRNodeWrapper wrapper = provider.getNodeWrapper(node, localPath, null, this);
          if (getUser() != null
              && sessionFactory.getCurrentAliasedUser() != null
              && !sessionFactory.getCurrentAliasedUser().equals(getUser())) {
            final JCRNodeWrapper finalWrapper = wrapper;
            JCRTemplate.getInstance()
                .doExecuteWithUserSession(
                    sessionFactory.getCurrentAliasedUser().getUsername(),
                    getWorkspace().getName(),
                    getLocale(),
                    new JCRCallback<Object>() {
                      public Object doInJCR(JCRSessionWrapper session) throws RepositoryException {
                        return session.getNodeByUUID(finalWrapper.getIdentifier(), checkVersion);
                      }
                    });
          }
          if (checkVersion
              && (versionDate != null || versionLabel != null)
              && node.isNodeType("mix:versionable")) {
            wrapper = getFrozenVersionAsRegular(node, provider);
          }
          sessionCacheByPath.put(path, wrapper);
          sessionCacheByIdentifier.put(wrapper.getIdentifier(), wrapper);

          return wrapper;
        } else {
          return provider.getPropertyWrapper((Property) item, this);
        }
      }
    }
    throw new PathNotFoundException(path);
  }