blob: d633afd8b2460845edcc360f8b871dec700af013 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ltk.internal.core.refactoring.resource.undostates;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourceAttributes;
import org.eclipse.core.resources.ResourcesPlugin;
/**
* Base implementation of {@link ResourceUndoState} that describes the common
* attributes of a resource to be created.
*
* This class is not intended to be instantiated or used by clients.
*
* @since 3.4
*
*/
abstract class AbstractResourceUndoState extends ResourceUndoState {
protected IContainer parent;
protected long localTimeStamp= IResource.NULL_STAMP;
private long modificationStamp= IResource.NULL_STAMP;
private ResourceAttributes resourceAttributes;
private MarkerUndoState[] markerDescriptions;
/**
* Create a resource description with no initial attributes
*/
protected AbstractResourceUndoState() {
super();
}
/**
* Create a resource state from the specified resource.
*
* @param resource
* the resource to be described
*/
protected AbstractResourceUndoState(IResource resource) {
parent= resource.getParent();
if (resource.isAccessible()) {
resourceAttributes= resource.getResourceAttributes();
// If resourceAttruibutes is null, the resource doesn't exist on disk, so leave
// modificationStamp and localTimeStamp set to IResource.NULL_STAMP.
if (resourceAttributes != null) {
modificationStamp= resource.getModificationStamp();
localTimeStamp= resource.getLocalTimeStamp();
}
try {
IMarker[] markers= resource.findMarkers(null, true, IResource.DEPTH_INFINITE);
markerDescriptions= new MarkerUndoState[markers.length];
for (int i= 0; i < markers.length; i++) {
markerDescriptions[i]= new MarkerUndoState(markers[i]);
}
} catch (CoreException e) {
// Eat this exception because it only occurs when the resource
// does not exist and we have already checked this.
// We do not want to throw exceptions on the simple constructor,
// as no one has actually tried to do anything yet.
}
}
}
@Override
public IResource createResource(IProgressMonitor monitor) throws CoreException {
IResource resource= createResourceHandle();
createExistentResourceFromHandle(resource, monitor);
restoreResourceAttributes(resource);
return resource;
}
@Override
public boolean isValid() {
return parent == null || parent.exists();
}
/**
* Restore any saved attributed of the specified resource. This method is called after the
* existent resource represented by the receiver has been created.
*
* @param resource the newly created resource
* @throws CoreException if accessing the resource fails
*/
protected void restoreResourceAttributes(IResource resource) throws CoreException {
if (modificationStamp != IResource.NULL_STAMP) {
resource.revertModificationStamp(modificationStamp);
}
if (localTimeStamp != IResource.NULL_STAMP) {
resource.setLocalTimeStamp(localTimeStamp);
}
if (resourceAttributes != null) {
resource.setResourceAttributes(resourceAttributes);
}
if (markerDescriptions != null) {
for (MarkerUndoState markerDescription : markerDescriptions) {
if (markerDescription.resource.exists()) {
markerDescription.createMarker();
}
}
}
}
/*
* Return the workspace.
*/
IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
@Override
public boolean verifyExistence(boolean checkMembers) {
IContainer p= parent;
if (p == null) {
p= getWorkspace().getRoot();
}
IResource handle= p.findMember(getName());
return handle != null;
}
}