1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-04 23:55:26 +02:00

Bug 153446 - wrapped the persistence provider save operation inside a WorkspaceJob instead of a regular Job. This should delay any build requests and other resource change listeners triggered as a result of writing profiles that happens during delete.

Also fixed problems with broken filter pool references that occurred during duplication of profiles while testing.
This commit is contained in:
David Dykstal 2006-10-26 17:05:19 +00:00
parent 2a5311d432
commit f8b631b8d4
6 changed files with 38 additions and 38 deletions

View file

@ -121,8 +121,6 @@ public class PropertyFileProvider implements IRSEPersistenceProvider {
*/
public boolean saveRSEDOM(RSEDOM dom, IProgressMonitor monitor) {
IFolder providerFolder = getProviderFolder();
// String profileName = dom.getName();
// System.out.println("saving profile " + profileName + " to " + providerFolder.getFullPath().toString() + "...");
try {
int n = countNodes(dom);
if (monitor != null) monitor.beginTask("Saving DOM", n);

View file

@ -16,14 +16,14 @@
package org.eclipse.rse.internal.persistence;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.rse.persistence.IRSEPersistenceProvider;
import org.eclipse.rse.persistence.dom.RSEDOM;
public class SaveRSEDOMJob extends Job {
public class SaveRSEDOMJob extends WorkspaceJob {
private RSEDOM _dom;
private IRSEPersistenceProvider _provider;
@ -34,7 +34,7 @@ public class SaveRSEDOMJob extends Job {
_provider = provider;
}
protected IStatus run(IProgressMonitor monitor) {
public IStatus runInWorkspace(IProgressMonitor monitor) {
IStatus result = Status.OK_STATUS;
synchronized (_dom) { // synchronize on the DOM to prevent its update while writing
if (_dom.needsSave()) {

View file

@ -404,7 +404,8 @@ public class RSEDOMExporter implements IRSEDOMExporter {
if (clean || node.isDirty()) {
ISystemFilterPool filterPool = filterPoolReference.getReferencedFilterPool();
node.addAttribute(IRSEDOMConstants.ATTRIBUTE_REF_ID, filterPool.getId());
String refId = (filterPool != null) ? filterPool.getId() : "unknown";
node.addAttribute(IRSEDOMConstants.ATTRIBUTE_REF_ID, refId);
}
createPropertySetNodes(node, filterPoolReference, clean);

View file

@ -15,7 +15,9 @@
********************************************************************************/
package org.eclipse.rse.internal.filters;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.rse.core.filters.ISystemFilter;
import org.eclipse.rse.core.filters.ISystemFilterContainer;
@ -107,11 +109,12 @@ public class SystemFilterContainerReferenceCommonMethods
// return a complete list. However, to save memory we try to only
// re-gen the list if something has changed.
ISystemFilterContainer parent = parentRef.getReferencedSystemFilterContainer();
java.util.List mofList = null;
List mofList = null;
if (parent instanceof ISystemFilterPool)
mofList = ((ISystemFilterPool)parent).getFilters();
else
else if (parent instanceof ISystemFilter) {
mofList = ((ISystemFilter)parent).getNestedFilters();
}
boolean needToReGen = compareFilters(mofList);
//System.out.println("In getSFRefs for " + getName() + ": regen? " + needToReGen);
@ -122,6 +125,9 @@ public class SystemFilterContainerReferenceCommonMethods
// second, build new references...
referencedFilters = generateFilterReferences(subSystem, mofList);
}
if (referencedFilters == null) {
referencedFilters = new ISystemFilterReference[0];
}
return referencedFilters;
}

View file

@ -1617,12 +1617,6 @@ public abstract class SubSystem extends RSEModelObject implements IAdaptable, IS
public void performOperation(IProgressMonitor mon) throws InterruptedException, Exception
{
String msg = null;
int totalWorkUnits = IProgressMonitor.UNKNOWN;
msg = SubSystemConfiguration.getDisconnectingMessage(getHostName(), getConnectorService().getPort());
if (!implicitConnect(false, mon, msg, totalWorkUnits)) throw new Exception(RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_CONNECT_FAILED).makeSubstitution(getHostName()).getLevelOneText());
internalDisconnect(mon);
_disconnecting = false;
_connectionError = false;

View file

@ -1293,28 +1293,30 @@ public abstract class SubSystemConfiguration implements ISubSystemConfiguration
{
ISystemFilterPoolReference poolRef = oldReferences[idx];
ISystemFilterPool pool = poolRef.getReferencedFilterPool();
// if just copying a connnection, then copy references to pools as-is
if (!copyProfileOperation)
{
newRefMgr.addReferenceToSystemFilterPool(pool);
}
// if copying a profile, update references to pools in old profile to become references to pools in new profile...
else
{
ISystemFilterPoolManager poolMgr = pool.getSystemFilterPoolManager();
String poolProfileName = getSystemProfileName(poolMgr);
if (poolProfileName.equals(oldSubSystemProfileName))
if (pool != null) {
// if just copying a connnection, then copy references to pools as-is
if (!copyProfileOperation)
{
//RSEUIPlugin.logDebugMessage(this.getClass().getName(),"found reference to copied filter pool " + pool.getName() + ", so changing to reference to new copy");
ISystemFilterPoolManager newPoolMgr = getFilterPoolManager(newConnection.getSystemProfile());
ISystemFilterPool newPool = newPoolMgr.getSystemFilterPool(pool.getName());
//RSEUIPlugin.logDebugMessage(this.getClass().getName(),"...new pool = " + newPoolMgr.getName()+"."+newPool.getName());
newRefMgr.addReferenceToSystemFilterPool(newPool);
newRefMgr.addReferenceToSystemFilterPool(pool);
}
// if copying a profile, update references to pools in old profile to become references to pools in new profile...
else
{
//RSEUIPlugin.logDebugMessage(this.getClass().getName(),"found reference to filter pool from another profile " + poolProfileName+"."+pool.getName() + ", so not changing to reference to new copy");
newRefMgr.addReferenceToSystemFilterPool(pool);
ISystemFilterPoolManager poolMgr = pool.getSystemFilterPoolManager();
String poolProfileName = getSystemProfileName(poolMgr);
if (poolProfileName.equals(oldSubSystemProfileName))
{
//RSEUIPlugin.logDebugMessage(this.getClass().getName(),"found reference to copied filter pool " + pool.getName() + ", so changing to reference to new copy");
ISystemFilterPoolManager newPoolMgr = getFilterPoolManager(newConnection.getSystemProfile());
ISystemFilterPool newPool = newPoolMgr.getSystemFilterPool(pool.getName());
//RSEUIPlugin.logDebugMessage(this.getClass().getName(),"...new pool = " + newPoolMgr.getName()+"."+newPool.getName());
newRefMgr.addReferenceToSystemFilterPool(newPool);
}
else
{
//RSEUIPlugin.logDebugMessage(this.getClass().getName(),"found reference to filter pool from another profile " + poolProfileName+"."+pool.getName() + ", so not changing to reference to new copy");
newRefMgr.addReferenceToSystemFilterPool(pool);
}
}
}
}
@ -2215,12 +2217,11 @@ public abstract class SubSystemConfiguration implements ISubSystemConfiguration
boolean nested = !(parent instanceof ISystemFilterPool);
ISystemFilter nestedParentFilter = nested ? (ISystemFilter) parent : null;
for (int idx = 0; idx < subsystems.length; idx++)
{
{
Object parentObj = null;
// CASE 1: FILTER IS NOT NESTED, SO SIMPLY GET ITS FILTER POOL REFERENCE AND USE AS A PARENT...
if (!nested)
{
// SPECIAL CASE 1A: it makes a difference if we are showing filter pools or not...
if (showFilterPools())
{
@ -2229,7 +2230,7 @@ public abstract class SubSystemConfiguration implements ISubSystemConfiguration
else
{
parentObj = subsystems[idx];
}
}
}
// CASE 2: FILTER IS NESTED, THIS IS MORE DIFFICULT, AS EVERY FILTER CONTAINS A RANDOMLY
// GENERATED REFERENCE THAT ONLY THE GUI KNOWS ABOUT.
@ -2240,17 +2241,17 @@ public abstract class SubSystemConfiguration implements ISubSystemConfiguration
}
event = cloneEvent(event, parentObj);
event.setParent(parentObj);
fireSubSystemEvent(event, subsystems[idx]);
fireSubSystemEvent(event, subsystems[idx]);
}
}
}
}
protected SystemResourceChangeEvent cloneEvent(SystemResourceChangeEvent event, Object parent)
{
SystemResourceChangeEvent result = new SystemResourceChangeEvent(event.getSource(), event.getType(), parent);
return result;
}
/*
* Fire an event of a given id to subsystems that hold a reference to the given filter string
*/