diff --git a/build/org.eclipse.cdt.managedbuilder.core/ChangeLog b/build/org.eclipse.cdt.managedbuilder.core/ChangeLog index 06eb4c9986f..8040ad6c413 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/ChangeLog +++ b/build/org.eclipse.cdt.managedbuilder.core/ChangeLog @@ -1,3 +1,11 @@ +2005-03-18 Alain Magloire + Fix for PR 88110: Importing project that need converting would + create NPE and ResouceException failures. + * src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java + * src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject12.java + * src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject20.java + * src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject.java + 2005-01-24 Vladimir Hirsl Updated managed build scanner info collector to use new interfaces introduced for CDT 3.0. diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java index ce98f480fb9..c4d1c6876aa 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java @@ -12,6 +12,8 @@ package org.eclipse.cdt.managedbuilder.core; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -60,11 +62,9 @@ import org.eclipse.cdt.managedbuilder.internal.core.ToolChain; import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator; import org.eclipse.cdt.managedbuilder.makegen.gnu.GnuMakefileGenerator; import org.eclipse.cdt.managedbuilder.projectconverter.UpdateManagedProjectManager; -import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IResourceStatus; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; @@ -355,9 +355,8 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI if (buildInfo != null) { List targets = buildInfo.getTargets(); return (ITarget[])targets.toArray(new ITarget[targets.size()]); - } else { - return emptyTargets; } + return emptyTargets; } /** @@ -1187,44 +1186,27 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI if (version == null) { // This is a 1.2 manifest and we are compatible for now return true; - } else { - // isCompatibleWith will return FALSE, if: - // o The major versions are not equal - // o The major versions are equal, but the remainder of the manifest version # is - // greater than the MBS version # - return(buildInfoVersion.isCompatibleWith(version)); } + // isCompatibleWith will return FALSE, if: + // o The major versions are not equal + // o The major versions are equal, but the remainder of the manifest version # is + // greater than the MBS version # + return(buildInfoVersion.isCompatibleWith(version)); } /* (non-Javadoc) * Load the build information for the specified resource from its project * file. Pay attention to the version number too. */ - private static ManagedBuildInfo loadBuildInfo(IProject project) throws Exception { + private static ManagedBuildInfo loadBuildInfo(final IProject project) throws Exception { ManagedBuildInfo buildInfo = null; IFile file = project.getFile(SETTINGS_FILE_NAME); - if (!file.exists()) + File cdtbuild = file.getLocation().toFile(); + if (!cdtbuild.exists()) return null; // So there is a project file, load the information there - InputStream stream = null; - try { - stream = file.getContents(); - } catch (ResourceException e) { - // TODO: Why couldn't the file be read? - if (e.getStatus().getCode() == IResourceStatus.OUT_OF_SYNC_LOCAL) { - // TODO: Issue a warning? - // Read it anyway... - try { - stream = file.getContents(true); - } catch (Exception fe) { - throw fe; - } - } - } catch (Exception e) { - throw e; - } - + InputStream stream = new FileInputStream(cdtbuild); try { DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = parser.parse(stream); @@ -1262,11 +1244,7 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI buildInfo.setVersion(fileVersion); } if(!UpdateManagedProjectManager.isCompatibleProject(buildInfo)){ - try{ - UpdateManagedProjectManager.updateProject(project,buildInfo); - } catch(CoreException e){ - throw e; - } + UpdateManagedProjectManager.updateProject(project, buildInfo); } if (buildInfo.getManagedProject() == null || (!buildInfo.getManagedProject().isValid())) { @@ -1832,7 +1810,7 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI * @return IManagedBuildInfo The build information object for the resource. */ public static IManagedBuildInfo getBuildInfo(IResource resource) { - return (IManagedBuildInfo) findBuildInfo(resource.getProject()); + return findBuildInfo(resource.getProject()); } /** diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject12.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject12.java index 68674b5b172..dec5e68ff00 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject12.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject12.java @@ -10,6 +10,8 @@ **********************************************************************/ package org.eclipse.cdt.managedbuilder.projectconverter; +import java.io.File; +import java.io.FileInputStream; import java.io.InputStream; import java.util.Arrays; import java.util.HashMap; @@ -38,10 +40,13 @@ import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -372,12 +377,12 @@ class UpdateManagedProject12 { configuration.setOption(tool, newOpt, bool.booleanValue()); break; case IOption.STRING: - String strVal = (String) optRef.getAttribute(IOption.DEFAULT_VALUE); + String strVal = optRef.getAttribute(IOption.DEFAULT_VALUE); configuration.setOption(tool, newOpt, strVal); break; case IOption.ENUMERATED: // This is going to be the human readable form of the enumerated value - String name = (String) optRef.getAttribute(IOption.DEFAULT_VALUE); + String name = optRef.getAttribute(IOption.DEFAULT_VALUE); // Convert it to the ID String idValue = newOpt.getEnumeratedId(name); configuration.setOption(tool, newOpt, idValue != null ? idValue : name); @@ -665,9 +670,11 @@ class UpdateManagedProject12 { * @param project the IProject that needs to be upgraded * @throws CoreException if the update fails */ - public static void doProjectUpdate(IProgressMonitor monitor, IProject project) throws CoreException { + public static void doProjectUpdate(IProgressMonitor monitor, final IProject project) throws CoreException { String[] projectName = new String[]{project.getName()}; - IFile settingsFile = project.getFile(ManagedBuildManager.SETTINGS_FILE_NAME); + IFile file = project.getFile(ManagedBuildManager.SETTINGS_FILE_NAME); + File settingsFile = file.getLocation().toFile(); + if (!settingsFile.exists()) { monitor.done(); return; @@ -676,14 +683,14 @@ class UpdateManagedProject12 { // Backup the file monitor.beginTask(ConverterMessages.getFormattedString("UpdateManagedProject12.0", projectName), 1); //$NON-NLS-1$ IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); - UpdateManagedProjectManager.backupFile(settingsFile, "_12backup", monitor, project); ; //$NON-NLS-1$ + UpdateManagedProjectManager.backupFile(file, "_12backup", monitor, project); ; //$NON-NLS-1$ IManagedProject newProject = null; //Now convert each target to the new format try { // Load the old build file - InputStream stream = settingsFile.getContents(); + InputStream stream = new FileInputStream(settingsFile); DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = parser.parse(stream); @@ -735,7 +742,22 @@ class UpdateManagedProject12 { throw new CoreException(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.getUniqueIdentifier(), -1, e.getMessage(), e)); } finally { - ManagedBuildManager.saveBuildInfo(project, false); + // If the tree is locked spawn a job to this. + IWorkspace workspace = project.getWorkspace(); + boolean treeLock = workspace.isTreeLocked(); + ISchedulingRule rule = workspace.getRuleFactory().createRule(project); + if (treeLock) { + WorkspaceJob job = new WorkspaceJob("Updating managed Project") { + public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { + ManagedBuildManager.saveBuildInfo(project, false); + return Status.OK_STATUS; + } + }; + job.setRule(rule); + job.schedule(); + } else { + ManagedBuildManager.saveBuildInfo(project, false); + } monitor.done(); } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject20.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject20.java index 2655667202f..f39ce9ec3e3 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject20.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject20.java @@ -11,6 +11,8 @@ package org.eclipse.cdt.managedbuilder.projectconverter; +import java.io.File; +import java.io.FileInputStream; import java.io.InputStream; import java.util.Vector; @@ -35,10 +37,13 @@ import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -52,9 +57,10 @@ class UpdateManagedProject20 { * @param project the IProject that needs to be upgraded * @throws CoreException */ - static void doProjectUpdate(IProgressMonitor monitor, IProject project) throws CoreException { + static void doProjectUpdate(IProgressMonitor monitor, final IProject project) throws CoreException { String[] projectName = new String[]{project.getName()}; - IFile settingsFile = project.getFile(ManagedBuildManager.SETTINGS_FILE_NAME); + IFile file = project.getFile(ManagedBuildManager.SETTINGS_FILE_NAME); + File settingsFile = file.getLocation().toFile(); if (!settingsFile.exists()) { monitor.done(); return; @@ -63,11 +69,11 @@ class UpdateManagedProject20 { // Backup the file monitor.beginTask(ConverterMessages.getFormattedString("UpdateManagedProject20.0", projectName), 1); //$NON-NLS-1$ IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); - UpdateManagedProjectManager.backupFile(settingsFile, "_20backup", monitor, project); //$NON-NLS-1$ + UpdateManagedProjectManager.backupFile(file, "_20backup", monitor, project); //$NON-NLS-1$ try { // Load the old build file - InputStream stream = settingsFile.getContents(); + InputStream stream = new FileInputStream(settingsFile); DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = parser.parse(stream); @@ -96,7 +102,22 @@ class UpdateManagedProject20 { throw new CoreException(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.getUniqueIdentifier(), -1, e.getMessage(), e)); } finally { - ManagedBuildManager.saveBuildInfo(project, false); + // If the tree is locked spawn a job to this. + IWorkspace workspace = project.getWorkspace(); + boolean treeLock = workspace.isTreeLocked(); + ISchedulingRule rule = workspace.getRuleFactory().createRule(project); + if (treeLock) { + WorkspaceJob job = new WorkspaceJob("Updating managed Project") { + public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { + ManagedBuildManager.saveBuildInfo(project, false); + return Status.OK_STATUS; + } + }; + job.setRule(rule); + job.schedule(); + } else { + ManagedBuildManager.saveBuildInfo(project, false); + } monitor.done(); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProjectManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProjectManager.java index 4a8d46c16dd..6cb433cf7c3 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProjectManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProjectManager.java @@ -10,6 +10,10 @@ **********************************************************************/ package org.eclipse.cdt.managedbuilder.projectconverter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.util.HashMap; import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; @@ -19,6 +23,9 @@ import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; @@ -27,6 +34,7 @@ import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.PluginVersionIdentifier; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; @@ -63,8 +71,7 @@ public class UpdateManagedProjectManager { if(IOverwriteQuery.ALL.equalsIgnoreCase(answer) || IOverwriteQuery.YES.equalsIgnoreCase(answer)) return true; - else - return false; + return false; } synchronized static private UpdateManagedProjectManager getUpdateManager(IProject project){ @@ -122,7 +129,7 @@ public class UpdateManagedProjectManager { UpdateManagedProjectManager mngr = getExistingUpdateManager(project); if(mngr == null || mngr.fIsInfoReadOnly) return; - IContainer destFolder = (IContainer)project; + IContainer destFolder = project; IFile dstFile = destFolder.getFile(new Path(settingsFile.getName()+suffix)); mngr.backupFile(settingsFile, dstFile, monitor, project, fBackupFileOverwriteQuery); } @@ -137,40 +144,69 @@ public class UpdateManagedProjectManager { * @param query */ private void backupFile(IFile srcFile, IFile dstFile, IProgressMonitor monitor, IProject project, IOverwriteQuery query){ - try{ + File src = srcFile.getLocation().toFile(); + File dst = dstFile.getLocation().toFile(); + backupFile(src, dst, monitor, project, query); + } + + private void backupFile(File srcFile, File dstFile, IProgressMonitor monitor, IProject project, IOverwriteQuery query){ + try { if (dstFile.exists()) { boolean shouldUpdate; if(query != null) - shouldUpdate = getBooleanFromQueryAnswer(query.queryOverwrite(dstFile.getFullPath().toString())); + shouldUpdate = getBooleanFromQueryAnswer(query.queryOverwrite(dstFile.getName())); else shouldUpdate = openQuestion(ConverterMessages.getResourceString("UpdateManagedProjectManager.0"), //$NON-NLS-1$ ConverterMessages.getFormattedString("UpdateManagedProjectManager.1", new String[] {dstFile.getName(),project.getName()})); //$NON-NLS-1$ if (shouldUpdate) { - dstFile.delete(true, monitor); + dstFile.delete(); } else { -// monitor.setCanceled(true); throw new OperationCanceledException(ConverterMessages.getFormattedString("UpdateManagedProjectManager.2", project.getName())); //$NON-NLS-1$ } } - srcFile.copy(dstFile.getFullPath(), true, monitor); - } - catch(Exception e){ + copyFile(srcFile, dstFile); + } catch(Exception e){ fIsInfoReadOnly = true; } } - + + void copyFile(File src, File dst) throws IOException { + FileInputStream fis = null; + FileOutputStream fos = null; + + try { + fis = new FileInputStream(src); + fos = new FileOutputStream(dst); + + final int BUFSIZ = 1024; + byte buf[] = new byte[BUFSIZ]; + int len = 0; + + while ((len = fis.read(buf)) > 0) { + fos.write(buf, 0, len); + } + } finally { + if (fis != null) { + fis.close(); + } + if (fos != null) { + fos.close(); + } + } + } + private void restoreFile(String backupFileName, String restoreFileName, IProgressMonitor monitor, IProject project){ - IContainer destFolder = (IContainer)project; - IFile restoreFile = destFolder.getFile(new Path(restoreFileName)); - IFile backupFile = destFolder.getFile(new Path(backupFileName)); + IContainer destFolder = project; + File restoreFile = destFolder.getFile(new Path(restoreFileName)).getLocation().toFile(); + File backupFile = destFolder.getFile(new Path(backupFileName)).getLocation().toFile(); try{ - if (restoreFile.exists()) - restoreFile.delete(true, monitor); - backupFile.copy(restoreFile.getFullPath(), true, monitor); - } - catch(Exception e){ + if (restoreFile.exists()) { + restoreFile.delete(); + } + copyFile(backupFile, restoreFile); + } catch(Exception e){ fIsInfoReadOnly = true; } } @@ -223,7 +259,7 @@ public class UpdateManagedProjectManager { return; try { - if (!settingsFile.exists()) + if (!settingsFile.getLocation().toFile().exists()) throw new CoreException(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.getUniqueIdentifier(), -1, ConverterMessages.getResourceString("UpdateManagedProjectManager.6"),null)); //$NON-NLS-1$ @@ -284,12 +320,23 @@ public class UpdateManagedProjectManager { * @param info the ManagedBuildInfo for the current project * @throws CoreException if conversion failed */ - static public void updateProject(IProject project, ManagedBuildInfo info) + static public void updateProject(final IProject project, ManagedBuildInfo info) throws CoreException{ try{ getUpdateManager(project).doProjectUpdate(info); } finally { removeUpdateManager(project); + // We have to this here since we use java.io.File to handle the update. + IWorkspace workspace = project.getWorkspace(); + ISchedulingRule rule = workspace.getRuleFactory().refreshRule(project); + WorkspaceJob job = new WorkspaceJob("Refresh Project") { //$NON-NLS-1$ + public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { + project.refreshLocal(IResource.DEPTH_ONE, null); + return Status.OK_STATUS; + } + }; + job.setRule(rule); + job.schedule(); } } }