private Url encode(BrixNodeWebPage page) {
   BrixNode node = page.getModelObject();
   // This is a URL for redirect. Allow components to contribute state to
   // URL if they want to
   final BrixPageParameters parameters = page.getBrixPageParameters();
   for (NamedPair namedPair : parameters.getAllNamed()) {
     if (isNumber(namedPair.getKey())) {
       parameters.remove(namedPair.getKey());
     }
   }
   page.visitChildren(
       PageParametersAware.class,
       new IVisitor<Component, PageParametersAware>() {
         @Override
         public void component(Component component, IVisit iVisit) {
           ((PageParametersAware) component).contributeToPageParameters(parameters);
         }
       });
   return encode(node, parameters, null);
 }
 @Override
 public Url mapHandler(IRequestHandler requestHandler) {
   if (requestHandler instanceof BrixNodeRequestHandler) {
     BrixNodeRequestHandler handler = (BrixNodeRequestHandler) requestHandler;
     String nodeURL = handler.getNodeURL();
     return encode(nodeURL, handler.getPageParameters(), null);
   } else if (requestHandler instanceof ListenerInterfaceRequestHandler) {
     ListenerInterfaceRequestHandler handler = (ListenerInterfaceRequestHandler) requestHandler;
     if (handler.getPage() instanceof BrixNodeWebPage) {
       BrixNodeWebPage page = (BrixNodeWebPage) handler.getPage();
       String componentPath = handler.getComponentPath();
       RequestListenerInterface listenerInterface = handler.getListenerInterface();
       Integer renderCount = null;
       if (listenerInterface.isIncludeRenderCount()) {
         renderCount = page.getRenderCount();
       }
       PageInfo pageInfo = new PageInfo(page.getPageId());
       ComponentInfo componentInfo =
           new ComponentInfo(
               renderCount,
               requestListenerInterfaceToString(listenerInterface),
               componentPath,
               handler.getBehaviorIndex());
       PageComponentInfo info = new PageComponentInfo(pageInfo, componentInfo);
       Url url = encode(page);
       encodePageComponentInfo(url, info);
       return url;
     } else {
       return null;
     }
   } else if (requestHandler instanceof RenderPageRequestHandler) {
     RenderPageRequestHandler handler = (RenderPageRequestHandler) requestHandler;
     if (handler.getPage() instanceof BrixNodeWebPage) {
       BrixNodeWebPage page = (BrixNodeWebPage) handler.getPage();
       PageInfo i = new PageInfo(page.getPageId());
       PageComponentInfo info = new PageComponentInfo(i, null);
       Url url = encode(page);
       encodePageComponentInfo(url, info);
       return url;
     } else {
       return null;
     }
   } else if (requestHandler instanceof BookmarkableListenerInterfaceRequestHandler) {
     BookmarkableListenerInterfaceRequestHandler target =
         (BookmarkableListenerInterfaceRequestHandler) requestHandler;
     BrixNodeWebPage page = (BrixNodeWebPage) target.getPage();
     BrixNode node = page.getModelObject();
     PageInfo info = new PageInfo(page.getPageId());
     return encode(node, page.getBrixPageParameters(), info);
   } else if (requestHandler instanceof BookmarkablePageRequestHandler
       && ((BookmarkablePageRequestHandler) requestHandler)
           .getPageClass()
           .equals(HomePage.class)) {
     BrixNode node =
         ((BrixRequestCycleProcessor) RequestCycle.get().getActiveRequestHandler())
             .getNodeForUriPath(Path.ROOT);
     return mapHandler(new BrixNodeRequestHandler(new BrixNodeModel(node)));
   } else {
     return null;
   }
 }