Author: psmith
Date: Mon Nov 14 13:57:11 2005
New Revision: 344246

URL: http://svn.apache.org/viewcvs?rev=344246&view=rev
Log:
Added MRU File list to File menu.

Now when a user opens a local XML log file, it is remembered via
a MRU list, which is persisted using the XStream lib (BSD license).

Currently only log4j format log files are remembered, but there are
some hooks to add java.util loggings own MRU list soon.

Added:
    
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileList.java
    
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileListPreferenceSaver.java
    logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/prefs/
    
logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/prefs/MRUFileListTest.java
Modified:
    
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileLoadAction.java
    logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileMenu.java
    logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java

Modified: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileLoadAction.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileLoadAction.java?rev=344246&r1=344245&r2=344246&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileLoadAction.java 
(original)
+++ 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileLoadAction.java 
Mon Nov 14 13:57:11 2005
@@ -31,6 +31,7 @@
 import javax.swing.filechooser.FileFilter;
 
 import org.apache.log4j.Logger;
+import org.apache.log4j.chainsaw.prefs.MRUFileList;
 import org.apache.log4j.helpers.Constants;
 import org.apache.log4j.spi.Decoder;
 import org.apache.log4j.spi.LoggingEvent;
@@ -128,6 +129,7 @@
 
         if (url != null) {
             importURL(parent.handler, decoder, name, url);
+            MRUFileList.log4jMRU().opened(url);
         }
     }
 
@@ -157,6 +159,7 @@
                     // TODO Handle the error with a nice msg
                     LOG.error(e1);
                 }
+                MRUFileList.log4jMRU().opened(urlToUse);
             }
         }).start();
     }

Modified: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileMenu.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileMenu.java?rev=344246&r1=344245&r2=344246&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileMenu.java 
(original)
+++ logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/FileMenu.java Mon 
Nov 14 13:57:11 2005
@@ -23,6 +23,8 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
+import java.net.URL;
+import java.util.Iterator;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
@@ -30,8 +32,12 @@
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
 import javax.swing.KeyStroke;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.apache.log4j.chainsaw.icons.ChainsawIcons;
+import org.apache.log4j.chainsaw.prefs.MRUFileList;
+import org.apache.log4j.chainsaw.prefs.MRUFileListTest;
 import org.apache.log4j.xml.UtilLoggingXMLDecoder;
 import org.apache.log4j.xml.XMLDecoder;
 
@@ -112,9 +118,53 @@
     addSeparator();
     add(saveFile);
     addSeparator();
+
+    final JMenu mrulog4j = new JMenu("MRU...");
+    
+  
+    
+    MRUFileList.addChangeListener(new ChangeListener() {
+        
+        public void stateChanged(ChangeEvent e) {
+            
+            buildMRUMenu(mrulog4j, logUI);
+        }
+        
+    });
+    buildMRUMenu(mrulog4j, logUI);
+    
+    add(mrulog4j);
+    addSeparator();
     add(menuItemExit);
+    
+    
   }
 
+  private void buildMRUMenu(final JMenu mrulog4j, final LogUI logui) {
+        mrulog4j.removeAll();
+        int counter = 1;
+        if (MRUFileList.log4jMRU().getMRUList().size() > 0) {
+            for (Iterator iter = 
MRUFileList.log4jMRU().getMRUList().iterator(); iter
+                    .hasNext();) {
+                final URL url = (URL) iter.next();
+                // TODO work out the 'name', for local files it can't just be 
the full path
+                final String name = 
url.getProtocol().startsWith("file")?url.getPath().substring(url.getPath().lastIndexOf('/')+1):url.getPath();
+                String title = (counter++) + " - " + url.toExternalForm();
+                JMenuItem menuItem = new JMenuItem(new AbstractAction(title) {
+
+                    public void actionPerformed(ActionEvent e) {
+                        FileLoadAction.importURL(logui.handler,
+                                new XMLDecoder(), name, url);
+                    }
+                });
+                mrulog4j.add(menuItem);
+            }
+        } else {
+            JMenuItem none = new JMenuItem("None as yet...");
+            none.setEnabled(false);
+            mrulog4j.add(none);
+        }
+    }
   Action getLog4JFileOpenAction() {
     return loadLog4JAction;
   }

Modified: logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java?rev=344246&r1=344245&r2=344246&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java 
(original)
+++ logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java Mon 
Nov 14 13:57:11 2005
@@ -95,6 +95,7 @@
 import org.apache.log4j.chainsaw.messages.MessageCenter;
 import org.apache.log4j.chainsaw.plugins.PluginClassLoaderFactory;
 import org.apache.log4j.chainsaw.prefs.LoadSettingsEvent;
+import org.apache.log4j.chainsaw.prefs.MRUFileListPreferenceSaver;
 import org.apache.log4j.chainsaw.prefs.SaveSettingsEvent;
 import org.apache.log4j.chainsaw.prefs.SettingsListener;
 import org.apache.log4j.chainsaw.prefs.SettingsManager;
@@ -840,6 +841,7 @@
 
     getSettingsManager().addSettingsListener(this);
     getSettingsManager().addSettingsListener(applicationPreferenceModel);
+    
getSettingsManager().addSettingsListener(MRUFileListPreferenceSaver.getInstance());
     getSettingsManager().loadSettings();
 
     setVisible(true);

Added: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileList.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileList.java?rev=344246&view=auto
==============================================================================
--- 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileList.java
 (added)
+++ 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileList.java
 Mon Nov 14 13:57:11 2005
@@ -0,0 +1,97 @@
+package org.apache.log4j.chainsaw.prefs;
+
+import java.io.Reader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EventListener;
+import java.util.List;
+
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.EventListenerList;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+public class MRUFileList{
+
+    private static MRUFileList log4jList = new MRUFileList();
+    private static MRUFileList jdk14List = new MRUFileList();
+    private static final int DEFAULT_MRU_SIZE = 5;
+    
+    private List fileList = new ArrayList();
+    private int size = DEFAULT_MRU_SIZE;
+    
+    private static transient EventListenerList listeners = new 
EventListenerList();
+    
+    private MRUFileList() {
+        
+    }
+    
+    public static void addChangeListener(ChangeListener listener){
+        listeners.add(ChangeListener.class, listener);
+    }
+    public static void removeChangeListener(ChangeListener listener) {
+        listeners.remove(ChangeListener.class, listener);
+    }
+    
+    /**
+     * Call this method when something opens a log file, this method
+     * adds the URL to the list of known URL's, automatically 
+     * rolling the list to ensure the list maintains the
+     * size property
+     * 
+     * 
+     * @param url
+     */
+    public void opened(URL url) {
+        // first remove any existence of the URL already, make sure we don't 
have dupes
+        fileList.remove(url);
+        // now make sure we obey the size property,  leaving room for 1 more 
to be added at the front
+        while(fileList.size()>=size) {
+            fileList.remove(fileList.size()-1);
+        }
+        fileList.add(0, url);
+        fireChangeEvent();
+    }
+    
+    private static void fireChangeEvent() {
+        
+        ChangeEvent event = null;
+        EventListener[] eventListeners = 
listeners.getListeners(ChangeListener.class);
+        for (int i = 0; i < eventListeners.length; i++) {
+            ChangeListener listener = (ChangeListener) eventListeners[i];
+            if(event==null) {
+                event = new ChangeEvent(MRUFileList.class);
+            }
+            listener.stateChanged(event);
+        }
+    }
+
+    /**
+     * Returns an <b>unmodifiable</b> List of the MRU opened file list within 
Chainsaw
+     * 
+     * @return
+     */
+    public List getMRUList() {
+        return Collections.unmodifiableList(fileList);
+    }
+
+    public static MRUFileList log4jMRU() {
+        return log4jList;
+    }
+    
+    public static void loadLog4jMRUListFromXML(String xml) {
+        XStream xstream = new XStream(new DomDriver());
+        log4jList = (MRUFileList) xstream.fromXML(xml);
+        fireChangeEvent();
+    }
+    public static void loadLog4jMRUListFromReader(Reader reader) {
+        XStream xstream = new XStream(new DomDriver());
+        log4jList = (MRUFileList) xstream.fromXML(reader);
+        fireChangeEvent();
+        
+    }
+        // TODO Auto-generated method stub
+}

Added: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileListPreferenceSaver.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileListPreferenceSaver.java?rev=344246&view=auto
==============================================================================
--- 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileListPreferenceSaver.java
 (added)
+++ 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/prefs/MRUFileListPreferenceSaver.java
 Mon Nov 14 13:57:11 2005
@@ -0,0 +1,56 @@
+package org.apache.log4j.chainsaw.prefs;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+/**
+ * Loads/Saves the MRU lists from preferences
+ * 
+ * @author psmith
+ *
+ */
+public class MRUFileListPreferenceSaver implements SettingsListener{
+
+    private static final MRUFileListPreferenceSaver instance = new 
MRUFileListPreferenceSaver();
+    
+    public static final MRUFileListPreferenceSaver getInstance() {
+        return instance;
+    }
+    private MRUFileListPreferenceSaver() {}
+    
+    public void loadSettings(LoadSettingsEvent event) {
+        File file = 
getMRULocation(SettingsManager.getInstance().getSettingsDirectory());
+        if(file.exists()) {
+            try {
+                MRUFileList.loadLog4jMRUListFromReader(new FileReader(file));
+            } catch (Exception e) {
+//                TODO exception handling
+                e.printStackTrace();
+            }
+        }
+        
+    }
+
+    public void saveSettings(SaveSettingsEvent event) {
+        XStream stream = new XStream(new DomDriver());
+        try {
+            File file = getMRULocation(event.getSettingsLocation());
+            System.out.println("Writing MRU ->" + file.getAbsolutePath());
+            FileWriter writer = new FileWriter(file);
+            stream.toXML(MRUFileList.log4jMRU(), writer);
+            writer.close();
+        } catch (Exception e) {
+//            TODO exception handling
+            e.printStackTrace();
+        }
+    }
+    private File getMRULocation(File dir) {
+        File file = new File(dir, "mru.xml");
+        return file;
+    }
+
+}

Added: 
logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/prefs/MRUFileListTest.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/prefs/MRUFileListTest.java?rev=344246&view=auto
==============================================================================
--- 
logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/prefs/MRUFileListTest.java
 (added)
+++ 
logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/prefs/MRUFileListTest.java
 Mon Nov 14 13:57:11 2005
@@ -0,0 +1,69 @@
+package org.apache.log4j.chainsaw.prefs;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+import junit.framework.TestCase;
+
+public class MRUFileListTest extends TestCase {
+    private static final String[] urls = new String[] {
+            "file://foo.bar.txt",
+            "http://www.cnn.com";,
+            "file://uber.log",
+            "http://logging.apache.org/";,
+            "https://something.com";,
+            "file:///usr/local/tomcat/logs/catalina.out",
+            
+    };
+    
+    public static final String EXAMPLE_XML = 
"<org.apache.log4j.chainsaw.prefs.MRUFileList>\n" + 
+            "  <fileList>\n" + 
+            "    <url>file:/usr/local/tomcat/logs/catalina.out</url>\n" + 
+            "    <url>https://something.com</url>\n" + 
+            "    <url>http://logging.apache.org/</url>\n" + 
+            "    <url>file://uber.log</url>\n" + 
+            "    <url>http://www.cnn.com</url>\n" + 
+            "  </fileList>\n" + 
+            "  <size>5</size>\n" + 
+            "</org.apache.log4j.chainsaw.prefs.MRUFileList>";
+    
+    MRUFileList fl =  MRUFileList.log4jMRU();
+    
+    
+    public void testMRUFileList() throws Exception {
+        
+        assertEquals(fl.getMRUList().size(), 0);
+        
+        for (int i = 0; i < urls.length; i++) {
+            String url = urls[i];
+            fl.opened(new URL(url));
+        }
+        
+        assertEquals(5, fl.getMRUList().size());
+        assertEquals(new URL(urls[5]), fl.getMRUList().get(0));
+        
+        assertTrue(!fl.getMRUList().contains(new URL(urls[0])));
+        
+    }
+    
+    public void testSerialization() {
+        XStream xstream = new XStream(new DomDriver());
+        String string = xstream.toXML(fl);
+        System.out.println("toXML:");
+        System.out.println(string);
+        
+        MRUFileList newFL =   (MRUFileList) xstream.fromXML(string);
+        assertEquals(5, newFL.getMRUList().size());
+        
+        System.out.println("After object->xml->object:");
+        String string2 = xstream.toXML(newFL);
+        System.out.println(string2);
+        assertEquals(string, string2);
+        
+        
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to