blob: 39e91cd3f9b90a01ee58e0cc086a519272c1e8db [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2007 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.ui.internal.ide.undo;
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;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ui.ide.undo.ResourceDescription;
/**
* Base implementation of ResourceDescription 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.3
*
*/
abstract class AbstractResourceDescription extends ResourceDescription {
IContainer parent;
long modificationStamp = IResource.NULL_STAMP;
long localTimeStamp = IResource.NULL_STAMP;
ResourceAttributes resourceAttributes;
MarkerDescription[] markerDescriptions;
/**
* Create a resource description with no initial attributes
*/
protected AbstractResourceDescription() {
super();
}
/**
* Create a resource description from the specified resource.
*
* @param resource
* the resource to be described
*/
protected AbstractResourceDescription(IResource resource) {
super();
parent = resource.getParent();
if (resource.isAccessible()) {
modificationStamp = resource.getModificationStamp();
localTimeStamp = resource.getLocalTimeStamp();
resourceAttributes = resource.getResourceAttributes();
try {
IMarker[] markers = resource.findMarkers(null, true,
IResource.DEPTH_INFINITE);
markerDescriptions = new MarkerDescription[markers.length];
for (int i = 0; i < markers.length; i++) {
markerDescriptions[i] = new MarkerDescription(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.
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.ide.undo.ResourceDescription#createResource(org.eclipse.core.runtime.IProgressMonitor)
*/
public IResource createResource(IProgressMonitor monitor)
throws CoreException {
IResource resource = createResourceHandle();
createExistentResourceFromHandle(resource, monitor);
restoreResourceAttributes(resource);
return resource;
}
/* (non-Javadoc)
* @see org.eclipse.ui.ide.undo.ResourceDescription#isValid()
*/
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
*/
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 (int i = 0; i < markerDescriptions.length; i++) {
markerDescriptions[i].resource = resource;
markerDescriptions[i].createMarker();
}
}
}
/*
* Return the workspace.
*/
IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
/* (non-Javadoc)
* @see org.eclipse.ui.ide.undo.ResourceDescription#verifyExistence(boolean)
*/
public boolean verifyExistence(boolean checkMembers) {
IContainer p = parent;
if (p == null) {
p = getWorkspace().getRoot();
}
IResource handle = p.findMember(getName());
return handle != null;
}
}