### Eclipse Workspace Patch 1.0 #P org.eclipse.jst.j2ee Index: META-INF/MANIFEST.MF =================================================================== RCS file: /cvsroot/webtools/jeetools/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF,v retrieving revision 1.61 diff -u -r1.61 MANIFEST.MF --- META-INF/MANIFEST.MF 1 Oct 2009 13:31:00 -0000 1.61 +++ META-INF/MANIFEST.MF 2 Nov 2009 07:19:22 -0000 @@ -48,6 +48,7 @@ org.eclipse.jst.j2ee.refactor.listeners, org.eclipse.jst.j2ee.refactor.operations, org.eclipse.jst.javaee.ltk.core.change, + org.eclipse.jst.javaee.ltk.core.delete, org.eclipse.jst.javaee.ltk.core.descriptor, org.eclipse.jst.javaee.ltk.core.nls, org.eclipse.jst.javaee.ltk.core.participant, @@ -83,6 +84,7 @@ org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)", org.eclipse.core.commands;bundle-version="[3.4.0,4.0.0)", org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)", - org.eclipse.ltk.core.refactoring;bundle-version="3.4.1" + org.eclipse.ltk.core.refactoring;bundle-version="3.4.1", + org.eclipse.core.filebuffers;bundle-version="3.5.100" Eclipse-LazyStart: true Bundle-RequiredExecutionEnvironment: J2SE-1.5 Index: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/IJ2eeDeleteProcessor.java =================================================================== RCS file: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/IJ2eeDeleteProcessor.java diff -N ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/IJ2eeDeleteProcessor.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/IJ2eeDeleteProcessor.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,23 @@ +package org.eclipse.jst.javaee.ltk.core.delete; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jst.j2ee.model.IModelProvider; +import org.eclipse.ltk.core.refactoring.TextFileChange; + +public interface IJ2eeDeleteProcessor { + + public String getObjectName(Object object); + + public String getObjectType(Object object); + + public Object specifyXMLFile(IProject project, + IModelProvider modelProvider); + + public void modifyXML(IFile file, Object modelObject, TextFileChange result, + Object fObject) throws CoreException; + + public IResource getObjectResource(Object object); +} Index: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteProcessorImpl.java =================================================================== RCS file: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteProcessorImpl.java diff -N ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteProcessorImpl.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteProcessorImpl.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,352 @@ +package org.eclipse.jst.javaee.ltk.core.delete; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.filebuffers.FileBuffers; +import org.eclipse.core.filebuffers.ITextFileBuffer; +import org.eclipse.core.filebuffers.LocationKind; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceVisitor; +import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory; +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.jem.util.emf.workbench.ProjectUtilities; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jst.j2ee.model.IModelProvider; +import org.eclipse.jst.j2ee.model.ModelProviderManager; +import org.eclipse.jst.javaee.ltk.core.nls.RefactoringResourceHandler; +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.TextFileChange; +import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; +import org.eclipse.ltk.core.refactoring.participants.DeleteArguments; +import org.eclipse.ltk.core.refactoring.participants.DeleteProcessor; +import org.eclipse.ltk.core.refactoring.participants.ParticipantManager; +import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant; +import org.eclipse.ltk.core.refactoring.participants.ResourceChangeChecker; +import org.eclipse.ltk.core.refactoring.participants.SharableParticipants; +import org.eclipse.ltk.core.refactoring.resource.DeleteResourceChange; +import org.eclipse.ltk.internal.core.refactoring.Resources; +import org.eclipse.ltk.internal.core.refactoring.resource.ResourceProcessors; +import org.eclipse.osgi.util.NLS; +import org.eclipse.text.edits.DeleteEdit; +import org.eclipse.text.edits.MultiTextEdit; +import org.eclipse.text.edits.TextEdit; + +public abstract class J2eeDeleteProcessorImpl extends DeleteProcessor implements IJ2eeDeleteProcessor{ + + private List fResources = new ArrayList(); + private boolean fDeleteContents; + private int offset; + private int length; + private List fObjects = new ArrayList(); + private Map> fMap = new HashMap>(); + private Map> editMap = new HashMap>(); + private List files = new ArrayList(); + private IFile xmlFile; + + + public J2eeDeleteProcessorImpl(List objects, Map> map) { + this(objects, map, false); + } + + + public J2eeDeleteProcessorImpl(List objects, Map> map, boolean deleteContents) { + fObjects = objects; + fMap = map; + for(Object obj : fObjects){ + fResources = removeDescendants(map.get(obj)); + } + fDeleteContents= deleteContents; + } + + + @Override + public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException, OperationCanceledException { + // allow only projects or only non-projects to be selected; + // note that the selection may contain multiple types of resource + if (!(Resources.containsOnlyProjects(fResources.toArray(new IResource[fResources.size()])) || Resources.containsOnlyNonProjects(fResources.toArray(new IResource[fResources.size()])))) { + return RefactoringStatus.createFatalErrorStatus(RefactoringResourceHandler.J2eeDeleteProcessorImpl_delete_error_mixed_types); + } + + return new RefactoringStatus(); + } + + @Override + public RefactoringStatus checkFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException, OperationCanceledException { + pm.beginTask("", 1); //$NON-NLS-1$ + try { + RefactoringStatus result= new RefactoringStatus(); + + for (int i= 0; i < fResources.size(); i++) { + IResource resource= fResources.get(i); + if (!resource.isSynchronized(IResource.DEPTH_INFINITE)) { + if (resource instanceof IFile) { + result.addInfo(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_warning_out_of_sync_file, resource.getFullPath().makeRelative().toString())); + } else { + result.addInfo(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_warning_out_of_sync_container, resource.getFullPath().makeRelative().toString())); + } + } + } + + checkDirtyResources(result); + + ResourceChangeChecker checker= (ResourceChangeChecker) context.getChecker(ResourceChangeChecker.class); + IResourceChangeDescriptionFactory deltaFactory= checker.getDeltaFactory(); + for (int i= 0; i < fResources.size(); i++) { + if (fResources.get(i).isPhantom()) { + result.addFatalError(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_delete_error_phantom, fResources.get(i).getFullPath().makeRelative().toString())); + } else if (fDeleteContents && Resources.isReadOnly(fResources.get(i))) { + result.addFatalError(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_delete_error_read_only, fResources.get(i).getFullPath().makeRelative().toString())); + } else { + deltaFactory.delete(fResources.get(i)); + } + } + return result; + } finally { + pm.done(); + } + } + + private void checkDirtyResources(final RefactoringStatus result) throws CoreException { + for (int i= 0; i < fResources.size(); i++) { + IResource resource= fResources.get(i); + if (resource instanceof IProject && !((IProject) resource).isOpen()) + continue; + resource.accept(new IResourceVisitor() { + public boolean visit(IResource visitedResource) throws CoreException { + if (visitedResource instanceof IFile) { + checkDirtyFile(result, (IFile)visitedResource); + } + return true; + } + }, IResource.DEPTH_INFINITE, false); + } + } + + private void checkDirtyFile(RefactoringStatus result, IFile file) { + if (!file.exists()) + return; + ITextFileBuffer buffer= FileBuffers.getTextFileBufferManager().getTextFileBuffer(file.getFullPath(), LocationKind.IFILE); + if (buffer != null && buffer.isDirty()) { + String message= RefactoringResourceHandler.J2eeDeleteProcessorImpl_warning_unsaved_file; + if (buffer.isStateValidated() && buffer.isSynchronized()) { + result.addWarning(NLS.bind(message, file.getFullPath().makeRelative().toString())); + } else { + result.addFatalError(NLS.bind(message, file.getFullPath().makeRelative().toString())); + } + } + } + + + + @Override + public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { + pm.beginTask(RefactoringResourceHandler.J2eeDeleteProcessorImpl_create_task, fResources.size()); + try { + CompositeChange change = new CompositeChange(RefactoringResourceHandler.J2eeDeleteProcessorImpl_change_name); + change.markAsSynthetic(); + + for(Object object : fObjects){ + + modifyXMLFiles(object); + + if(getObjectResource(object)!=null){ + + CompositeChange childChange = new CompositeChange(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_childChange_name, getObjectType(object), getObjectName(object) )); + + setResourcesToDelete(fMap.get(object)); + for (int i= 0; i < fResources.size(); i++) { + pm.worked(1); + if(!fResources.get(i).getName().endsWith(".xml")){ //$NON-NLS-1$ + + DeleteResourceChange dc= new DeleteResourceChange(fResources.get(i).getFullPath(), true, fDeleteContents); + childChange.add(dc); + } + } + change.add(childChange); + } + } + + CompositeChange webXMLChange = new CompositeChange(NLS.bind( + RefactoringResourceHandler.J2eeDeleteProcessorImpl_webXMLChange_name, getXmlFile().getName())); + showXMLFileChanges(webXMLChange); + change.add(webXMLChange); + return change; + + } finally { + pm.done(); + } + } + + private void modifyXMLFiles(Object object) throws CoreException { + IProject project = ProjectUtilities.getProject(object); + IModelProvider modelProvider = ModelProviderManager.getModelProvider(project); + + Object modelObject = specifyXMLFile(project, modelProvider); + + TextFileChange result = new TextFileChange( getXmlFile().getName(), getXmlFile() ); + modifyXML(getXmlFile(), modelObject, result, object); + } + + + private void showXMLFileChanges(CompositeChange webXMLChange) + throws CoreException { + for (int m = 0; m < getFiles().size(); m++) { + IFile f = getFiles().get(m); + TextFileChange text = new TextFileChange(f.getName(), f); + List lists = getEditMap().get(f); + + IDocument doc = new Document(); + doc.set(text.getCurrentContent(new NullProgressMonitor())); + TextEdit mul = new MultiTextEdit(0, doc.getLength()); + text.setEdit(mul); + mul.addChildren(lists.toArray(new TextEdit[lists.size()])); + + webXMLChange.add(text); + } + } + + + @Override + public Object[] getElements() { + return fResources.toArray(new IResource[fResources.size()]); + } + + @Override + public String getIdentifier() { + return "org.eclipse.ltk.core.refactoring.deleteResourcesProcessor"; //$NON-NLS-1$ + } + + @Override + public String getProcessorName() { + return RefactoringResourceHandler.J2eeDeleteProcessorImpl_processor_name; + } + + + @Override + public boolean isApplicable() throws CoreException { + for (int i= 0; i < fResources.size(); i++) { + if (!canDelete(fResources.get(i))) { + return false; + } + } + return true; + } + + private boolean canDelete(IResource res) { + return res.isAccessible() && !res.isPhantom(); + } + + + + + @Override + public RefactoringParticipant[] loadParticipants(RefactoringStatus status, SharableParticipants sharedParticipants) throws CoreException { + final ArrayList result= new ArrayList(); + if (!isApplicable()) { + return new RefactoringParticipant[0]; + } + + final String[] affectedNatures= ResourceProcessors.computeAffectedNatures(fResources.toArray(new IResource[fResources.size()])); + final DeleteArguments deleteArguments= new DeleteArguments(); + for (int i= 0; i < fResources.size(); i++) { + result.addAll(Arrays.asList(ParticipantManager.loadDeleteParticipants(status, this, fResources.get(i), deleteArguments, affectedNatures, sharedParticipants))); + } + + return result.toArray(new RefactoringParticipant[result.size()]); + } + + + public void setResourcesToDelete(List resources) { + this.fResources = resources; + } + public List getResourcesToDelete() { + return fResources; + } + public void setDeleteContents(boolean deleteContents) { + this.fDeleteContents = deleteContents; + } + public boolean isDeleteContents() { + return fDeleteContents; + } + + private static List removeDescendants(List resources) { + ArrayList result= new ArrayList(); + for (int i= 0; i < resources.size(); i++) { + addToList(result, resources.get(i)); + } + return result; + } + + private static void addToList(ArrayList result, IResource curr) { + IPath currPath= curr.getFullPath(); + for (int k= result.size() - 1; k >= 0 ; k--) { + IResource other= result.get(k); + IPath otherPath= other.getFullPath(); + if (otherPath.isPrefixOf(currPath)) { + return; + } + if (currPath.isPrefixOf(otherPath)) { + result.remove(k); + } + } + result.add(curr); + } + + public void setLength(int flength) { + this.length = flength; + } + + public int getLength() { + return length; + } + + public void setOffset(int foffset) { + this.offset = foffset; + } + + public int getOffset() { + return offset; + } + + public void setEditMap(Map> feditMap) { + this.editMap = feditMap; + } + + + public Map> getEditMap() { + return editMap; + } + + + public void setXmlFile(IFile fxmlFile) { + this.xmlFile = fxmlFile; + } + + + public IFile getXmlFile() { + return xmlFile; + } + + + public void setFiles(List ffiles) { + this.files = ffiles; + } + + + public List getFiles() { + return files; + } +} Index: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteRefactoring.java =================================================================== RCS file: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteRefactoring.java diff -N ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteRefactoring.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteRefactoring.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,31 @@ +package org.eclipse.jst.javaee.ltk.core.delete; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.ltk.core.refactoring.participants.DeleteProcessor; +import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring; +import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor; + +public class J2eeDeleteRefactoring extends ProcessorBasedRefactoring { + + private DeleteProcessor fProcessor; + + /** + * Constructs a new delete refactoring for the given processor. + * + * @param processor the delete processor + */ + public J2eeDeleteRefactoring(DeleteProcessor processor) { + super(processor); + Assert.isNotNull(processor); + fProcessor= processor; + } + + /** + * {@inheritDoc} + */ + @Override + public RefactoringProcessor getProcessor() { + return fProcessor; + } + +} Index: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/nls/RefactoringResourceHandler.java =================================================================== RCS file: /cvsroot/webtools/jeetools/plugins/org.eclipse.jst.j2ee/ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/nls/RefactoringResourceHandler.java,v retrieving revision 1.3 diff -u -r1.3 RefactoringResourceHandler.java --- ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/nls/RefactoringResourceHandler.java 29 Jul 2009 20:50:03 -0000 1.3 +++ ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/nls/RefactoringResourceHandler.java 2 Nov 2009 07:19:24 -0000 @@ -23,6 +23,18 @@ public static String Remove_JavaEE_References; public static String JavaEE_Refactorings_Participant_title; public static String Delete_EJB_Client_Project; + + public static String J2eeDeleteProcessorImpl_change_name; + public static String J2eeDeleteProcessorImpl_webXMLChange_name; + public static String J2eeDeleteProcessorImpl_childChange_name; + public static String J2eeDeleteProcessorImpl_create_task; + public static String J2eeDeleteProcessorImpl_delete_error_mixed_types; + public static String J2eeDeleteProcessorImpl_delete_error_phantom; + public static String J2eeDeleteProcessorImpl_delete_error_read_only; + public static String J2eeDeleteProcessorImpl_processor_name; + public static String J2eeDeleteProcessorImpl_warning_out_of_sync_file; + public static String J2eeDeleteProcessorImpl_warning_out_of_sync_container; + public static String J2eeDeleteProcessorImpl_warning_unsaved_file; public static String CheckStateTester_Could_not_find_Check_State_Tester_E_; Index: property_files/refactoring.properties =================================================================== RCS file: /cvsroot/webtools/jeetools/plugins/org.eclipse.jst.j2ee/property_files/refactoring.properties,v retrieving revision 1.3 diff -u -r1.3 refactoring.properties --- property_files/refactoring.properties 29 Jul 2009 20:50:04 -0000 1.3 +++ property_files/refactoring.properties 2 Nov 2009 07:19:24 -0000 @@ -4,4 +4,15 @@ Remove_JavaEE_References=Remove Java EE References to {0} in JavaEE_Refactorings_Participant_title=Java EE Refactorings for {0} Delete_EJB_Client_Project=Delete {0} -CheckStateTester_Could_not_find_Check_State_Tester_E_=Could not find Check State Tester Extension Point \ No newline at end of file +CheckStateTester_Could_not_find_Check_State_Tester_E_=Could not find Check State Tester Extension Point +J2eeDeleteProcessorImpl_webXMLChange_name=Changes related to {0} files +J2eeDeleteProcessorImpl_childChange_name=Changes related to {0} ''{1}'' +J2eeDeleteProcessorImpl_change_name=Changes to be performed +J2eeDeleteProcessorImpl_create_task=Creating pending deletes... +J2eeDeleteProcessorImpl_delete_error_mixed_types=Cannot delete projects and other resources in the same operation. +J2eeDeleteProcessorImpl_delete_error_phantom=Cannot delete phantom resource ''{0}''. +J2eeDeleteProcessorImpl_delete_error_read_only=Cannot delete content for read-only resource ''{0}''. +J2eeDeleteProcessorImpl_processor_name=Delete Resource +J2eeDeleteProcessorImpl_warning_out_of_sync_file=''{0}'' is not in sync. Press continue to force delete. +J2eeDeleteProcessorImpl_warning_out_of_sync_container=''{0}'' contains resources that are not in sync. Press continue to force delete. +J2eeDeleteProcessorImpl_warning_unsaved_file=File ''{0}'' has unsaved changes. \ No newline at end of file