blob: d66f20109946f16b8f143b1b2a42d44da9ea147e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.internal.resources;
import org.eclipse.core.internal.events.ResourceDelta;
import org.eclipse.core.internal.events.ResourceDeltaFactory;
import org.eclipse.core.internal.utils.Policy;
import org.eclipse.core.internal.watson.ElementTree;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
/**
* Standard implementation of the ISavedState interface.
*/
public class SavedState implements ISavedState {
ElementTree oldTree;
ElementTree newTree;
SafeFileTable fileTable;
String pluginId;
Workspace workspace;
SavedState(Workspace workspace, String pluginId, ElementTree oldTree, ElementTree newTree) throws CoreException {
this.workspace = workspace;
this.pluginId = pluginId;
this.newTree = newTree;
this.oldTree = oldTree;
this.fileTable = restoreFileTable();
}
void forgetTrees() {
newTree = null;
oldTree = null;
workspace.saveManager.clearDeltaExpiration(pluginId);
}
@Override
public int getSaveNumber() {
return workspace.getSaveManager().getSaveNumber(pluginId);
}
protected SafeFileTable getFileTable() {
return fileTable;
}
protected SafeFileTable restoreFileTable() throws CoreException {
if (fileTable == null)
fileTable = new SafeFileTable(pluginId);
return fileTable;
}
@Override
public IPath lookup(IPath file) {
return getFileTable().lookup(file);
}
@Override
public IPath[] getFiles() {
return getFileTable().getFiles();
}
@Override
public void processResourceChangeEvents(IResourceChangeListener listener) {
try {
final ISchedulingRule rule = workspace.getRoot();
try {
workspace.prepareOperation(rule, null);
if (oldTree == null || newTree == null)
return;
workspace.beginOperation(true);
ResourceDelta delta = ResourceDeltaFactory.computeDelta(workspace, oldTree, newTree, Path.ROOT, -1);
forgetTrees(); // free trees to prevent memory leak
workspace.getNotificationManager().broadcastChanges(listener, IResourceChangeEvent.POST_BUILD, delta);
} finally {
workspace.endOperation(rule, false);
}
} catch (CoreException e) {
// this is unlikely to happen, so, just log it
Policy.log(e);
}
}
}