From fcb109f46da9ec049d21528ccd6f924f93cb2e9b Mon Sep 17 00:00:00 2001
From: jrandom <jrandom>
Date: Sat, 31 Jul 2004 23:19:23 +0000
Subject: [PATCH] made the last of the config pages support dynamic updates
 (w3wt)

---
 .../i2p/router/web/ConfigLoggingHandler.java  | 153 ++++++++++++++++++
 .../i2p/router/web/ConfigLoggingHelper.java   |  95 +++++------
 apps/routerconsole/jsp/configlogging.jsp      |  12 +-
 3 files changed, 204 insertions(+), 56 deletions(-)
 create mode 100644 apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java

diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java
new file mode 100644
index 0000000000..4be78b2e8f
--- /dev/null
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java
@@ -0,0 +1,153 @@
+package net.i2p.router.web;
+
+import java.io.ByteArrayInputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Properties;
+import net.i2p.util.Log;
+
+/**
+ * Handler to deal with form submissions from the logging config form and act
+ * upon the values.
+ *
+ */
+public class ConfigLoggingHandler extends FormHandler {
+    private boolean _shouldSave;
+    private String _levels;
+    private String _defaultLevel;
+    private String _filename;
+    private String _recordFormat;
+    private String _dateFormat;
+    private String _fileSize;
+    
+    public void ConfigNetHandler() {
+        _shouldSave = false;
+    }
+    
+    protected void processForm() {
+        if (_shouldSave) {
+            saveChanges();
+        } else {
+            // noop
+        }
+    }
+    
+    public void setShouldsave(String moo) { _shouldSave = true; }
+    
+    public void setLevels(String levels) {
+        _levels = (levels != null ? levels.trim() : null);
+    }
+    public void setDefaultloglevel(String level) {
+        _defaultLevel = (level != null ? level.trim() : null);
+    }
+    public void setFilename(String filename) {
+        _filename = (filename != null ? filename.trim() : null);
+    }
+    public void setRecordformat(String format) {
+        _recordFormat = (format != null ? format.trim() : null);
+    }
+    public void setDateformat(String format) {
+        _dateFormat = (format != null ? format.trim() : null);
+    }
+    public void setFilesize(String size) {
+        _fileSize = (size != null ? size.trim() : null);
+    }
+    
+    /**
+     * The user made changes to the config and wants to save them, so
+     * lets go ahead and do so.
+     *
+     */
+    private void saveChanges() {
+        boolean shouldSave = false;
+        
+        if (_levels != null) {
+            try {
+                Properties props = new Properties();
+                props.load(new ByteArrayInputStream(_levels.getBytes()));
+                _context.logManager().setLimits(props);
+                shouldSave = true;
+                addFormNotice("Log limits updated");
+            } catch (IOException ioe) {
+                _context.logManager().getLog(ConfigLoggingHandler.class).error("Error reading from the props?", ioe);
+                addFormError("Error updating the log limits - levels not valid");
+            }
+        } else {
+            _context.logManager().setLimits(null);
+            addFormNotice("Log limits cleared");
+        }
+          
+        if (_defaultLevel != null) {
+            String oldDefault = _context.logManager().getDefaultLimit();
+            if (_defaultLevel.equals(oldDefault)) {
+                // noop
+            } else {
+                shouldSave = true;
+                _context.logManager().setDefaultLimit(_defaultLevel);
+                addFormNotice("Default log level updated from " + oldDefault + " to " + _defaultLevel);
+            }
+        }
+        
+        if (_dateFormat != null) {
+            boolean valid = _context.logManager().setDateFormat(_dateFormat);
+            if (valid) {
+                shouldSave = true;
+                addFormNotice("Date format updated");
+            } else {
+                addFormError("Specified date format is not valid (" + _dateFormat + ") - not updated");
+            }
+        }
+        
+        if (_fileSize != null) {
+            int newBytes = _context.logManager().getFileSize(_fileSize);
+            int oldBytes = _context.logManager().getFileSize();
+            if (newBytes > 0) {
+                if (oldBytes != newBytes) {
+                    _context.logManager().setFileSize(newBytes);
+                    shouldSave = true;
+                    addFormNotice("File size updated");
+                } 
+            } else {
+                addFormError("Specified file size limit is not valid (" + _fileSize + ") - not updated");
+            }
+        }
+        
+        if ( (_filename != null) && (_filename.trim().length() > 0) ) {
+            _filename = _filename.trim();
+            String old = _context.logManager().getBaseLogfilename();
+            if ( (old != null) && (_filename.equals(old)) ) {
+                // noop - don't update since its the same
+            } else {
+                shouldSave = true;
+                _context.logManager().setBaseLogfilename(_filename);
+                addFormNotice("Log file name pattern updated to " + _filename 
+                              + " (note: will not take effect until next rotation)");
+            }
+        }
+        
+        if ( (_recordFormat != null) && (_recordFormat.trim().length() > 0) ) {
+            _recordFormat = _recordFormat.trim();
+            String old = new String(_context.logManager().getFormat());
+            if (_recordFormat.equalsIgnoreCase(old)) {
+                // noop - no change
+            } else {
+                char fmt[] = new char[_recordFormat.length()];
+                for (int i = 0; i < fmt.length; i++) 
+                    fmt[i] = _recordFormat.charAt(i);
+                _context.logManager().setFormat(fmt);
+                shouldSave = true;
+                addFormNotice("Log record format updated");
+            }
+        }
+        
+        if (shouldSave) {
+            boolean saved = _context.logManager().saveConfig();
+
+            if (saved) 
+                addFormNotice("Log configuration saved and applied successfully");
+            else
+                addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs");
+        }
+    }
+}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java
index 9230d2166e..d526f5b0db 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java
@@ -2,9 +2,10 @@ package net.i2p.router.web;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.List;
 import java.util.Iterator;
-import java.util.TreeMap;
+import java.util.List;
+import java.util.Properties;
+import java.util.TreeSet;
 
 import net.i2p.util.Log;
 
@@ -49,65 +50,49 @@ public class ConfigLoggingHelper {
     }
     public String getLogLevelTable() {
         StringBuffer buf = new StringBuffer(32*1024);
-        buf.append("<textarea rows=\"20\" cols=\"80\">");
-        List logs = _context.logManager().getLogs();
-        TreeMap sortedLogs = new TreeMap();
-        for (int i = 0; i < logs.size(); i++) {
-            Log l = (Log)logs.get(i);
-            sortedLogs.put(l.getName(), l);
+        Properties limits = _context.logManager().getLimits();
+        TreeSet sortedLogs = new TreeSet();
+        for (Iterator iter = limits.keySet().iterator(); iter.hasNext(); ) {
+            String prefix = (String)iter.next();
+            sortedLogs.add(prefix);
         }
-        int i = 0;
-        for (Iterator iter = sortedLogs.values().iterator(); iter.hasNext(); i++) {
-            Log l = (Log)iter.next();
-            buf.append(l.getName()).append('=');
-            buf.append(Log.toLevelString(l.getMinimumPriority()));
-            buf.append("\n");
+        
+        buf.append("<textarea name=\"levels\" rows=\"20\" cols=\"70\">");
+        for (Iterator iter = sortedLogs.iterator(); iter.hasNext(); ) {
+            String prefix = (String)iter.next();
+            String level = limits.getProperty(prefix);
+            buf.append(prefix).append('=').append(level).append('\n');
         }
         buf.append("</textarea><br />\n");
         buf.append("<i>Valid levels are DEBUG, INFO, WARN, ERROR, CRIT</i>\n");
         return buf.toString();
     }
-    public String getLogLevelTableDetail() {
-        StringBuffer buf = new StringBuffer(8*1024);
-        buf.append("<table border=\"1\">\n");
-        buf.append("<tr><td>Package/class</td><td>Level</td></tr>\n");
-        List logs = _context.logManager().getLogs();
-        TreeMap sortedLogs = new TreeMap();
-        for (int i = 0; i < logs.size(); i++) {
-            Log l = (Log)logs.get(i);
-            sortedLogs.put(l.getName(), l);
-        }
-        int i = 0;
-        for (Iterator iter = sortedLogs.values().iterator(); iter.hasNext(); i++) {
-            Log l = (Log)iter.next();
-            buf.append("<tr>\n <td><input size=\"50\" type=\"text\" name=\"logrecord.");
-            buf.append(i).append(".package\" value=\"").append(l.getName());
-            buf.append("\" /></td>\n");
-            buf.append("<td><select name=\"logrecord.").append(i);
-            buf.append(".level\">\n\t");
-            buf.append("<option value=\"DEBUG\" ");
-            if (l.getMinimumPriority() == Log.DEBUG)
-                buf.append("selected=\"true\" ");
-            buf.append(">Debug</option>\n\t");
-            buf.append("<option value=\"INFO\" ");
-            if (l.getMinimumPriority() == Log.INFO)
-                buf.append("selected=\"true\" ");
-            buf.append(">Info</option>\n\t");
-            buf.append("<option value=\"WARN\" ");
-            if (l.getMinimumPriority() == Log.WARN)
-                buf.append("selected=\"true\" ");
-            buf.append(">Warn</option>\n\t");
-            buf.append("<option value=\"ERROR\" ");
-            if (l.getMinimumPriority() == Log.ERROR)
-                buf.append("selected=\"true\" ");
-            buf.append(">Error</option>\n\t");
-            buf.append("<option value=\"CRIT\" ");
-            if (l.getMinimumPriority() == Log.CRIT)
-                buf.append("selected=\"true\" ");
-            buf.append(">Critical</option>\n\t");
-            buf.append("</select></td>\n</tr>\n");
-        }
-        buf.append("</table>\n");
+    public String getDefaultLogLevelBox() {
+        String cur = _context.logManager().getDefaultLimit();
+        StringBuffer buf = new StringBuffer(128);
+        buf.append("<select name=\"defaultloglevel\">\n");
+        
+        buf.append("<option value=\"DEBUG\" ");
+        if ("DEFAULT".equals(cur)) buf.append(" selected=\"true\" ");
+        buf.append(">DEBUG</option>\n");
+        
+        buf.append("<option value=\"INFO\" ");
+        if ("INFO".equals(cur)) buf.append(" selected=\"true\" ");
+        buf.append(">INFO</option>\n");
+        
+        buf.append("<option value=\"WARN\" ");
+        if ("WARN".equals(cur)) buf.append(" selected=\"true\" ");
+        buf.append(">WARN</option>\n");
+        
+        buf.append("<option value=\"ERROR\" ");
+        if ("WARN".equals(cur)) buf.append(" selected=\"true\" ");
+        buf.append(">ERROR</option>\n");
+        
+        buf.append("<option value=\"CRIT\" ");
+        if ("CRIT".equals(cur)) buf.append(" selected=\"true\" ");
+        buf.append(">CRIT</option>\n");
+        
+        buf.append("</select>\n");
         return buf.toString();
     }
 }
diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp
index 0c8fa20556..9a2041e2f0 100644
--- a/apps/routerconsole/jsp/configlogging.jsp
+++ b/apps/routerconsole/jsp/configlogging.jsp
@@ -14,6 +14,13 @@
 
 <div class="main" id="main">
  <%@include file="confignav.jsp" %>
+ 
+ <jsp:useBean class="net.i2p.router.web.ConfigLoggingHandler" id="formhandler" scope="request" />
+ <jsp:setProperty name="formhandler" property="*" />
+ <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
+ <font color="red"><jsp:getProperty name="formhandler" property="errors" /></font>
+ <i><jsp:getProperty name="formhandler" property="notices" /></i>
+  
  <form action="configlogging.jsp" method="POST">
  <b>Logging filename:</b> 
     <input type="text" name="logfilename" size="40" value="<jsp:getProperty name="logginghelper" property="logFilePattern" />" /><br />
@@ -28,9 +35,12 @@
     <input type="text" name="logfilesize" size="4" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" /><br />
   <hr />
   <b>Log levels:</b> <br />
+  <b>Default log level:</b>
+   <jsp:getProperty name="logginghelper" property="defaultLogLevelBox" /><br />
    <jsp:getProperty name="logginghelper" property="logLevelTable" />
  <hr />
- <input type="submit" value="Apply changes" /> <input type="submit" value="Apply and Save" /> <input type="reset" value="Cancel" />
+ <input type="submit" name="shouldsave" value="Save changes" /> 
+ <input type="reset" value="Cancel" />
  </form>
 </div>
 
-- 
GitLab