@Override
    public int doEndTag() throws JspException {
        HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
        // Get the page data bean from the request:
        // If the page info bean is not in the request then no tab will be selected - so, it'll fail gracefully
        String pageID = (String)request.getAttribute("pageID");
        String subPageID = (String)request.getAttribute("subPageID");

        if (pageID == null) {
            Element subPage = AdminConsole.getElemnetByID(subPageID);
            if (subPage != null) {
                pageID = subPage.getParent().getParent().attributeValue("id");
            }
        }
        
        // Get tabs from the model:
        List<Node> tabs = AdminConsole.getModel().selectNodes("//tab");
        if (!tabs.isEmpty()) {
            JspWriter out = pageContext.getOut();
            // Build up the output in a buffer (is probably faster than a bunch of out.write's)
            StringBuilder buf = new StringBuilder();
            if (!justlinks) { buf.append("<ul>"); }
            String body = getBodyContent().getString();
            // For each tab, print out an <LI>.
            Element currentTab = null;
            if (pageID != null) {
                currentTab = (Element)AdminConsole.getModel().selectSingleNode(
                            "//*[@id='" + pageID + "']/ancestor::tab");
            }
            for (int i=0; i<tabs.size(); i++) {
                Element tab = (Element)tabs.get(i);
                String value = body;
                if (value != null) {
                    // The URL for the tab should be the URL of the first item in the tab.
                    String pluginName = tab.attributeValue("plugin");
                    value = value.replaceAll("\\[id]", clean(tab.attributeValue("id")));
                    value = value.replaceAll("\\[url]",request.getContextPath() + "/" + clean(tab.attributeValue("url")));
                    value = value.replaceAll("\\[name]", clean(AdminConsole.getAdminText(tab.attributeValue("name"), pluginName)));
                    value = value.replaceAll("\\[description]", clean(AdminConsole.getAdminText(tab.attributeValue("description"), pluginName)));
                }
                String css = getCss();
                if (tab.equals(currentTab)) {
                    css = getCurrentcss();
                }
                if (!justlinks) { buf.append("<li class=\"").append(css).append("\">"); }
                if (justlinks && i > 0) { buf.append(" | "); }
                buf.append(value);
                if (!justlinks) { buf.append("</li>"); }
            }

            if (!justlinks) { buf.append("</ul>"); }
            try {
                out.write(buf.toString());
            }
            catch (IOException ioe) {
                throw new JspException(ioe.getMessage());
            }
        }
        return EVAL_PAGE;
    }
Gets the {@link AdminPageBean} instance from the request. If it doesn't exist then execution is stopped
and nothing is printed. If it exists, retrieve values from it and render the tabs. The body content
of the tag is assumed to have an A tag in it with tokens to replace (see class description).

@return {@link #EVAL_PAGE} after rendering the tabs.
@throws JspException if an exception occurs while rendering the tabs.
xmppserver/src/main/java/org/jivesoftware/admin/TabsTag.java