package com.cfinkel.reports.web; import com.cfinkel.reports.util.RunnerException; import com.cfinkel.reports.util.Util; import org.apache.log4j.Logger; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * $Author:charles $ * $Revision:10429 $ * $Date:2006-07-26 18:00:43 -0400 (Wed, 26 Jul 2006) $ */ public class AdminController implements Filter { private static final Logger log = Logger.getLogger(AdminController.class); public void init(FilterConfig filterConfig) { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; GlobalController.setHtmlResponseContent(request, response); if (isAdmin(request)) { if (Util.equalsAny(request.getServletPath(), "/admin", "/admin/")) { response.sendRedirect(request.getContextPath() + "/admin/index.jsp"); return; } // actions: if (request.getServletPath().startsWith("/admin/") && request.getServletPath().endsWith(".do")) { String action = request.getServletPath().substring(7, request.getServletPath().length() - 3); AppData.getReportsLock().writeLock().lock(); try { processAction(action, request, response); } finally { AppData.getReportsLock().writeLock().unlock(); } } else { // just forward to JSP page: chain.doFilter(servletRequest, servletResponse); } return; } // if user is admin else { // forward to error page: Exception e = new Exception("You do not have access"); request.setAttribute("error", e); RequestDispatcher rd = request.getRequestDispatcher("/error.jsp"); rd.include(request, response); return; } } private boolean isAdmin(HttpServletRequest request) { // if all are true, grant access: String allAreAdmin = AppData.getContext().getInitParameter("allAreAdmin"); if (allAreAdmin != null && Util.equalsAnyIgnoreCase(allAreAdmin, "true", "yes")) return true; // if adminUser set, check that for access: String adminUser = AppData.getContext().getInitParameter("adminUser"); if (adminUser != null) return request.isUserInRole(adminUser); // check if user is in this role for access: return request.isUserInRole("CN=developers,OU=aliases/lists,DC=cfinkel,DC=com"); } private void processAction(String action, HttpServletRequest request, HttpServletResponse response) throws IOException { if (action.equals("loadAllReports")) { AppData.loadAllReports(response.getOutputStream()); } else if (action.equals("unloadReportsClearSessionData")) { AppData.unloadReports(); AppData.clearSessionData(response.getOutputStream()); // AppData.reloadClasses(response); response.getOutputStream().println("Successfully unloaded reports and cleared session data"); } else if (action.equals("clearUserData")) { // clear users' data response.getOutputStream().println("not yet implemented"); } else if (action.equals("reloadClassesAndUpdateReports")) { try { AppData.reloadClasses(); AppData.updateCustomClasses(); } catch (RunnerException e) { log.error("Run error trying to reload classes", e); response.getOutputStream().println("Run error trying to reload classes: " + e.getMessage()); } response.getOutputStream().println("Successfully reloaded classes and updated reports"); } else if (action.equals("loadReport")) { AppData.loadReport(request.getParameter("reportPath"), response.getOutputStream()); } else if (action.equals("unloadReport")) { AppData.unloadReport(request.getParameter("reportPath"), response.getOutputStream()); } else if (action.equals("reloadReport")) { AppData.reloadReport(request.getParameter("reportPath"), response.getOutputStream()); /* } else if (action.equals("testSerialize")) { testSerialize(); */ } else { response.getOutputStream().println("not yet implemented"); } } public void destroy() { } /* public void testSerialize() { for (String reportName : AppData.getReports().keySet()) { Report report = AppData.getReports().get(reportName); FileOutputStream fos = null; ObjectOutputStream out = null; try { fos = new FileOutputStream("test"); out = new ObjectOutputStream(fos); out.writeObject(report); out.close(); } catch(IOException ex) { ex.printStackTrace(); } } } */ }