1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-05 00:36:16 +02:00

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
This commit is contained in:
Alain Magloire 2005-03-18 17:54:39 +00:00
parent 011cd84a92
commit cab81eb6a0
5 changed files with 145 additions and 69 deletions

View file

@ -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.

View file

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

View file

@ -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 <code>IProject</code> 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();
}
}

View file

@ -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 <code>IProject</code> 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();
}

View file

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