package org.tgdb.frame;
import org.tgdb.util.Timer;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class MenuAdvanced extends HttpServlet {
private static final String MENU_FILE = "xml/menu.xml";
private static Logger logger = Logger.getLogger(MenuAdvanced.class);
private String target;
private Document doc;
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Menu</title>");
out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"nav.css\" />");
out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"jquery.treeview.css\" />");
out.println("<script type=\"text/javascript\" src=\"javascripts/jquery.min.js\"></script>");
out.println("<script src=\"javascripts/jquery.cookie.js\" type=\"text/javascript\"></script>");
out.println("<script src=\"javascripts/jquery.treeview.js\" type=\"text/javascript\"></script>");
out.println("<script type=\"text/javascript\" src=\"javascripts/demo.js\"></script>");
out.println("</head>");
out.println("<body>");
try {
/* Read the xml data */
parseXML();
/* Write logo on top of menu */
//out.println("<table height=\"100%\"><tr align=\"left\"><td id=\"logo\"></td></tr><tr valign=top><td>");
Caller caller = (Caller)request.getSession().getAttribute("caller");
if (caller==null) {
response.sendRedirect("Controller");
return;
}
printMenu(out, caller);
}
catch (Exception e) {
logger.error("Menu generation failed, general exception. Swallow!", e);
out.println("Failed to write menu. "+e.getMessage());
}
out.println("</body>");
out.println("</html>");
out.close();
}
private void printMenuItems(NodeList menuItems, PrintWriter out, Caller caller) {
if (menuItems.getLength()>0) out.println("<ul>");
for (int j=0;j<menuItems.getLength();j++) {
org.w3c.dom.Node node = menuItems.item(j);
if (node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
if (hasPrivilege(node, caller)) {
// Element e2 = (Element)menuItems.item(j);
out.println("<li>");
printMenuItem(node, out, caller);
// NodeList menuItems2 = node.getChildNodes();//e2.getElementsByTagName("menu-item");
printMenuItems(node.getChildNodes(), out, caller);
out.println("</li>");
}
}
}
if (menuItems.getLength()>0) out.println("</ul>");
}
private boolean hasPrivilege(Node node, Caller caller) {
NamedNodeMap attrs = node.getAttributes();
Node tmpNode = null;
String priv = null;
tmpNode = attrs.getNamedItem("priv");
if (tmpNode!=null)
priv = tmpNode.getNodeValue();
if (priv==null || priv.equals("") || caller.hasPrivilege(priv))
return true;
return false;
}
private void printMenuItem(org.w3c.dom.Node node, PrintWriter out, Caller caller) {
NamedNodeMap attrs = node.getAttributes();
if (attrs!=null) {
org.w3c.dom.Node tmpNode = null;
String name="", altName="";
tmpNode = attrs.getNamedItem("name");
if (tmpNode!=null) name = tmpNode.getNodeValue();
tmpNode = attrs.getNamedItem("alt-name");
if (tmpNode!=null) altName = tmpNode.getNodeValue();
String priv = null;
tmpNode = attrs.getNamedItem("priv");
if (tmpNode!=null) priv = tmpNode.getNodeValue();
if (priv==null || priv.equals("") || caller.hasPrivilege(priv)) {
String url = "#";
tmpNode = attrs.getNamedItem("workflow");
if (tmpNode!=null) url = "Controller?workflow="+tmpNode.getNodeValue();
tmpNode = attrs.getNamedItem("url");
if (tmpNode!=null) url = tmpNode.getNodeValue();
if (!url.equals("#")) {
out.println("<a target=\"" + target + "\" href=\"" + url + "\">" + name + "</a>");
}
else {
out.println("<span>" + name + "</span>");
}
}
}
}
private void printMenu(PrintWriter out, Caller caller) {
try {
// out.println("<div id=\"navcontainer\">");
out.println("<div>");
//out.println("<ul id=\"navlist\">");
//out.println("<ul id=\"red\" class=\"treeview-red\">");
out.println("<ul id=\"navigation\" >");
// Get root node menu
NodeList menus = doc.getElementsByTagName("menus");
Element menusElement = (Element)menus.item(0);
target = menusElement.getAttribute("target");
NodeList nl = menusElement.getChildNodes();
//NodeList nl = doc.getElementsByTagName("menu");
for (int i=0;i<nl.getLength();i++) {
Node node = nl.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element e = (Element)nl.item(i);
String name = e.getAttribute("name");
String workflow = e.getAttribute("workflow");
String priv = e.getAttribute("priv");
String admin = e.getAttribute("admin");
if (caller==null) throw new ArxFrameException("Caller is null");
if ((admin==null || admin.equals("") || caller.isAdmin()) && (priv==null || priv.equals("") || caller.hasPrivilege(priv))) {
out.println("<li>");
if (workflow!=null && !workflow.equals("")) {
out.println("<a target=\""+target+"\" href=\"Controller?workflow="+workflow+"\">"+name+"</a>");
}
else {
out.println("<span>"+name+"</span>");
}
printMenuItems(e.getChildNodes(), out, caller);
out.println("</li>");
}
}
}
out.println("</ul>");
out.println("</div>");
}
catch (ArxFrameException e) {
logger.error("Menu error", e);
out.println("Menu error: "+e.getMessage());
}
}
private void parseXML() throws Exception {
Timer t = new Timer();
try {
ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream(MENU_FILE);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(is);
}
catch (Exception e) {
logger.error("Failed to parse menu.xml file ("+MENU_FILE+")", e);
throw new Exception("Cannot display menu", e);
}
t.stop();
logger.debug("Menu#parseXML "+t);
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Menu Advanced";
}
// </editor-fold>
}