diff options
author | Walter Harley | 2006-02-03 01:57:23 +0000 |
---|---|---|
committer | Walter Harley | 2006-02-03 01:57:23 +0000 |
commit | e2c8b8023f769df30a2baf6b7a009e9cef4c3a51 (patch) | |
tree | 44d7b29ab0b4d083a77e22da296e793ae8ba0376 | |
parent | 14709b7432079a77371ede39c1d4b7e62802877d (diff) | |
download | eclipse.jdt.core-e2c8b8023f769df30a2baf6b7a009e9cef4c3a51.tar.gz eclipse.jdt.core-e2c8b8023f769df30a2baf6b7a009e9cef4c3a51.tar.xz eclipse.jdt.core-e2c8b8023f769df30a2baf6b7a009e9cef4c3a51.zip |
bugzilla 108070 - warn when setting generated source folder to an existing directory; only delete derived contents when deleting it.
7 files changed, 74 insertions, 72 deletions
diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/AptProject.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/AptProject.java index b42b8330af..aaabc31584 100644 --- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/AptProject.java +++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/AptProject.java @@ -6,6 +6,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.apt.core.AptPlugin; import org.eclipse.jdt.apt.core.internal.generatedfile.GeneratedFileManager; import org.eclipse.jdt.apt.core.internal.generatedfile.GeneratedSourceFolderManager; +import org.eclipse.jdt.apt.core.internal.util.FileSystemUtil; import org.eclipse.jdt.apt.core.util.AptPreferenceConstants; import org.eclipse.jdt.core.IJavaProject; @@ -92,7 +93,7 @@ public class AptProject { { IResource[] members = f.members(); for ( int i = 0; i<members.length; i++ ){ - _gfm.deleteDerivedResources(members[i]); + FileSystemUtil.deleteDerivedResources(members[i]); } } catch ( CoreException ce ) diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/generatedfile/GeneratedFileManager.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/generatedfile/GeneratedFileManager.java index 0de2f36342..4a22f2303d 100644 --- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/generatedfile/GeneratedFileManager.java +++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/generatedfile/GeneratedFileManager.java @@ -1040,43 +1040,6 @@ public class GeneratedFileManager { } /** - * If the given resource is a folder, then recursively deleted all derived - * files and folders contained within it. Delete the folder if it becomes empty - * and if itself is also a derived resource. - * If the given resource is a file, delete it iff it is a derived resource. - * The resource is left untouched if it is no a folder or a file. - * @param resource - * @return <code>true</code> iff the resource has been deleted. - * @throws CoreException - */ - public boolean deleteDerivedResources(final IResource resource) - throws CoreException - { - if( resource.getType() == IResource.FOLDER ){ - boolean deleteFolder = resource.isDerived(); - IResource[] members = ((IFolder)resource).members(); - for( int i=0, len=members.length; i<len; i++ ){ - deleteFolder &= deleteDerivedResources(members[i]); - } - if( deleteFolder ){ - resource.delete(true, null); - return true; - } - return false; - } - else if( resource.getType() == IResource.FILE ){ - if( resource.isDerived() ){ - resource.delete(true, null); - return true; - } - return false; - } - // will skip pass everything else. - else - return false; - } - - /** * This method should only be used for testing purposes to ensure * that maps contain entries when we expect them to. */ diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/generatedfile/GeneratedSourceFolderManager.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/generatedfile/GeneratedSourceFolderManager.java index db4433281b..40613f3185 100644 --- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/generatedfile/GeneratedSourceFolderManager.java +++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/generatedfile/GeneratedSourceFolderManager.java @@ -13,11 +13,15 @@ package org.eclipse.jdt.apt.core.internal.generatedfile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.apt.core.AptPlugin; import org.eclipse.jdt.apt.core.internal.AptProject; @@ -405,7 +409,7 @@ public class GeneratedSourceFolderManager { * @param srcFolder */ private void removeFolder() { - IFolder srcFolder = null; + final IFolder srcFolder; synchronized ( this ) { srcFolder = _generatedSourceFolder; @@ -420,13 +424,32 @@ public class GeneratedSourceFolderManager { // clean up the classpath first so that when we actually delete the // generated source folder we won't cause a classpath error. - try { - ClasspathUtil.removeFromProjectClasspath( _aptProject.getJavaProject(), srcFolder, null ); + try { + if (srcFolder.isDerived()) { + ClasspathUtil.removeFromProjectClasspath( _aptProject.getJavaProject(), srcFolder, null ); + } } catch (JavaModelException e) { AptPlugin.log( e, "Failed to remove classpath entry for old generated src folder " + srcFolder.getName() ); //$NON-NLS-1$ } - FileSystemUtil.deleteFolder(srcFolder); + final IWorkspaceRunnable runnable = new IWorkspaceRunnable(){ + public void run(IProgressMonitor monitor) + { + try { + FileSystemUtil.deleteDerivedResources(srcFolder); + } catch(CoreException e) { + AptPlugin.log(e, "failed to delete old generated source folder " + srcFolder.getName() ); //$NON-NLS-1$ + } catch(OperationCanceledException cancel) { + AptPlugin.log(cancel, "deletion of generated source folder got cancelled"); //$NON-NLS-1$ + } + } + }; + IWorkspace ws = ResourcesPlugin.getWorkspace(); + try{ + ws.run(runnable, ws.getRoot(), IWorkspace.AVOID_UPDATE, null); + }catch(CoreException e){ + AptPlugin.log(e, "Runnable for deleting old generated source folder " + srcFolder.getName() + " failed."); //$NON-NLS-1$ //$NON-NLS-2$ + } } /** diff --git a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/FileSystemUtil.java b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/FileSystemUtil.java index 293fc78d1a..2df6292620 100644 --- a/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/FileSystemUtil.java +++ b/org.eclipse.jdt.apt.core/src/org/eclipse/jdt/apt/core/internal/util/FileSystemUtil.java @@ -24,13 +24,8 @@ import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.jdt.apt.core.AptPlugin; /** * Simple utility class to encapsulate an mkdirs() that avoids a timing issue @@ -41,33 +36,43 @@ public final class FileSystemUtil private FileSystemUtil() {} /** - * Remove the specified folder from disk, using a WorkspaceRunnable so that - * the job blocks until it can obtain the necessary locks. - * @param folder + * If the given resource is a folder, then recursively deleted all derived + * files and folders contained within it. Delete the folder if it becomes empty + * and if itself is also a derived resource. + * If the given resource is a file, delete it iff it is a derived resource. + * The resource is left untouched if it is no a folder or a file. + * @param resource + * @return <code>true</code> iff the resource has been deleted. + * @throws CoreException */ - public static void deleteFolder(final IFolder folder) { - if( folder != null ){ - final IWorkspaceRunnable runnable = new IWorkspaceRunnable(){ - public void run(IProgressMonitor monitor) - { - if( folder != null ){ - try{ - folder.delete(true, false, null); - }catch(CoreException e){ - AptPlugin.log(e, "failed to delete old generated source folder " + folder.getName() ); //$NON-NLS-1$ - }catch(OperationCanceledException cancel){ - AptPlugin.log(cancel, "deletion of generated source folder got cancelled"); //$NON-NLS-1$ - } - } - } - }; - IWorkspace ws = ResourcesPlugin.getWorkspace(); - try{ - ws.run(runnable, ws.getRoot(), IWorkspace.AVOID_UPDATE, null); - }catch(CoreException e){ - AptPlugin.log(e, "Runnable for deleting old generated source folder " + folder.getName() + " failed."); //$NON-NLS-1$ //$NON-NLS-2$ - } + public static boolean deleteDerivedResources(final IResource resource) + throws CoreException + { + if (null == resource) { + return false; + } + if( resource.getType() == IResource.FOLDER ){ + boolean deleteFolder = resource.isDerived(); + IResource[] members = ((IFolder)resource).members(); + for( int i=0, len=members.length; i<len; i++ ){ + deleteFolder &= deleteDerivedResources(members[i]); + } + if( deleteFolder ){ + resource.delete(true, null); + return true; + } + return false; } + else if( resource.getType() == IResource.FILE ){ + if( resource.isDerived() ){ + resource.delete(true, null); + return true; + } + return false; + } + // will skip pass everything else. + else + return false; } public static void mkdirs( File parent ) diff --git a/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/AptConfigurationBlock.java b/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/AptConfigurationBlock.java index 41f17a132d..03efef5446 100644 --- a/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/AptConfigurationBlock.java +++ b/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/AptConfigurationBlock.java @@ -18,6 +18,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.preferences.IScopeContext; @@ -386,6 +387,12 @@ public class AptConfigurationBlock extends BaseConfigurationBlock { if (!AptConfig.validateGenSrcDir(fJProj, dirName)) { return new StatusInfo(IStatus.ERROR, Messages.AptConfigurationBlock_genSrcDirMustBeValidRelativePath); } + if (fJProj != null && !dirName.equals(fOriginalGenSrcDir)) { + IFolder folder = fJProj.getProject().getFolder( dirName ); + if (folder != null && folder.exists() && !folder.isDerived()) { + return new StatusInfo(IStatus.WARNING, Messages.AptConfigurationBlock_warningContentsMayBeDeleted); + } + } return new StatusInfo(); } diff --git a/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/Messages.java b/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/Messages.java index b3075e114b..8fa73c3cb0 100644 --- a/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/Messages.java +++ b/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/Messages.java @@ -105,4 +105,6 @@ public class Messages extends NLS { public static String AdvancedFactoryPathOptionsDialog_batchMode; public static String AdvancedFactoryPathOptionsDialog_label_processorsInThisContainer; + + public static String AptConfigurationBlock_warningContentsMayBeDeleted; } diff --git a/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/messages.properties b/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/messages.properties index 6e5ea2fe5e..edc77e1b9f 100644 --- a/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/messages.properties +++ b/org.eclipse.jdt.apt.ui/src/org/eclipse/jdt/apt/ui/internal/preferences/messages.properties @@ -6,6 +6,7 @@ AptConfigurationBlock_remove=Remove AptConfigurationBlock_value=Value AptConfigurationBlock_generatedSrcDir=Generated source directory: AptConfigurationBlock_warningIgnoredOptions=An automatically set option will override this option +AptConfigurationBlock_warningContentsMayBeDeleted=Contents of generated source directory may be deleted AptConfigurationBlock_classpathAddedAutomaticallyNote=Note: options such as \"-classpath\" and \"-sourcepath\" are automatically passed to all processors, with values corresponding to the project's Java settings. AptConfigurationBlock_genSrcDirMustBeValidRelativePath=Generated source directory must be a valid relative path AptConfigurationBlock_options=Processor options (-Akey=value): |