protected void createAddNodeForm() {
   form().id("addNodeForm").action("/admin/node/save").method("POST");
   input().type("hidden").name("cluster").value(params.get("cluster")).end();
   div()
       .span()
       .text("Host")
       .end()
       .span()
       .input()
       .type("text")
       .id("host")
       .name("host")
       .classAttr("validate[required]")
       .end(2)
       .span()
       .text("Port")
       .end()
       .span()
       .input()
       .type("text")
       .id("port")
       .name("port")
       .size("5")
       .classAttr("validate[required,custom[integer]]")
       .end(2)
       .span()
       .input()
       .value("Add Node")
       .type("submit")
       .classAttr("mb-button")
       .end(2);
   end();
   end();
 }
 protected void createAddProxyRuleForm() {
   form().id("addProxyRuleForm").action("/admin/prule/save").method("POST");
   div()
       .span()
       .text("Name")
       .end()
       .span()
       .input()
       .type("text")
       .id("p-name")
       .name("name")
       .classAttr("validate[required]")
       .end(
           2) // id != name so that validation error reports on the page show of at the right
              // places.
       .span()
       .text("Listen Port")
       .end()
       .span()
       .input()
       .type("text")
       .id("p-port")
       .name("port")
       .size("5")
       .classAttr("validate[required,custom[integer]]")
       .end(2)
       .span()
       .input()
       .value("Add")
       .type("submit")
       .classAttr("mb-button")
       .end(2);
   end();
   end();
 }
 public String createPage() throws Exception {
   html();
   createHead("Membrane Administration");
   body();
   div().id("tabs").classAttr("ui-tabs ui-widget ui-widget-content ui-corner-all");
   createTabs(getSelectedTab());
   div().classAttr("ui-tabs-panel ui-widget-content ui-corner-bottom");
   createTabContent();
   end();
   end();
   endAll();
   done();
   return writer.getBuffer().toString();
 }
 protected void createInterceptorTable(List<Interceptor> interceptors) {
   table().attr("cellpadding", "0", "cellspacing", "0", "border", "0", "class", "display");
   thead();
   tr();
   createThs("Name", "Priority");
   end();
   end();
   tbody();
   for (Interceptor i : interceptors) {
     tr();
     createTds(i.getDisplayName(), "" + i.getPriority());
     end();
   }
   end();
   end();
 }
 protected void createSessionsTable(List<Session> sessions) {
   table().attr("cellpadding", "0", "cellspacing", "0", "border", "0", "class", "display");
   thead();
   tr();
   createThs("Id", "Last Used");
   end();
   end();
   tbody();
   for (Session s : sessions) {
     tr();
     createTds(s.getId(), formatDurationHMS(System.currentTimeMillis() - s.getLastUsed()));
     end();
   }
   end();
   end();
 }
 protected void createTabs(int selected) throws Exception {
   ul().classAttr("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");
   li().classAttr(getSelectedTabStyle(0, selected));
   a().href("/admin").text("Rules").end();
   end();
   li().classAttr(getSelectedTabStyle(1, selected));
   createLink("Transport", "transport", null, null);
   end();
   li().classAttr(getSelectedTabStyle(2, selected));
   createLink("System", "system", null, null);
   end();
   li().classAttr(getSelectedTabStyle(3, selected));
   createLink("Loadbalancer", "clusters", null, null);
   end();
   end();
 }
 protected void createNodesTable() throws Exception {
   table().attr("cellpadding", "0", "cellspacing", "0", "border", "0", "class", "display");
   thead();
   tr();
   createThs(
       "Node", "Health", "Count", "Errors", "Time since last up", "Current Threads", "Action");
   end();
   end();
   tbody();
   for (Node n : router.getClusterManager().getAllNodesByCluster(params.get("cluster"))) {
     tr();
     td();
     createLink(
         "" + n.getHost() + ":" + n.getPort(),
         "node",
         "show",
         createQueryString(
             "cluster", params.get("cluster"), "host", n.getHost(), "port", "" + n.getPort()));
     end();
     createTds(
         n.isUp() ? "Up" : "Down",
         "" + n.getCounter(),
         String.format("%1$.2f%%", n.getErrors() * 100),
         formatDurationHMS(System.currentTimeMillis() - n.getLastUpTime()),
         "" + n.getThreads());
     td();
     createIcon("ui-icon-trash", "node", "delete", createQuery4Node(n));
     createIcon("ui-icon-circle-arrow-n", "node", "up", createQuery4Node(n));
     createIcon("ui-icon-circle-arrow-s", "node", "down", createQuery4Node(n));
     end();
     end();
   }
   end();
   end();
 }
 protected void createStatusNodes(Node n) throws Exception {
   table().attr("cellpadding", "0", "cellspacing", "0", "border", "0", "class", "display");
   thead();
   tr();
   createThs("Status Code", "Count");
   end();
   end();
   tbody();
   synchronized (n.getStatusCodes()) {
     for (Map.Entry<Integer, Integer> codes : n.getStatusCodes().entrySet()) {
       tr();
       createTds("" + codes.getKey(), "" + codes.getValue());
       end();
     }
   }
   end();
   end();
 }
 protected void createProxyRulesTable() throws UnsupportedEncodingException {
   table().attr("cellpadding", "0", "cellspacing", "0", "border", "0", "class", "display");
   thead();
   tr();
   createThs("Name", "Listen Port", "Actions");
   end();
   end();
   tbody();
   for (ProxyRule rule : getProxyRules()) {
     tr();
     td();
     createLink(
         rule.toString(),
         "prule",
         "show",
         createQueryString("name", RuleUtil.getRuleIdentifier(rule)));
     end();
     createTds("" + rule.getKey().getPort());
     td().a()
         .href(
             "/admin/rule/delete?name="
                 + URLEncoder.encode(RuleUtil.getRuleIdentifier(rule), "UTF-8"))
         .span()
         .classAttr("ui-icon ui-icon-trash")
         .end(3);
     end();
   }
   end();
   end();
 }
 protected void createAddClusterForm() {
   form().id("addClusterForm").action("/admin/clusters/save").method("POST");
   div()
       .span()
       .text("Name")
       .end()
       .span()
       .input()
       .type("text")
       .id("name")
       .name("name")
       .classAttr("validate[required]")
       .end(2)
       .span()
       .input()
       .value("Add Cluster")
       .type("submit")
       .classAttr("mb-button")
       .end(2);
   end();
   end();
 }
 protected void createHead(String title) {
   head();
   title().text(title).end();
   style()
       .attr("type", "text/css")
       .text(
           "@import '/datatables/css/demo_table_jui.css';\n"
               + "@import '/jquery-ui/css/custom-theme/jquery-ui-1.8.13.custom.css';"
               + "@import '/css/membrane.css';")
       .end();
   link().rel("stylesheet").href("/formValidator/validationEngine.jquery.css").type("text/css");
   script().src("/jquery/jquery-1.6.1.js").end();
   script().src("/datatables/js/jquery.dataTables.min.js").end();
   script().src("/jquery-ui/js/jquery-ui-1.8.13.custom.min.js").end();
   script().src("/formValidator/jquery.validationEngine-en.js").end();
   script().src("/formValidator/jquery.validationEngine.js").end();
   script().src("/js/membrane.js").end();
   createMetaElements();
   end();
 }
  protected void createClustersTable() throws UnsupportedEncodingException {
    table().attr("cellpadding", "0", "cellspacing", "0", "border", "0", "class", "display");
    thead();
    tr();
    createThs("Name", "#Nodes", "Health");
    end();
    end();
    tbody();
    for (Cluster c : router.getClusterManager().getClusters()) {
      tr();
      td();
      createLink(c.getName(), "clusters", "show", createQueryString("cluster", c.getName()));
      end();

      createTds(
          String.valueOf(router.getClusterManager().getAllNodesByCluster(c.getName()).size()),
          getFormatedHealth(c.getName()));
      end();
    }
    end();
    end();
  }
 protected void createTr(String... data) {
   tr();
   for (String d : data) td().text(d).end();
   end();
 }
 protected void createAddFwdRuleForm() {
   form().id("addFwdRuleForm").action("/admin/frule/save").method("POST");
   div()
       .span()
       .text("Name")
       .end()
       .span()
       .input()
       .type("text")
       .id("name")
       .name("name")
       .classAttr("validate[required]")
       .end(2)
       .span()
       .text("Listen Port")
       .end()
       .span()
       .input()
       .type("text")
       .id("port")
       .name("port")
       .size("5")
       .classAttr("validate[required,custom[integer]]")
       .end(2)
       .span()
       .text("Method")
       .end()
       .span()
       .select()
       .id("method")
       .name("method")
       .option()
       .text("*")
       .end()
       .option()
       .text("GET")
       .end()
       .option()
       .text("POST")
       .end()
       .option()
       .text("DELETE")
       .end()
       .end(2)
       .span()
       .text("Target Host")
       .end()
       .span()
       .input()
       .type("text")
       .id("targetHost")
       .name("targetHost")
       .classAttr("validate[required]")
       .end(2)
       .span()
       .text("Target Port")
       .end()
       .span()
       .input()
       .type("text")
       .id("targetPort")
       .name("targetPort")
       .size("5")
       .classAttr("validate[required,custom[integer]]")
       .end(2)
       .span()
       .input()
       .value("Add")
       .type("submit")
       .classAttr("mb-button")
       .end(2);
   end();
   end();
 }