blob: b9bedd5ee7dab809c9865eb36084d3d630152537 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BSI Business Systems Integration AG.
* 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:
* BSI Business Systems Integration AG - initial API and implementation
******************************************************************************/
package org.eclipse.scout.sdk.operation.jdt;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IAnnotation;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IImportDeclaration;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.scout.commons.CollectionUtility;
import org.eclipse.scout.sdk.internal.ScoutSdk;
import org.eclipse.scout.sdk.operation.IOperation;
import org.eclipse.scout.sdk.operation.ManifestExportPackageOperation;
import org.eclipse.scout.sdk.operation.jdt.packageFragment.ExportPolicy;
import org.eclipse.scout.sdk.operation.util.OrganizeImportOperation;
import org.eclipse.scout.sdk.util.type.TypeUtility;
import org.eclipse.scout.sdk.util.typecache.IWorkingCopyManager;
/**
* <h3> {@link JavaElementDeleteOperation}</h3> To delete any of method, type, import declaration, compilation unit.
*/
public class JavaElementDeleteOperation implements IOperation {
private List<IJavaElement> m_elementsToDelete;
private boolean m_formatSource;
public JavaElementDeleteOperation() {
this(false);
}
public JavaElementDeleteOperation(boolean formatSource) {
m_formatSource = formatSource;
m_elementsToDelete = new ArrayList<IJavaElement>();
}
public void setMembers(Collection<? extends IJavaElement> members) {
m_elementsToDelete = CollectionUtility.arrayList(members);
}
public void addMember(IJavaElement element) {
m_elementsToDelete.add(element);
}
public boolean removeMember(IJavaElement type) {
return m_elementsToDelete.remove(type);
}
@Override
public String getOperationName() {
StringBuilder builder = new StringBuilder();
builder.append("delete ");
for (IJavaElement t : m_elementsToDelete) {
builder.append(t.getElementName() + ", ");
}
builder.replace(builder.length() - 2, builder.length(), "");
builder.append("...");
return builder.toString();
}
@Override
public void validate() {
if (m_elementsToDelete == null) {
throw new IllegalArgumentException("null argument for members not allowed.");
}
for (IJavaElement m : m_elementsToDelete) {
if (m == null) {
throw new IllegalArgumentException("null member in the member array.");
}
if (!m.exists()) {
throw new IllegalArgumentException("member '" + m.getElementName() + "' does not exist.");
}
}
}
@Override
public void run(IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException {
HashSet<ICompilationUnit> icuForOrganizeImports = new HashSet<ICompilationUnit>();
for (IJavaElement m : m_elementsToDelete) {
if (TypeUtility.exists(m)) {
ICompilationUnit icuDoDel = null;
if (m.getElementType() == IJavaElement.TYPE && ((IType) m).getDeclaringType() == null) {
icuDoDel = ((IType) m).getCompilationUnit();
}
deleteMember(m, icuForOrganizeImports, monitor, workingCopyManager);
if (icuDoDel != null) {
deleteMember(icuDoDel, icuForOrganizeImports, monitor, workingCopyManager);
}
}
}
for (ICompilationUnit icu : icuForOrganizeImports) {
final IOperation op;
if (isFormatSource()) {
op = new JavaElementFormatOperation(icu, true);
}
else {
op = new OrganizeImportOperation(icu);
}
op.validate();
op.run(monitor, workingCopyManager);
}
}
protected void deleteMember(IJavaElement element, Set<ICompilationUnit> icuForOrganizeImports, IProgressMonitor monitor, IWorkingCopyManager manager) throws CoreException {
if (element == null) {
return;
}
if (!element.exists()) {
ScoutSdk.logWarning("Can not delete a non existing member '" + element.getElementName() + "'.");
return;
}
switch (element.getElementType()) {
case IJavaElement.IMPORT_DECLARATION:
IImportDeclaration imp = (IImportDeclaration) element;
IJavaElement ancestor = imp.getAncestor(IJavaElement.COMPILATION_UNIT);
if (TypeUtility.exists(ancestor)) {
manager.register((ICompilationUnit) ancestor, monitor);
}
imp.delete(true, monitor);
break;
case IJavaElement.COMPILATION_UNIT:
ICompilationUnit icu = (ICompilationUnit) element;
icuForOrganizeImports.remove(icu);
deleteCompilationUnit(icu, monitor, manager);
break;
case IJavaElement.TYPE:
case IJavaElement.METHOD:
case IJavaElement.FIELD:
IMember member = (IMember) element;
manager.register(member.getCompilationUnit(), monitor);
member.delete(true, monitor);
icuForOrganizeImports.add(member.getCompilationUnit());
break;
case IJavaElement.ANNOTATION:
IAnnotation annotation = (IAnnotation) element;
IJavaElement primEle = annotation.getAncestor(IJavaElement.COMPILATION_UNIT);
manager.register((ICompilationUnit) primEle, monitor);
element.getParent().getJavaModel().delete(new IJavaElement[]{element}, true, monitor);
icuForOrganizeImports.add((ICompilationUnit) primEle);
break;
case IJavaElement.PACKAGE_FRAGMENT:
deletePackageFragment((IPackageFragment) element, monitor, manager);
break;
default:
ScoutSdk.logWarning("no delete routine found for '" + element.getElementName() + "'.");
break;
}
}
private void deletePackageFragment(IPackageFragment packageFragment, IProgressMonitor monitor, IWorkingCopyManager manager) throws CoreException {
ManifestExportPackageOperation exportOp = new ManifestExportPackageOperation(ExportPolicy.REMOVE_PACKAGE, packageFragment, false);
exportOp.validate();
exportOp.run(monitor, manager);
packageFragment.delete(true, monitor);
}
private void deleteCompilationUnit(ICompilationUnit icu, IProgressMonitor monitor, IWorkingCopyManager manager) throws CoreException {
IPackageFragment packageFragment = (IPackageFragment) icu.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
manager.unregister(icu, monitor);
icu.delete(true, monitor);
boolean deletePackage = true;
for (IJavaElement e : packageFragment.getChildren()) {
if (TypeUtility.exists(e)) {
deletePackage = false;
break;
}
}
if (deletePackage) {
deletePackageFragment(packageFragment, monitor, manager);
}
}
public void setFormatSource(boolean formatSource) {
m_formatSource = formatSource;
}
public boolean isFormatSource() {
return m_formatSource;
}
}