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 PanelLeft extends HttpServlet { private static final String MENU_FILE = "xml/menu.xml"; private static Logger logger = Logger.getLogger(PanelLeft.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(); Caller caller = (Caller)request.getSession().getAttribute("caller"); if (caller==null) { response.sendRedirect("Controller"); logger.error("Caller was null says PanelLeft"); return; } /* Write logo on top of menu */ out.println("<div id=\"logo\">"); out.println("<h1>CreZOO</h1>"); out.println("<div id=\"shortcuts\">"); // out.println("<a href=\"Controller?workflow=Home\">Home</a>"); out.println("<a href=\"Controller?workflow=About\">About</a>"); out.println("<a href=\"Controller?workflow=Help\">Help</a>"); if(caller != null && !caller.getUsr().equalsIgnoreCase("public")) { out.println("<a href=\"Controller?workflow=Logout\">Logout " + caller.getUsr() + "</a>"); out.println("<a href=\"Controller?workflow=ViewMyAccount\">Account</a>"); } else { out.println("<a href=\"Controller?workflow=Login\">Login</a>"); } out.println("<form method=\"post\" action=\"Controller?workflow=SearchKeywordFast\">"); out.println("<span>Search</span>"); out.println("<input type=\"text\" name=\"fast_search_key\" />"); out.println("</form>"); out.println("</div>"); out.println("</div>"); out.println("<div id=\"under_logo\">"); out.println("<div id=\"banner\">"); out.println("<img id=\"banner_image\" src=\"images/under_logo.jpg\" alt=\"CreZOO\"/>"); out.println("</div>"); out.println("</div>"); 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=\"navigation\">"); // out.println("<div id=\"panel-left\">"); //out.println("<ul id=\"navlist\">"); //out.println("<ul id=\"red\" class=\"treeview-red\">"); out.println("<ul class=\"sf-menu\" >"); // 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> }