blob: 12a7ea7979829e7e4fa8e00d5a726078926db5ac [file] [log] [blame]
package org.eclipse.jdt.internal.core;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IOpenable;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import java.util.Enumeration;
/**
* This operation deletes a collection of resources and all of their children.
* It does not delete resources which do not belong to the Java Model
* (eg GIF files).
*/
public class DeleteResourceElementsOperation extends MultiOperation {
/**
* When executed, this operation will delete the given elements. The elements
* to delete cannot be <code>null</code> or empty, and must have a corresponding
* resource.
*/
protected DeleteResourceElementsOperation(IJavaElement[] elementsToProcess, boolean force) {
super(elementsToProcess, force);
}
/**
* Deletes the direct children of <code>frag</code> corresponding to its kind
* (K_SOURCE or K_BINARY), and deletes the corresponding folder if it is then
* empty.
*/
private void deletePackageFragment(IPackageFragment frag)
throws JavaModelException {
IResource res = frag.getCorrespondingResource();
if (res != null && res.getType() == IResource.FOLDER) {
// collect the children to remove
IJavaElement[] childrenOfInterest = frag.getChildren();
if (childrenOfInterest.length > 0) {
IResource[] resources = new IResource[childrenOfInterest.length];
// remove the children
for (int i = 0; i < childrenOfInterest.length; i++) {
resources[i] = childrenOfInterest[i].getCorrespondingResource();
}
deleteResources(resources, fForce);
}
// Discard non-java resources
Object[] nonJavaResources = frag.getNonJavaResources();
int actualResourceCount = 0;
for (int i = 0, max = nonJavaResources.length; i < max; i++){
if (nonJavaResources[i] instanceof IResource) actualResourceCount++;
}
IResource[] actualNonJavaResources = new IResource[actualResourceCount];
for (int i = 0, max = nonJavaResources.length, index = 0; i < max; i++){
if (nonJavaResources[i] instanceof IResource) actualNonJavaResources[index++] = (IResource)nonJavaResources[i];
}
deleteResources(actualNonJavaResources, fForce);
// delete remaining files in this package (.class file in the case where Proj=src=bin)
IResource[] remainingFiles;
try {
remainingFiles = ((IFolder) res).members();
} catch (CoreException ce) {
throw new JavaModelException(ce);
}
boolean isEmpty = true;
for (int i = 0, length = remainingFiles.length; i < length; i++) {
IResource file = remainingFiles[i];
if (file instanceof IFile) {
this.deleteResource(file, true);
} else {
isEmpty = false;
}
}
if (isEmpty) {
// delete recursively empty folders
deleteEmptyPackageFragment(frag, false);
}
}
}
/**
* @see MultiOperation
*/
protected String getMainTaskName() {
return Util.bind("operation.deleteResourceProgress"); //$NON-NLS-1$
}
/**
* @see MultiOperation. This method delegate to <code>deleteResource</code> or
* <code>deletePackageFragment</code> depending on the type of <code>element</code>.
*/
protected void processElement(IJavaElement element) throws JavaModelException {
switch (element.getElementType()) {
case IJavaElement.CLASS_FILE :
case IJavaElement.COMPILATION_UNIT :
deleteResource(element.getCorrespondingResource(), fForce);
break;
case IJavaElement.PACKAGE_FRAGMENT :
deletePackageFragment((IPackageFragment) element);
break;
default :
throw new JavaModelException(new JavaModelStatus(JavaModelStatus.INVALID_ELEMENT_TYPES, element));
}
// ensure the element is closed
if (element instanceof IOpenable) {
((IOpenable)element).close();
}
}
/**
* @see MultiOperation
*/
protected void verify(IJavaElement element) throws JavaModelException {
if (element == null || !element.exists())
error(JavaModelStatus.ELEMENT_DOES_NOT_EXIST, element);
int type = element.getElementType();
if (type <= IJavaElement.PACKAGE_FRAGMENT_ROOT || type > IJavaElement.COMPILATION_UNIT)
error(JavaModelStatus.INVALID_ELEMENT_TYPES, element);
else if (type == IJavaElement.PACKAGE_FRAGMENT && element instanceof JarPackageFragment)
error(JavaModelStatus.INVALID_ELEMENT_TYPES, element);
}
}