From: <va...@us...> - 2007-03-01 07:01:37
|
Revision: 9051 http://svn.sourceforge.net/jedit/?rev=9051&view=rev Author: vanza Date: 2007-02-28 23:01:35 -0800 (Wed, 28 Feb 2007) Log Message: ----------- - try to do less I/O in the AWT thread. - save the project whenever an Importer is invoked (since internalDoImport() may return null yet things might have been imported) Modified Paths: -------------- plugins/ProjectViewer/trunk/ProjectViewer.props plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java plugins/ProjectViewer/trunk/projectviewer/persist/ProjectPersistenceManager.java Modified: plugins/ProjectViewer/trunk/ProjectViewer.props =================================================================== --- plugins/ProjectViewer/trunk/ProjectViewer.props 2007-03-01 05:51:10 UTC (rev 9050) +++ plugins/ProjectViewer/trunk/ProjectViewer.props 2007-03-01 07:01:35 UTC (rev 9051) @@ -174,7 +174,7 @@ projectviewer.groupmenu.select_group=Select group "{0}" projectviewer.groupmenu.activate_group=Group "{0}" -projectviewer.error.save.message=Error saving {0}; check your user directory.\nOriginal error message: {0} +projectviewer.error.save.message=Error saving {0}; check your user directory.\nOriginal error message: {1} projectviewer.error.save.title=Error saving {0} projectviewer.error.project_str=project projectviewer.error.project_list_str=project list Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java 2007-03-01 05:51:10 UTC (rev 9050) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectManager.java 2007-03-01 07:01:35 UTC (rev 9051) @@ -53,6 +53,8 @@ import org.gjt.sp.jedit.msg.DynamicMenuChanged; import common.io.AtomicOutputStream; +import common.threads.WorkerThreadPool; +import common.threads.WorkRequest; import projectviewer.vpt.VPTFilterData; import projectviewer.vpt.VPTGroup; @@ -232,10 +234,7 @@ String pName = (String) it.next(); Entry e = (Entry) projects.get(pName); if (e.isLoaded) { - if (e.fileName == null) { - e.fileName = createFileName(pName); - } - ProjectPersistenceManager.save(e.project, e.fileName); + saveProject(e.project, true); } } @@ -267,6 +266,18 @@ * before calling this method). */ public void saveProject(VPTProject p) { + saveProject(p, false); + } //}}} + + //{{{ +saveProject(VPTProject, boolean) : void + /** + * Same as above, with an extra argument. + * + * @see #saveProject(VPTProject) + * @param wait Whether to wait for the I/O operation to finish. + * @since PV 2.1.3.6 + */ + public void saveProject(VPTProject p, boolean wait) { Entry e = (Entry) projects.get(p.getName()); synchronized (e) { if (e.fileName == null) { @@ -275,13 +286,13 @@ // paranoid and save all configuration along with it saveProjectList(); } - try { - ProjectPersistenceManager.save(p, e.fileName); - } catch (IOException ioe) { - GUIUtilities.error(jEdit.getActiveView(), "projectviewer.error.save", - new Object[] { jEdit.getProperty("projectviewer.error.project_str"), - ioe.getMessage() }); - Log.log(Log.ERROR, this, ioe); + WorkRequest req = ProjectPersistenceManager.save(p, e.fileName); + if (wait) { + try { + req.waitFor(); + } catch (InterruptedException iex) { + // I hate this exception. + } } e.isLoaded = true; } @@ -421,16 +432,9 @@ * state to "unloaded", freeing memory. */ public void unloadProject(VPTProject p) { - saveProject(p); - // remove the project's listeners - for (Iterator i = listeners.iterator(); i.hasNext(); ) { - p.removeProjectListener((ProjectListener)i.next()); - } - // remove all other things - p.removeAllChildren(); - p.getProperties().clear(); - p.clearOpenFiles(); - ((Entry)projects.get(p.getName())).isLoaded = false; + Entry e = (Entry) projects.get(p.getName()); + WorkerThreadPool.getSharedInstance().ensureCapacity(2); + WorkerThreadPool.getSharedInstance().addRequest(new UnloadRequest(e)); } //}}} //{{{ +getGlobalFilterList() : List @@ -709,8 +713,7 @@ /** * An action that switches to a given project or group. * - * @author <A HREF="mailto:va...@ec...">Marcelo Vanzin</A> - * @version 0.1 + * @author Marcelo Vanzin */ private static final class VPTNodeActivateAction extends EditAction { @@ -742,9 +745,37 @@ } } - } + } //}}} + //{{{ UnloadRequest class + private static class UnloadRequest implements Runnable { + + private Entry entry; + + private UnloadRequest(Entry e) { + this.entry = e; + } + + public void run() { + ProjectManager pm = ProjectManager.getInstance(); + synchronized (entry) { + if (entry.isLoaded) { + pm.saveProject(entry.project, true); + // remove the project's listeners + for (Iterator i = pm.listeners.iterator(); i.hasNext(); ) { + entry.project.removeProjectListener((ProjectListener)i.next()); + } + // remove all other things + entry.project.removeAllChildren(); + entry.project.getProperties().clear(); + entry.project.clearOpenFiles(); + entry.isLoaded = false; + } + } + } + + } //}}} + //}}} - } Modified: plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-03-01 05:51:10 UTC (rev 9050) +++ plugins/ProjectViewer/trunk/projectviewer/ProjectViewer.java 2007-03-01 07:01:35 UTC (rev 9051) @@ -737,8 +737,9 @@ && !ProjectManager.getInstance().isLoaded(n.getName())) { ProjectManager.getInstance().getProject(n.getName()); } - } - else { + } else { + ve.dockable.setRootNode(n); + /* ProjectViewer viewer = ve.dockable; final JTree tree = viewer.getCurrentTree(); tree.setSelectionRow(0); @@ -747,6 +748,7 @@ tree.requestFocus(); } }); + */ } Modified: plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2007-03-01 05:51:10 UTC (rev 9050) +++ plugins/ProjectViewer/trunk/projectviewer/importer/Importer.java 2007-03-01 07:01:35 UTC (rev 9051) @@ -323,7 +323,6 @@ } } }); - ProjectManager.getInstance().saveProject(project); } else if (fireEvent) { if ((added != null && added.size() > 0) || (removed != null && removed.size() > 0)) { @@ -334,6 +333,7 @@ }); } } + ProjectManager.getInstance().saveProject(project); } catch (RuntimeException e) { error = true; throw e; Modified: plugins/ProjectViewer/trunk/projectviewer/persist/ProjectPersistenceManager.java =================================================================== --- plugins/ProjectViewer/trunk/projectviewer/persist/ProjectPersistenceManager.java 2007-03-01 05:51:10 UTC (rev 9050) +++ plugins/ProjectViewer/trunk/projectviewer/persist/ProjectPersistenceManager.java 2007-03-01 07:01:35 UTC (rev 9051) @@ -35,16 +35,21 @@ import java.util.Iterator; import java.util.Stack; +import javax.swing.SwingUtilities; + import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.GUIUtilities; import org.gjt.sp.jedit.PluginJAR; import org.gjt.sp.util.Log; import common.io.AtomicOutputStream; +import common.threads.WorkerThreadPool; +import common.threads.WorkRequest; import projectviewer.ProjectPlugin; import projectviewer.ProjectManager; @@ -64,12 +69,8 @@ */ public final class ProjectPersistenceManager { - //{{{ Constants - private final static String CONFIG_DIR = "projects" + File.separator; - //}}} - //{{{ -ProjectPersistenceManager() : <init> /** Private constructor. No instances! */ @@ -153,22 +154,9 @@ //{{{ +_save(VPTProject, String)_ : void /** Saves the given project data to the disk. */ - public static void save(VPTProject p, String filename) throws IOException { - AtomicOutputStream aout = null; - try { - aout = new AtomicOutputStream(ProjectPlugin.getResourcePath(CONFIG_DIR + filename)); - Writer out = new BufferedWriter(new OutputStreamWriter(aout, "UTF-8")); - ProjectManager.writeXMLHeader("UTF-8", out); - - saveNode(p, out); - - out.flush(); - out.close(); - } finally { - if (aout != null) { - aout.rollback(); - } - } + public static WorkRequest save(VPTProject p, String filename) { + IORequest req = new IORequest(p, filename); + return WorkerThreadPool.getSharedInstance().addRequest(req); } //}}} //{{{ -_saveNode(VPTNode, Writer)_ : void @@ -269,5 +257,61 @@ } //}}} + //{{{ IORequest class + private static class IORequest implements Runnable { + + private VPTProject p; + private String fname; + private boolean notify; + private Exception error; + + public IORequest(VPTProject p, String fname) { + this.p = p; + this.fname = fname; + this.notify = false; + } + + public void run() { + if (!notify) { + doSave(); + } else { + doNotify(); + } + } + + private void doSave() { + AtomicOutputStream aout = null; + try { + synchronized (p) { + aout = new AtomicOutputStream(ProjectPlugin.getResourcePath(CONFIG_DIR + fname)); + Writer out = new BufferedWriter(new OutputStreamWriter(aout, "UTF-8")); + ProjectManager.writeXMLHeader("UTF-8", out); + + saveNode(p, out); + + out.flush(); + out.close(); + } + } catch (IOException ioe) { + Log.log(Log.ERROR, p, ioe); + notify = true; + error = ioe; + SwingUtilities.invokeLater(this); + } finally { + if (aout != null) { + aout.rollback(); + } + } + } + + private void doNotify() { + String msg = jEdit.getProperty("projectviewer.error.project_str") + + " '" + p.getName() + "'"; + GUIUtilities.error(jEdit.getActiveView(), "projectviewer.error.save", + new Object[] { msg, error.getMessage() }); + } + + } //}}} + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |