001    // Copyright (c) 2001 Hursh Jain (http://www.mollypages.org) 
002    // The Molly framework is freely distributable under the terms of an
003    // MIT-style license. For details, see the molly pages web site at:
004    // http://www.mollypages.org/. Use, modify, have fun !
005    
006    package fc.web.servlet;
007    
008    import javax.servlet.*;
009    import javax.servlet.http.*;
010    import java.sql.*;
011    import java.io.*;
012    import java.util.*;
013    
014    import fc.io.*;
015    import fc.jdbc.*;
016    import fc.web.*;
017    
018    /** 
019    Allows tweaking of configuration parameters (such as log levels) at
020    runtime.
021    <br>
022    <b>
023    This servlet should be configured/deployed to be invokable only from the
024    localhost or trusted network(s).
025    </b>
026    @author hursh jain
027    */
028    public class AdminServlet extends FCBaseServlet 
029    {
030    /*IMPL NOTE:
031    sunchronize stuff that can be tweaked here with ContextInit
032    */
033    public void init(ServletConfig conf) throws ServletException 
034      {
035      super.init(conf);
036      }
037    
038    public void doGet(HttpServletRequest request, HttpServletResponse response) 
039    throws ServletException, IOException
040      {
041      PrintWriter out = response.getWriter(); 
042      try {
043        showSQLForm(request, response);
044        }
045      catch (SQLException ex) {
046        out.print("<pre>");
047        ex.printStackTrace(out);
048        out.print("</pre>");
049        throw new ServletException(ex);
050        }
051      }
052      
053    public void doPost(HttpServletRequest request, HttpServletResponse response) 
054    throws ServletException, IOException
055      {
056      response.setContentType("text/html");
057      PrintWriter out = response.getWriter();
058      Connection con = null;
059      ServletContext context = getServletContext();
060    
061      try 
062      { 
063      //1. Set the default context log
064      String loglevel = request.getParameter("log.level");
065      //log.bug("----------> context loglevel", loglevel);
066      if (loglevel != null && ! loglevel.equals("n/a")) 
067        {
068        log.bug("Adjusting log level for the application log; new level=", loglevel);
069        WebApp.getInstance(appName).getAppLog().setLevel(loglevel);
070        }
071    
072      //2. set servlet specific log levels
073      Map allservlets = WebApp.getInstance(appName).allServletsMap;
074      
075      Enumeration e = request.getParameterNames();
076      while (e.hasMoreElements()) 
077        {
078        String param_name = (String) e.nextElement();
079        if (param_name.startsWith("servlet.log."))
080          {
081          loglevel = request.getParameter(param_name);
082          if (loglevel != null && ! loglevel.equals("n/a")) 
083            {
084            log.bug("Adjusting log level for: ", param_name, "; new level=", loglevel);
085            String log_name = param_name.substring(12, param_name.length()); //"servlet.log.X",X=12
086            FCBaseServlet servlet = (FCBaseServlet) allservlets.get(log_name);
087            if (servlet == null) {
088              log.bug("Error setting new level for", param_name, "; log not found in all_logs map");
089              }
090            else {
091              Log log = servlet.getLog();
092              log.setLevel(loglevel);
093              }
094            }
095          }   
096        } //~while
097      showSQLForm(request, response);
098      } //~try
099      catch (SQLException ex) {
100        out.print("<pre>");
101        ex.printStackTrace(out);
102        out.print("</pre>");
103        throw new ServletException(ex);
104        }
105      }  //~doPost
106    
107    
108    void showSQLForm(HttpServletRequest request, HttpServletResponse response) 
109    throws ServletException, IOException, SQLException
110      {
111      ServletContext context = getServletContext();
112    
113      //we need to calculate this on the fly because the servlet may
114      //be invoked via some deployment specific servlet mapping name
115      String actionURL = request.getServletPath();
116      
117      response.setContentType("text/html");
118      PrintWriter out = response.getWriter();
119      out.println("<html><head></head><body bgcolor='#FFFFFF'><center>");
120    
121      out.print("<form method=post action=" + actionURL + ">");
122    
123      out.println("<h1>Admin Servlet</h1><hr>");
124    
125      //CONNECTION MANAGER
126      out.println("<h3>Installed Connection Managers Information</h3>");
127      out.println(WebApp.getInstance(appName).connectionManagers);
128      out.println("<hr>");
129      out.println("Default Connection Manager");
130      out.println(WebApp.getInstance(appName).getConnectionMgr());
131      out.println("<hr>");
132    
133      //LOGGERS
134      out.println("<h3>Current Logging Information</h3>");
135      out.println("<table border=1>");
136      out.println("<tr bgcolor=#cdcdcd><td width=50%><b>Context/Default log</b></td><td>Current Level</td><td>Select a new level</td></tr>");
137    
138      Log defaultlog =  WebApp.getInstance(appName).getAppLog();
139      out.println("<tr><td>");
140      out.println("This is the default log used by the fc framework and by the ServletContext (and stored in the context under the <tt>ContextInit.DEFAULT_LOG_KEY</tt> key)");
141      out.println("</td><td>");
142      out.println(defaultlog.getLevel());
143      out.println("</td><td>");
144      printLogSelect(out, "defaultlog");
145      out.println("</td></tr>");
146    
147      out.println("<tr><td colspan=3>&nbsp</td></tr>");
148      out.println("<tr bgcolor=#cdcdcd><td><b>Per Servlet/JSP logs</b></td><td>Current Level</td><td>Select a new level</td></tr>");
149    
150      Map allservlets = WebApp.getInstance(appName).allServletsMap;
151      Iterator it = allservlets.entrySet().iterator();
152      while (it.hasNext()) 
153        {
154        Map.Entry entry = (Map.Entry) it.next();
155        FCBaseServlet servlet = (FCBaseServlet) entry.getValue();
156        Log log = servlet.getLog();
157        out.print("<tr><td>[<font color=blue>");
158        out.print(servlet);
159        out.print("</font>]<br>");
160        out.print(servlet.stats());
161        out.print("</td><td>");
162        out.print(log.getLevel());
163        out.print("</td><td>");
164        printLogSelect(out, 
165            "servlet.log." + servlet.getClass().getName());
166        out.println("</td></tr>");
167        }
168      out.println("</table>");
169      out.println("<hr>");
170      
171      //FORM END
172      out.print("<INPUT TYPE=submit name=submit value=submit></INPUT>");
173      out.print("</form></center></body></html>");
174      out.flush();
175      }
176    
177    void printLogSelect(PrintWriter out, Object selectname)
178      {
179      out.print("<select name='");
180      out.print(selectname);
181      out.print("'>");
182      out.println("<option value='n/a'>--[select]--</option>");
183      Iterator it = log.getLevelNames();
184      while (it.hasNext()) {
185        Object level_name = it.next();
186        out.print("<option value='");
187        out.print(level_name);
188        out.print("'>");
189        out.print(level_name);
190        out.println("</option>");
191        }
192      out.println("</select>");
193      }
194    
195    }