From: <k_s...@us...> - 2007-10-29 20:47:34
|
Revision: 10964 http://jedit.svn.sourceforge.net/jedit/?rev=10964&view=rev Author: k_satoda Date: 2007-10-29 13:47:22 -0700 (Mon, 29 Oct 2007) Log Message: ----------- Added a new package-private class SettingsXML to eliminate some code duplication around saving and loading XML files in settings directory. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/BufferHistory.java jEdit/trunk/org/gjt/sp/jedit/JEditKillRing.java jEdit/trunk/org/gjt/sp/jedit/JEditRegisterSaver.java jEdit/trunk/org/gjt/sp/jedit/PerspectiveManager.java Added Paths: ----------- jEdit/trunk/org/gjt/sp/jedit/SettingsXML.java Modified: jEdit/trunk/org/gjt/sp/jedit/BufferHistory.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/BufferHistory.java 2007-10-29 19:45:24 UTC (rev 10963) +++ jEdit/trunk/org/gjt/sp/jedit/BufferHistory.java 2007-10-29 20:47:22 UTC (rev 10964) @@ -23,7 +23,7 @@ package org.gjt.sp.jedit; //{{{ Imports -import java.io.*; +import java.io.IOException; import java.util.*; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -161,23 +161,18 @@ //{{{ load() method public static void load() { - String settingsDirectory = jEdit.getSettingsDirectory(); - if(settingsDirectory == null) + if(recentXML == null) return; - File recent = new File(MiscUtilities.constructPath( - settingsDirectory,"recent.xml")); - if(!recent.exists()) + if(!recentXML.fileExists()) return; - recentModTime = recent.lastModified(); + Log.log(Log.MESSAGE,BufferHistory.class,"Loading " + recentXML); - Log.log(Log.MESSAGE,BufferHistory.class,"Loading recent.xml"); - RecentHandler handler = new RecentHandler(); try { - XMLUtilities.parseXML(new FileInputStream(recent), handler); + recentXML.load(handler); } catch(IOException e) { @@ -190,41 +185,28 @@ //{{{ save() method public static void save() { - String settingsDirectory = jEdit.getSettingsDirectory(); - if(settingsDirectory == null) + if(recentXML == null) return; - File file1 = new File(MiscUtilities.constructPath( - settingsDirectory, "#recent.xml#save#")); - File file2 = new File(MiscUtilities.constructPath( - settingsDirectory, "recent.xml")); - if(file2.exists() && file2.lastModified() != recentModTime) + if(recentXML.hasChangedOnDisk()) { - Log.log(Log.WARNING,BufferHistory.class,file2 + Log.log(Log.WARNING,BufferHistory.class,recentXML + " changed on disk; will not save recent" + " files"); return; } - jEdit.backupSettingsFile(file2); + Log.log(Log.MESSAGE,BufferHistory.class,"Saving " + recentXML); - Log.log(Log.MESSAGE,BufferHistory.class,"Saving " + file1); - String lineSep = System.getProperty("line.separator"); - String encoding = "UTF-8"; - boolean ok = false; + SettingsXML.Saver out = null; - BufferedWriter out = null; - try { - out = new BufferedWriter(new OutputStreamWriter( - new FileOutputStream(file1), encoding)); + out = recentXML.openSaver(); + out.writeXMLDeclaration(); - out.write("<?xml version=\"1.0\"" - + " encoding=\"" + encoding + "\"?>"); - out.write(lineSep); out.write("<!DOCTYPE RECENT SYSTEM \"recent.dtd\">"); out.write(lineSep); out.write("<RECENT>"); @@ -281,7 +263,7 @@ out.write("</RECENT>"); out.write(lineSep); - ok = true; + out.finish(); } catch(Exception e) { @@ -291,28 +273,23 @@ { IOUtilities.closeQuietly(out); } - - if(ok) - { - /* to avoid data loss, only do this if the above - * completed successfully */ - file2.delete(); - file1.renameTo(file2); - } - - recentModTime = file2.lastModified(); } //}}} //{{{ Private members private static LinkedList<Entry> history; private static ReentrantReadWriteLock historyLock; - private static long recentModTime; + private static SettingsXML recentXML; //{{{ Class initializer static { history = new LinkedList<Entry>(); historyLock = new ReentrantReadWriteLock(); + String settingsDirectory = jEdit.getSettingsDirectory(); + if(settingsDirectory != null) + { + recentXML = new SettingsXML(settingsDirectory, "recent"); + } } //}}} //{{{ addEntry() method Modified: jEdit/trunk/org/gjt/sp/jedit/JEditKillRing.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/JEditKillRing.java 2007-10-29 19:45:24 UTC (rev 10963) +++ jEdit/trunk/org/gjt/sp/jedit/JEditKillRing.java 2007-10-29 20:47:22 UTC (rev 10964) @@ -23,7 +23,7 @@ import java.util.List; import java.util.LinkedList; -import java.io.*; +import java.io.IOException; import org.xml.sax.Attributes; import org.xml.sax.InputSource; @@ -41,25 +41,31 @@ */ class JEditKillRing extends KillRing { + //{{{ Constructor + public JEditKillRing() + { + String settingsDirectory = jEdit.getSettingsDirectory(); + if(settingsDirectory != null) + { + killringXML = new SettingsXML(settingsDirectory, "killring"); + } + } //}}} + //{{{ load() method public void load() { - String settingsDirectory = jEdit.getSettingsDirectory(); - if(settingsDirectory == null) + if(killringXML == null) return; - File killRing = new File(MiscUtilities.constructPath( - settingsDirectory,"killring.xml")); - if(!killRing.exists()) + if(!killringXML.fileExists()) return; - killRingModTime = killRing.lastModified(); - Log.log(Log.MESSAGE,KillRing.class,"Loading killring.xml"); + Log.log(Log.MESSAGE,KillRing.class,"Loading " + killringXML); KillRingHandler handler = new KillRingHandler(); try { - XMLUtilities.parseXML(new FileInputStream(killRing), handler); + killringXML.load(handler); } catch (IOException ioe) { @@ -71,39 +77,28 @@ //{{{ save() method public void save() { - String settingsDirectory = jEdit.getSettingsDirectory(); - if(settingsDirectory == null) + if(killringXML == null) return; - File file1 = new File(MiscUtilities.constructPath( - settingsDirectory, "#killring.xml#save#")); - File file2 = new File(MiscUtilities.constructPath( - settingsDirectory, "killring.xml")); - if(file2.exists() && file2.lastModified() != killRingModTime) + if(killringXML.hasChangedOnDisk()) { - Log.log(Log.WARNING,KillRing.class,file2 + Log.log(Log.WARNING,KillRing.class,killringXML + " changed on disk; will not save killring" + " files"); return; } - jEdit.backupSettingsFile(file2); + Log.log(Log.MESSAGE,KillRing.class,"Saving " + killringXML); - Log.log(Log.MESSAGE,KillRing.class,"Saving killring.xml"); - String lineSep = System.getProperty("line.separator"); - String encoding = "UTF-8"; - BufferedWriter out = null; + SettingsXML.Saver out = null; try { - out = new BufferedWriter(new OutputStreamWriter( - new FileOutputStream(file1), encoding)); + out = killringXML.openSaver(); + out.writeXMLDeclaration("1.1"); - out.write("<?xml version=\"1.1\"" - + " encoding=\"" + encoding + "\"?>"); - out.write(lineSep); out.write("<!DOCTYPE KILLRING SYSTEM \"killring.dtd\">"); out.write(lineSep); out.write("<KILLRING>"); @@ -122,12 +117,7 @@ out.write("</KILLRING>"); out.write(lineSep); - out.close(); - - /* to avoid data loss, only do this if the above - * completed successfully */ - file2.delete(); - file1.renameTo(file2); + out.finish(); } catch(Exception e) { @@ -140,7 +130,7 @@ } //}}} //{{{ Private members - private long killRingModTime; + private SettingsXML killringXML; //{{{ KillRingHandler class private static class KillRingHandler extends DefaultHandler Modified: jEdit/trunk/org/gjt/sp/jedit/JEditRegisterSaver.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/JEditRegisterSaver.java 2007-10-29 19:45:24 UTC (rev 10963) +++ jEdit/trunk/org/gjt/sp/jedit/JEditRegisterSaver.java 2007-10-29 20:47:22 UTC (rev 10964) @@ -27,7 +27,7 @@ import org.xml.sax.InputSource; import org.xml.sax.Attributes; -import java.io.*; +import java.io.IOException; /** * The concrete RegisterSaver for jEdit. @@ -36,28 +36,32 @@ */ class JEditRegisterSaver implements RegisterSaver { + //{{{ Constructor + public JEditRegisterSaver() + { + String settingsDirectory = jEdit.getSettingsDirectory(); + if(settingsDirectory != null) + { + registersXML = new SettingsXML(settingsDirectory, "registers"); + } + } //}}} + //{{{ loadRegisters() method public void loadRegisters() { - String settingsDirectory = jEdit.getSettingsDirectory(); - if(settingsDirectory == null) + if(registersXML == null) return; - File registerFile = new File(MiscUtilities.constructPath( - jEdit.getSettingsDirectory(),"registers.xml")); - if(!registerFile.exists()) + if(!registersXML.fileExists()) return; - registersModTime = registerFile.lastModified(); + Log.log(Log.MESSAGE,jEdit.class,"Loading " + registersXML); - Log.log(Log.MESSAGE,jEdit.class,"Loading registers.xml"); - RegistersHandler handler = new RegistersHandler(); try { Registers.setLoading(true); - XMLUtilities.parseXML(new FileInputStream(registerFile), - handler); + registersXML.load(handler); } catch (IOException ioe) { @@ -72,36 +76,27 @@ //{{{ saveRegisters() method public void saveRegisters() { + if(registersXML == null) + return; - Log.log(Log.MESSAGE,Registers.class,"Saving registers.xml"); - File file1 = new File(MiscUtilities.constructPath( - jEdit.getSettingsDirectory(), "#registers.xml#save#")); - File file2 = new File(MiscUtilities.constructPath( - jEdit.getSettingsDirectory(), "registers.xml")); - if(file2.exists() && file2.lastModified() != registersModTime) + if(registersXML.hasChangedOnDisk()) { - Log.log(Log.WARNING,Registers.class,file2 + " changed" - + " on disk; will not save registers"); + Log.log(Log.WARNING,Registers.class,registersXML + + " changed on disk; will not save registers"); return; } - jEdit.backupSettingsFile(file2); + Log.log(Log.MESSAGE,Registers.class,"Saving " + registersXML); String lineSep = System.getProperty("line.separator"); - String encoding = "UTF-8"; - BufferedWriter out = null; + SettingsXML.Saver out = null; - boolean ok = false; - try { - out = new BufferedWriter(new OutputStreamWriter( - new FileOutputStream(file1), encoding)); + out = registersXML.openSaver(); + out.writeXMLDeclaration(); - out.write("<?xml version=\"1.0\"" - + " encoding=\"" + encoding + "\"?>"); - out.write(lineSep); out.write("<!DOCTYPE REGISTERS SYSTEM \"registers.dtd\">"); out.write(lineSep); out.write("<REGISTERS>"); @@ -134,7 +129,7 @@ out.write("</REGISTERS>"); out.write(lineSep); - ok = true; + out.finish(); } catch(Exception e) { @@ -144,22 +139,13 @@ { IOUtilities.closeQuietly(out); } - - if(ok) - { - /* to avoid data loss, only do this if the above - * completed successfully */ - file2.delete(); - file1.renameTo(file2); - } - - registersModTime = file2.lastModified(); } //}}} - private static long registersModTime; + //{{{ Private members + private SettingsXML registersXML; //{{{ RegistersHandler class - static class RegistersHandler extends DefaultHandler + private static class RegistersHandler extends DefaultHandler { //{{{ resolveEntity() method public InputSource resolveEntity(String publicId, String systemId) @@ -202,4 +188,5 @@ private boolean inRegister; //}}} } //}}} + //}}} } Modified: jEdit/trunk/org/gjt/sp/jedit/PerspectiveManager.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/PerspectiveManager.java 2007-10-29 19:45:24 UTC (rev 10963) +++ jEdit/trunk/org/gjt/sp/jedit/PerspectiveManager.java 2007-10-29 20:47:22 UTC (rev 10964) @@ -22,7 +22,7 @@ package org.gjt.sp.jedit; -import java.io.*; +import java.io.IOException; import org.xml.sax.Attributes; import org.xml.sax.InputSource; @@ -87,22 +87,18 @@ //{{{ loadPerspective() method public static View loadPerspective(boolean restoreFiles) { - String settingsDirectory = jEdit.getSettingsDirectory(); - if(settingsDirectory == null) + if(perspectiveXML == null) return null; - File perspective = new File(MiscUtilities.constructPath( - settingsDirectory,"perspective.xml")); - - if(!perspective.exists()) + if(!perspectiveXML.fileExists()) return null; - Log.log(Log.MESSAGE,PerspectiveManager.class,"Loading " + perspective); + Log.log(Log.MESSAGE,PerspectiveManager.class,"Loading " + perspectiveXML); PerspectiveHandler handler = new PerspectiveHandler(restoreFiles); try { - XMLUtilities.parseXML(new FileInputStream(perspective), handler); + perspectiveXML.load(handler); } catch(IOException e) { @@ -117,8 +113,7 @@ if(!isPerspectiveEnabled()) return; - String settingsDirectory = jEdit.getSettingsDirectory(); - if(settingsDirectory == null) + if(perspectiveXML == null) return; // backgrounded @@ -126,26 +121,17 @@ return; if(!autosave) - Log.log(Log.MESSAGE,PerspectiveManager.class,"Saving perspective.xml"); + Log.log(Log.MESSAGE,PerspectiveManager.class,"Saving " + perspectiveXML); - File file1 = new File(MiscUtilities.constructPath( - settingsDirectory,"#perspective.xml#save#")); - File file2 = new File(MiscUtilities.constructPath( - settingsDirectory,"perspective.xml")); - String lineSep = System.getProperty("line.separator"); - String encoding = "UTF-8"; - BufferedWriter out = null; + SettingsXML.Saver out = null; try { - out = new BufferedWriter(new OutputStreamWriter( - new FileOutputStream(file1), encoding)); + out = perspectiveXML.openSaver(); + out.writeXMLDeclaration(); - out.write("<?xml version=\"1.0\"" - + " encoding=\"" + encoding + "\"?>"); - out.write(lineSep); out.write("<!DOCTYPE PERSPECTIVE SYSTEM \"perspective.dtd\">"); out.write(lineSep); out.write("<PERSPECTIVE>"); @@ -234,25 +220,36 @@ out.write("</PERSPECTIVE>"); out.write(lineSep); + + out.finish(); } catch(IOException io) { - Log.log(Log.ERROR,PerspectiveManager.class,"Error saving " + file1); + Log.log(Log.ERROR,PerspectiveManager.class,"Error saving " + perspectiveXML); Log.log(Log.ERROR,PerspectiveManager.class,io); } finally { IOUtilities.closeQuietly(out); } - - file2.delete(); - file1.renameTo(file2); } //}}} + //{{{ Private members private static boolean dirty, enabled = true; + private static SettingsXML perspectiveXML; + //{{{ Class initializer + static + { + String settingsDirectory = jEdit.getSettingsDirectory(); + if(settingsDirectory != null) + { + perspectiveXML = new SettingsXML(settingsDirectory, "perspective"); + } + } //}}} + //{{{ PerspectiveHandler class - static class PerspectiveHandler extends DefaultHandler + private static class PerspectiveHandler extends DefaultHandler { View view; Buffer currentBuffer; @@ -368,4 +365,6 @@ charData.append(ch,start,length); } } //}}} + + //}}} } Copied: jEdit/trunk/org/gjt/sp/jedit/SettingsXML.java (from rev 10963, jEdit/trunk/org/gjt/sp/jedit/BufferHistory.java) =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/SettingsXML.java (rev 0) +++ jEdit/trunk/org/gjt/sp/jedit/SettingsXML.java 2007-10-29 20:47:22 UTC (rev 10964) @@ -0,0 +1,188 @@ +/* + * :tabSize=8:indentSize=8:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * Copyright (C) 2007 Kazutoshi Satoda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package org.gjt.sp.jedit; + +//{{{ Imports +import java.io.File; +import java.io.IOException; +import java.io.FileOutputStream; +import java.io.FileInputStream; +import java.io.BufferedWriter; +import java.io.OutputStreamWriter; + +import org.xml.sax.helpers.DefaultHandler; + +import org.gjt.sp.util.XMLUtilities; +//}}} + +/** + * A XML file in the settings directory. + * This class provides some common operations to load/save settings + * from/into a XML file. + * - Proper encoding and XML declaration. + * - Two stage save. + * - Making backup on each save. + * - Detection of change on disk. + */ +class SettingsXML +{ + //{{{ Saver class + /** + * A Writer to write XML for saving. + * The real settings file is not changed until the finish() + * method succeeds, in which case the previous settings file is + * backuped. + */ + public class Saver extends BufferedWriter + { + //{{{ writeXMLDeclaration() method + /** + * Write the XML 1.0 declaration. + * This should be the first output. + */ + public void writeXMLDeclaration() throws IOException + { + writeXMLDeclaration("1.0"); + } //}}} + + //{{{ writeXMLDeclaration() method + /** + * Write the XML declaration of a specific version. + * This should be the first output. + */ + public void writeXMLDeclaration(String version) + throws IOException + { + write("<?xml" + + " version=\"" + version + "\"" + + " encoding=\"" + encoding + "\"" + + " ?>"); + newLine(); + } //}}} + + //{{{ finish() method + /** + * Perform the final step of saving. + */ + public void finish() throws IOException + { + close(); + jEdit.backupSettingsFile(file); + file.delete(); + twoStageSaveFile.renameTo(file); + knownLastModified = file.lastModified(); + } //}}} + + //{{{ Private members + private File twoStageSaveFile; + private static final String encoding = "UTF-8"; + + // Only used by SettingsXML#opneSaver(). + Saver() throws IOException + { + this(new File(file.getParentFile(), + "#" + file.getName() + "#save#")); + } + + // A workaround for a restriction of super(). + private Saver(File twoStageSaveFile) throws IOException + { + super(new OutputStreamWriter( + new FileOutputStream(twoStageSaveFile) + , encoding)); + this.twoStageSaveFile = twoStageSaveFile; + } + + //}}} + } //}}} + + //{{{ Constructor + /** + * Construct a SettingsXML with specific location and name. + * @param settingsDirectory + * The settings directory of jedit + * @param name + * The file name will be (name + ".xml") + */ + public SettingsXML(String settingsDirectory, String name) + { + String filename = name + ".xml"; + file = new File(MiscUtilities.constructPath( + settingsDirectory, filename)); + } //}}} + + //{{{ fileExits() method + /** + * Returns true if the file exists. + */ + public boolean fileExists() + { + return file.exists(); + } //}}} + + //{{{ load() method + /** + * Parse the XML file to load. + * @param handler + * The handler to receive SAX notifications. + */ + public void load(DefaultHandler handler) throws IOException + { + XMLUtilities.parseXML(new FileInputStream(file), handler); + knownLastModified = file.lastModified(); + } //}}} + + //{{{ openSaver() method + /** + * Open the file to save in XML. + */ + public Saver openSaver() throws IOException + { + return new Saver(); + } //}}} + + //{{{ hasChangedOnDisk() method + /** + * Returns true if the file has been changed on disk. + * This is based on the last modified time at the last saving + * or loading. + */ + public boolean hasChangedOnDisk() + { + return file.exists() + && (file.lastModified() != knownLastModified); + } //}}} + + //{{{ toString() method + /** + * Returns the file's path. + */ + public String toString() + { + return file.toString(); + } //}}} + + //{{{ Private members + private File file; + private long knownLastModified; + //}}} +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |