blob: c00150e8f4a0bbc0aee06f995e20bc4b963d263e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 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.jst.javaee.ltk.core.participant;
import java.util.ArrayList;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jst.j2ee.project.EJBUtilities;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.jst.javaee.ltk.core.change.DeleteEJBClientProjectChange;
import org.eclipse.jst.javaee.ltk.core.change.EARReferenceRemoveChange;
import org.eclipse.jst.javaee.ltk.core.change.NonEARModuleReferenceRemoveChange;
import org.eclipse.jst.javaee.ltk.core.nls.RefactoringResourceHandler;
import org.eclipse.jst.javaee.ltk.core.refactoringchecker.CheckStateTester;
import org.eclipse.jst.javaee.ltk.core.refactoringchecker.IRefactoringCheckStateTester;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.DeleteParticipant;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.componentcore.internal.builder.IDependencyGraph;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
public class JavaEERefactoringParticipant extends DeleteParticipant {
private IProject projectToDelete = null;
private IProject ejbClientProject = null;
@Override
public RefactoringStatus checkConditions(IProgressMonitor pm,
CheckConditionsContext context) throws OperationCanceledException {
return new RefactoringStatus();
}
@Override
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
CompositeChange result= null;
result = createChangeObjects(result,projectToDelete);
if(ejbClientProject != null){
result = createChangeObjects (result, ejbClientProject);
DeleteEJBClientProjectChange dc= new DeleteEJBClientProjectChange(ejbClientProject, true, true);
result.add(dc);
}
return result;
}
private CompositeChange createChangeObjects(CompositeChange compositeChange, IProject projectToBeDeleted){
Set<IProject> referencingComponents = IDependencyGraph.INSTANCE.getReferencingComponents(projectToBeDeleted);
IProject[] dependentProjectList = referencingComponents.toArray(new IProject[referencingComponents.size()]);
CompositeChange innerCompositeChange = compositeChange;
if (dependentProjectList.length > 0){
if(innerCompositeChange == null){
innerCompositeChange = new CompositeChange(getName());
}
for (int i = 0; i < dependentProjectList.length; i++){
IProject dependentProject = dependentProjectList[i];
if(JavaEEProjectUtilities.isEARProject(dependentProjectList[i])){
EARReferenceRemoveChange ec = new EARReferenceRemoveChange(dependentProject, projectToBeDeleted);
if(shouldUncheckDeletion(projectToBeDeleted)){
ec.setEnabled(false);
}
innerCompositeChange.add(ec);
}else{
NonEARModuleReferenceRemoveChange nc = new NonEARModuleReferenceRemoveChange(dependentProject, projectToBeDeleted);
if(shouldUncheckDeletion(projectToBeDeleted)){
nc.setEnabled(false);
}
innerCompositeChange.add(nc);
}
}
}
return innerCompositeChange;
}
private IProject getClientProject(IProject ejbProject) {
if( ejbProject.exists() && ejbProject.isAccessible()){
IVirtualComponent clientComponent = EJBUtilities.getEJBClientJar(ejbProject);
if(clientComponent != null){
return clientComponent.getProject();
}
}
return null;
}
@Override
public String getName() {
String name = NLS.bind(
RefactoringResourceHandler.JavaEE_Refactorings_Participant_title,
new Object[] { projectToDelete.getName() });
return name;
}
@Override
protected boolean initialize(Object element) {
if(!(element instanceof IProject))
return false;
projectToDelete = (IProject) element;
if(JavaEEProjectUtilities.isEJBProject(projectToDelete)){
ejbClientProject = getClientProject(projectToDelete);
}
return true;
}
protected boolean shouldUncheckDeletion(IProject project){
CheckStateTester cst = CheckStateTester.INSTANCE;
ArrayList<IRefactoringCheckStateTester> testers = cst.getCheckStateTesters();
for(IRefactoringCheckStateTester tester : testers){
if(tester.testUncheckState(project) == true){
return true;
}
}
return false;
}
}