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();
}
}
}