/**
   * Creates a uri path for the specified <code>node</code> By default this method uses {@link
   * BrixConfig#getMapper()} to map node path to a uri path.
   *
   * @param node node to create uri path for
   * @return uri path that represents the node
   */
  public Path getUriPathForNode(final BrixNode node) {
    // allow site plugin to translate jcr path into node path
    final String jcrPath = SitePlugin.get().fromRealWebNodePath(node.getPath());
    final Path nodePath = new Path(jcrPath);

    // use urimapper to create the uri
    return brix.getConfig().getMapper().getUriPathForNode(nodePath, brix);
  }
  /**
   * Resolves uri path to a {@link BrixNode}. By default this method uses {@link
   * BrixConfig#getMapper()} to map the uri to a node path.
   *
   * @param uriPath uri path
   * @return node that maps to the <code>uriPath</code> or <code>null</code> if none
   */
  public BrixNode getNodeForUriPath(final Path uriPath) {
    BrixNode node = null;

    // create desired nodepath
    final Path nodePath =
        brix.getConfig().getMapper().getNodePathForUriPath(uriPath.toAbsolute(), brix);

    if (nodePath != null) {
      // allow site plugin to translate the node path into an actual jcr
      // path
      final String jcrPath = SitePlugin.get().toRealWebNodePath(nodePath.toString());

      // retrieve jcr session
      final String workspace = getWorkspace();
      final JcrSession session = brix.getCurrentSession(workspace);

      if (session.itemExists(jcrPath)) {
        // node exists, return it
        node = (BrixNode) session.getItem(jcrPath);
      }
    }

    return node;
  }
  @Override
  public IRequestHandler mapRequest(Request request) {
    final Url url = request.getClientUrl();

    if (isInternalWicket(request)) {
      return null;
    }

    // TODO: This is just a quick fix
    if (url.getSegments().size() > 0) {
      if (url.getSegments().get(0).equals("webdav")
          || url.getSegments().get(0).equals("jcrwebdav")) {
        return null;
      }
    }

    Path path = new Path("/" + url.getPath());

    // root path handling
    if (path.isRoot()) {
      if (handleHomePage) {
        final BrixNode node = getNodeForUriPath(path);
        return SitePlugin.get()
            .getNodePluginForNode(node)
            .respond(
                new BrixNodeModel(node), new BrixPageParameters(request.getRequestParameters()));
      } else {
        return null;
      }
    }

    IRequestHandler handler = null;
    try {
      while (handler == null) {
        final BrixNode node = getNodeForUriPath(path);
        if (node != null) {
          SiteNodePlugin plugin = SitePlugin.get().getNodePluginForNode(node);
          if (plugin instanceof AbstractSitePagePlugin) {
            handler =
                SitePlugin.get()
                    .getNodePluginForNode(node)
                    .respond(new BrixNodeModel(node), createBrixPageParams(request.getUrl(), path));
          } else {
            handler =
                SitePlugin.get()
                    .getNodePluginForNode(node)
                    .respond(
                        new BrixNodeModel(node),
                        new BrixPageParameters(request.getRequestParameters()));
          }
        }
        if (handler != null || path.toString().equals(".")) {
          break;
        }
        path = path.parent();
        if (path.isRoot()) {
          break;
        }
      }
    } catch (JcrException e) {
      logger.warn("JcrException caught due to incorrect url", e);
    }

    final PageComponentInfo info = getPageComponentInfo(request.getUrl());
    if (info != null && info.getPageInfo().getPageId() != null) {
      Integer renderCount =
          info.getComponentInfo() != null ? info.getComponentInfo().getRenderCount() : null;

      if (info.getComponentInfo() == null) {
        PageProvider provider;
        if (handler instanceof BrixNodePageRequestHandler) {
          provider =
              new PageProvider(info.getPageInfo().getPageId(), BrixNodeWebPage.class, renderCount);
          BrixNodePageRequestHandler brixNodePageRequestHandler =
              (BrixNodePageRequestHandler) handler;
          final IPageProvider pageProviderAdapter = brixNodePageRequestHandler.getPageProvider();
          provider.setPageSource(
              new IPageSource() {
                @Override
                public IRequestablePage getPageInstance(int pageId) {
                  IRequestablePage page = null;
                  Integer existingPageId = pageProviderAdapter.getPageId();
                  if (existingPageId != null && pageId == existingPageId) {
                    page = pageProviderAdapter.getPageInstance();
                  }
                  return page;
                }

                @Override
                public IRequestablePage newPageInstance(
                    Class<? extends IRequestablePage> pageClass, PageParameters pageParameters) {
                  IRequestablePage page = pageProviderAdapter.getPageInstance();
                  page.getPageParameters().set(info.toString(), "");
                  return page;
                }
              });
        } else {
          provider = new PageProvider(info.getPageInfo().getPageId(), renderCount);
          provider.setPageSource(getContext());
        }

        // render page
        return new RenderPageRequestHandler(provider);
      } else {
        ComponentInfo componentInfo = info.getComponentInfo();
        PageAndComponentProvider provider =
            new PageAndComponentProvider(
                info.getPageInfo().getPageId(), renderCount, componentInfo.getComponentPath());

        provider.setPageSource(getContext());
        // listener interface
        RequestListenerInterface listenerInterface =
            requestListenerInterfaceFromString(componentInfo.getListenerInterface());

        return new ListenerInterfaceRequestHandler(
            provider, listenerInterface, componentInfo.getBehaviorId());
      }
    }

    return handler;
  }