blob: 69fe90ad653729514b20dd5c6514d8520c85c88f [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.change;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.jst.j2ee.model.IEARModelProvider;
import org.eclipse.jst.j2ee.model.ModelProviderManager;
import org.eclipse.jst.javaee.ltk.core.nls.RefactoringResourceHandler;
import org.eclipse.jst.jee.application.ICommonApplication;
import org.eclipse.jst.jee.application.ICommonModule;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.ChangeDescriptor;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
public class EARReferenceRemoveChange extends Change {
public EARReferenceRemoveChange(IProject referencingEARProject, IProject projectToRemove) {
super();
this.referencingEARProject = referencingEARProject;
this.projectToRemove = projectToRemove;
this.referencingEARProjectComp = ComponentCore.createComponent(referencingEARProject);
cachedRefs = referencingEARProjectComp.getReferences();
this.projectToRemoveComp = ComponentCore.createComponent(projectToRemove);
earModel = (IEARModelProvider)ModelProviderManager.getModelProvider(referencingEARProject);
moduleURI = earModel.getModuleURI(projectToRemoveComp);
}
IProject referencingEARProject = null;
IVirtualComponent referencingEARProjectComp = null;
IProject projectToRemove = null;
IVirtualComponent projectToRemoveComp = null;
IVirtualReference[] cachedRefs = null;
IEARModelProvider earModel = null;
String moduleURI = null;
@Override
public Object getModifiedElement() {
return null;
}
@Override
public String getName() {
String name = NLS.bind( RefactoringResourceHandler.Remove_JavaEE_References,
new Object[] {projectToRemove.getName()});
name += referencingEARProject.getName();
return name;
}
@Override
public void initializeValidationData(IProgressMonitor pm) {
}
@Override
public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
return null;
}
@Override
public Change perform(IProgressMonitor pm) throws CoreException {
updateEARDD();
removeReferencedComponents(pm);
return null;
}
@Override
public ChangeDescriptor getDescriptor() {
return null;
}
private void updateEARDD() {
if (!referencingEARProject.isAccessible())
return;
J2EEComponentClasspathUpdater.getInstance().queueUpdateEAR(referencingEARProject);
boolean moduleInXML = false;
//Check if module to remove is in xml
ICommonApplication mergedApp = (ICommonApplication)earModel.getModelObject();
ICommonModule module = mergedApp.getFirstEARModule(moduleURI);
if (module != null) {
IFile file = WorkbenchResourceHelper.getFile((EObject)module);
if (file != null && file.exists())
moduleInXML = true;
}
earModel.modify(new Runnable() {
public void run() {
ICommonApplication application = (ICommonApplication)earModel.getModelObject();
if (application == null)
return;
IVirtualComponent moduleComponent = projectToRemoveComp.getComponent();
if(!moduleComponent.isBinary()){
J2EEComponentClasspathUpdater.getInstance().queueUpdateModule(moduleComponent.getProject());
}
removeModule(application, moduleURI);
IVirtualFile vFile = referencingEARProjectComp.getRootFolder().getFile(moduleURI);
IFile iFile = vFile.getUnderlyingFile();
if(iFile.exists()){
try {
iFile.delete(true, new NullProgressMonitor());
} catch (CoreException e) {
J2EEPlugin.logError(e);
}
}
}
}, null);
//If change is to "merged model" only - remove from merged model
if (!moduleInXML)
mergedApp.getEARModules().remove(module);
}
protected void removeModule(ICommonApplication application, String moduleURI) {
ICommonModule module = application.getFirstEARModule(moduleURI);
application.getEARModules().remove(module);
}
protected void removeReferencedComponents(IProgressMonitor monitor) {
if (referencingEARProjectComp == null || !referencingEARProjectComp.getProject().isAccessible() || referencingEARProjectComp.isBinary()) return;
IVirtualReference [] existingReferencesArray = cachedRefs;
if(existingReferencesArray == null || existingReferencesArray.length == 0){
return;
}
List existingReferences = new ArrayList();
for(int i=0;i<existingReferencesArray.length; i++){
existingReferences.add(existingReferencesArray[i]);
}
List targetprojectList = new ArrayList();
if (projectToRemoveComp==null )
return;
IVirtualReference ref = findMatchingReference(existingReferences, projectToRemoveComp, null);
//if a ref was found matching the specified deployPath, then remove it
if(ref != null){
removeRefereneceInComponent(referencingEARProjectComp, ref);
existingReferences.remove(ref);
//after removing the ref, check to see if it was the last ref removed to that component
//and if it was, then also remove the project reference
ref = findMatchingReference(existingReferences, projectToRemoveComp);
if(ref == null){
IProject targetProject = projectToRemoveComp.getProject();
targetprojectList.add(targetProject);
}
}
try {
ProjectUtilities.removeReferenceProjects(referencingEARProjectComp.getProject(),targetprojectList);
} catch (CoreException e) {
J2EEPlugin.logError(e);
}
}
private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp) {
return findMatchingReference(existingReferences, comp, null);
}
protected void removeRefereneceInComponent(IVirtualComponent component, IVirtualReference reference) {
((VirtualComponent)component.getComponent()).removeReference(reference);
}
private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp, IPath path) {
for(int i=0;i<existingReferences.size(); i++){
IVirtualReference ref = (IVirtualReference)existingReferences.get(i);
IVirtualComponent c = ref.getReferencedComponent();
if(c != null && c.getName().equals(comp.getName())){
if(path == null){
return ref;
} else if(path.equals(ref.getRuntimePath())){
return ref;
}
}
}
return null;
}
}