mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-14 12:35:22 +02:00
[197027] [persistence] Can lose data if close Eclipse before saving profile completes
https://bugs.eclipse.org/bugs/show_bug.cgi?id=197027
This commit is contained in:
parent
8fe810590d
commit
e61d4b6e36
1 changed files with 108 additions and 2 deletions
|
@ -20,6 +20,7 @@
|
||||||
* David Dykstal (IBM) - [189274] provide import and export operations for profiles
|
* David Dykstal (IBM) - [189274] provide import and export operations for profiles
|
||||||
* David Dykstal (IBM) - [225988] need API to mark persisted profiles as migrated
|
* David Dykstal (IBM) - [225988] need API to mark persisted profiles as migrated
|
||||||
* David Dykstal (IBM) - [226728] NPE during init with clean workspace
|
* David Dykstal (IBM) - [226728] NPE during init with clean workspace
|
||||||
|
* David Dykstal (IBM) - [197027] Can lose data if closing eclipse before profile is saved
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.rse.internal.persistence;
|
package org.eclipse.rse.internal.persistence;
|
||||||
|
@ -27,12 +28,16 @@ package org.eclipse.rse.internal.persistence;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.core.resources.ISaveContext;
|
||||||
|
import org.eclipse.core.resources.ISaveParticipant;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IConfigurationElement;
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
import org.eclipse.core.runtime.IExtensionRegistry;
|
import org.eclipse.core.runtime.IExtensionRegistry;
|
||||||
|
@ -42,6 +47,8 @@ import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.core.runtime.Preferences;
|
import org.eclipse.core.runtime.Preferences;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
|
||||||
|
import org.eclipse.core.runtime.jobs.IJobChangeListener;
|
||||||
import org.eclipse.core.runtime.jobs.Job;
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
import org.eclipse.rse.core.IRSEPreferenceNames;
|
import org.eclipse.rse.core.IRSEPreferenceNames;
|
||||||
import org.eclipse.rse.core.RSECorePlugin;
|
import org.eclipse.rse.core.RSECorePlugin;
|
||||||
|
@ -64,7 +71,96 @@ import org.eclipse.rse.services.Mutex;
|
||||||
* @see RSECorePlugin#getThePersistenceManager()
|
* @see RSECorePlugin#getThePersistenceManager()
|
||||||
*/
|
*/
|
||||||
public class RSEPersistenceManager implements IRSEPersistenceManager {
|
public class RSEPersistenceManager implements IRSEPersistenceManager {
|
||||||
|
|
||||||
|
private class RSESaveParticipant implements ISaveParticipant {
|
||||||
|
|
||||||
|
public RSESaveParticipant() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.resources.ISaveParticipant#doneSaving(org.eclipse.core.resources.ISaveContext)
|
||||||
|
*/
|
||||||
|
public void doneSaving(ISaveContext context) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.resources.ISaveParticipant#prepareToSave(org.eclipse.core.resources.ISaveContext)
|
||||||
|
*/
|
||||||
|
public void prepareToSave(ISaveContext context) throws CoreException {
|
||||||
|
canScheduleSave = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.resources.ISaveParticipant#rollback(org.eclipse.core.resources.ISaveContext)
|
||||||
|
*/
|
||||||
|
public void rollback(ISaveContext context) {
|
||||||
|
canScheduleSave = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.resources.ISaveParticipant#saving(org.eclipse.core.resources.ISaveContext)
|
||||||
|
*/
|
||||||
|
public void saving(ISaveContext context) throws CoreException {
|
||||||
|
List jobs = new ArrayList(10);
|
||||||
|
synchronized(saveJobs) {
|
||||||
|
jobs.addAll(saveJobs);
|
||||||
|
}
|
||||||
|
for (Iterator z = jobs.iterator(); z.hasNext();) {
|
||||||
|
Job job = (Job) z.next();
|
||||||
|
try {
|
||||||
|
job.join();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class RSESaveJobChangeListener implements IJobChangeListener {
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#aboutToRun(org.eclipse.core.runtime.jobs.IJobChangeEvent)
|
||||||
|
*/
|
||||||
|
public void aboutToRun(IJobChangeEvent event) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#awake(org.eclipse.core.runtime.jobs.IJobChangeEvent)
|
||||||
|
*/
|
||||||
|
public void awake(IJobChangeEvent event) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
|
||||||
|
*/
|
||||||
|
public void done(IJobChangeEvent event) {
|
||||||
|
synchronized (saveJobs) {
|
||||||
|
saveJobs.remove(event.getJob());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
|
||||||
|
*/
|
||||||
|
public void running(IJobChangeEvent event) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
|
||||||
|
*/
|
||||||
|
public void scheduled(IJobChangeEvent event) {
|
||||||
|
synchronized (saveJobs) {
|
||||||
|
saveJobs.add(event.getJob());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse.core.runtime.jobs.IJobChangeEvent)
|
||||||
|
*/
|
||||||
|
public void sleeping(IJobChangeEvent event) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class ProviderRecord {
|
private class ProviderRecord {
|
||||||
private String providerId = null;
|
private String providerId = null;
|
||||||
private IConfigurationElement configurationElement = null;
|
private IConfigurationElement configurationElement = null;
|
||||||
|
@ -85,14 +181,23 @@ public class RSEPersistenceManager implements IRSEPersistenceManager {
|
||||||
|
|
||||||
private Map knownProviders = new HashMap(10);
|
private Map knownProviders = new HashMap(10);
|
||||||
private Map loadedProviders = new HashMap(10);
|
private Map loadedProviders = new HashMap(10);
|
||||||
|
private Set saveJobs = new HashSet(10);
|
||||||
private RSEDOMExporter _exporter;
|
private RSEDOMExporter _exporter;
|
||||||
private RSEDOMImporter _importer;
|
private RSEDOMImporter _importer;
|
||||||
|
private RSESaveParticipant saveParticipant = new RSESaveParticipant();
|
||||||
|
private RSESaveJobChangeListener jobChangeListener = new RSESaveJobChangeListener();
|
||||||
private Mutex mutex = new Mutex();
|
private Mutex mutex = new Mutex();
|
||||||
|
private volatile boolean canScheduleSave = true;
|
||||||
|
|
||||||
public RSEPersistenceManager(ISystemRegistry registry) {
|
public RSEPersistenceManager(ISystemRegistry registry) {
|
||||||
_exporter = RSEDOMExporter.getInstance();
|
_exporter = RSEDOMExporter.getInstance();
|
||||||
_importer = RSEDOMImporter.getInstance();
|
_importer = RSEDOMImporter.getInstance();
|
||||||
_importer.setSystemRegistry(registry);
|
_importer.setSystemRegistry(registry);
|
||||||
|
try {
|
||||||
|
ResourcesPlugin.getWorkspace().addSaveParticipant(RSECorePlugin.getDefault(), saveParticipant);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
RSECorePlugin.getDefault().getLogger().logError("Could not register save participant.", e); //$NON-NLS-1$
|
||||||
|
}
|
||||||
getProviderExtensions();
|
getProviderExtensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,8 +550,9 @@ public class RSEPersistenceManager implements IRSEPersistenceManager {
|
||||||
cleanTree(profile);
|
cleanTree(profile);
|
||||||
if (dom.needsSave()) {
|
if (dom.needsSave()) {
|
||||||
Job job = provider.getSaveJob(dom);
|
Job job = provider.getSaveJob(dom);
|
||||||
if (job != null) {
|
job.addJobChangeListener(jobChangeListener);
|
||||||
job.schedule(3000); // three second delay
|
if (job != null && canScheduleSave) {
|
||||||
|
job.schedule(2000); // two second delay
|
||||||
} else {
|
} else {
|
||||||
provider.saveRSEDOM(dom, new NullProgressMonitor());
|
provider.saveRSEDOM(dom, new NullProgressMonitor());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue