mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-10 17:55:39 +02:00
1. Bug-fixes for 175090 and 175091
2. Map is used to store the project-to-CProjectDescription associations instead of project session properties 3. Basis for functionality of preserving settings on resource rename/move.
This commit is contained in:
parent
b5eee56244
commit
c391b1daf6
10 changed files with 752 additions and 157 deletions
|
@ -98,7 +98,6 @@ import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.core.runtime.PluginVersionIdentifier;
|
import org.eclipse.core.runtime.PluginVersionIdentifier;
|
||||||
import org.eclipse.core.runtime.QualifiedName;
|
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
import org.eclipse.core.runtime.SubProgressMonitor;
|
import org.eclipse.core.runtime.SubProgressMonitor;
|
||||||
import org.eclipse.jface.dialogs.MessageDialog;
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
|
@ -118,7 +117,7 @@ import org.w3c.dom.NodeList;
|
||||||
*/
|
*/
|
||||||
public class ManagedBuildManager extends AbstractCExtension implements IScannerInfoProvider {
|
public class ManagedBuildManager extends AbstractCExtension implements IScannerInfoProvider {
|
||||||
|
|
||||||
private static final QualifiedName buildInfoProperty = new QualifiedName(ManagedBuilderCorePlugin.getUniqueIdentifier(), "managedBuildInfo"); //$NON-NLS-1$
|
// private static final QualifiedName buildInfoProperty = new QualifiedName(ManagedBuilderCorePlugin.getUniqueIdentifier(), "managedBuildInfo"); //$NON-NLS-1$
|
||||||
private static final String ROOT_NODE_NAME = "ManagedProjectBuildInfo"; //$NON-NLS-1$
|
private static final String ROOT_NODE_NAME = "ManagedProjectBuildInfo"; //$NON-NLS-1$
|
||||||
public static final String SETTINGS_FILE_NAME = ".cdtbuild"; //$NON-NLS-1$
|
public static final String SETTINGS_FILE_NAME = ".cdtbuild"; //$NON-NLS-1$
|
||||||
private static final ITarget[] emptyTargets = new ITarget[0];
|
private static final ITarget[] emptyTargets = new ITarget[0];
|
||||||
|
@ -217,6 +216,8 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
|
||||||
private static HashMap fSortedTools;
|
private static HashMap fSortedTools;
|
||||||
private static HashMap fSortedBuilders;
|
private static HashMap fSortedBuilders;
|
||||||
|
|
||||||
|
private static Map fInfoMap = new HashMap();
|
||||||
|
|
||||||
private static ISorter fToolChainSorter = new ISorter(){
|
private static ISorter fToolChainSorter = new ISorter(){
|
||||||
public void sort() {
|
public void sort() {
|
||||||
resortToolChains();
|
resortToolChains();
|
||||||
|
@ -1943,7 +1944,8 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
|
||||||
ManagedBuildManager.performValueHandlerEvent(configs[i], IManagedOptionValueHandler.EVENT_OPEN);
|
ManagedBuildManager.performValueHandlerEvent(configs[i], IManagedOptionValueHandler.EVENT_OPEN);
|
||||||
}
|
}
|
||||||
// Finish up
|
// Finish up
|
||||||
project.setSessionProperty(buildInfoProperty, buildInfo);
|
//project.setSessionProperty(buildInfoProperty, buildInfo);
|
||||||
|
setLoaddedBuildInfo(project, buildInfo);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw e;
|
throw e;
|
||||||
|
@ -2445,9 +2447,13 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
|
||||||
return buildInfo;
|
return buildInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setLoaddedBuildInfo(IProject project, IManagedBuildInfo info) throws CoreException{
|
public synchronized static void setLoaddedBuildInfo(IProject project, IManagedBuildInfo info) throws CoreException{
|
||||||
// Associate the build info with the project for the duration of the session
|
// Associate the build info with the project for the duration of the session
|
||||||
project.setSessionProperty(buildInfoProperty, info);
|
//project.setSessionProperty(buildInfoProperty, info);
|
||||||
|
if(info != null)
|
||||||
|
fInfoMap.put(project, info);
|
||||||
|
else
|
||||||
|
fInfoMap.remove(project);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IManagedConfigElementProvider createConfigProvider(
|
private static IManagedConfigElementProvider createConfigProvider(
|
||||||
|
@ -2563,9 +2569,9 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
|
||||||
return buildInfo;
|
return buildInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ManagedBuildInfo getLoaddedBuildInfo(IProject project) throws CoreException{
|
synchronized static ManagedBuildInfo getLoaddedBuildInfo(IProject project) throws CoreException{
|
||||||
// Check if there is any build info associated with this project for this session
|
// Check if there is any build info associated with this project for this session
|
||||||
ManagedBuildInfo buildInfo = (ManagedBuildInfo)project.getSessionProperty(buildInfoProperty);
|
ManagedBuildInfo buildInfo = (ManagedBuildInfo)fInfoMap.get(project);//project.getSessionProperty(buildInfoProperty);
|
||||||
// Make sure that if a project has build info, that the info is not corrupted
|
// Make sure that if a project has build info, that the info is not corrupted
|
||||||
if (buildInfo != null) {
|
if (buildInfo != null) {
|
||||||
buildInfo.updateOwner(project);
|
buildInfo.updateOwner(project);
|
||||||
|
@ -4263,5 +4269,13 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
|
||||||
if(des != null)
|
if(des != null)
|
||||||
CCorePlugin.getDefault().setPreferenceConfiguration(CFG_DATA_PROVIDER_ID, des);
|
CCorePlugin.getDefault().setPreferenceConfiguration(CFG_DATA_PROVIDER_ID, des);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static synchronized void updateLoaddedInfo(IProject fromProject, IProject toProject, IManagedBuildInfo info){
|
||||||
|
try {
|
||||||
|
setLoaddedBuildInfo(fromProject, null);
|
||||||
|
setLoaddedBuildInfo(toProject, info);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager;
|
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager;
|
||||||
import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
|
import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
|
||||||
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
|
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
|
||||||
|
@ -27,27 +26,21 @@ import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
|
||||||
import org.eclipse.cdt.managedbuilder.internal.buildmodel.DbgUtil;
|
import org.eclipse.cdt.managedbuilder.internal.buildmodel.DbgUtil;
|
||||||
import org.eclipse.cdt.managedbuilder.internal.core.BuilderFactory;
|
import org.eclipse.cdt.managedbuilder.internal.core.BuilderFactory;
|
||||||
import org.eclipse.cdt.managedbuilder.internal.core.GeneratedMakefileBuilder;
|
import org.eclipse.cdt.managedbuilder.internal.core.GeneratedMakefileBuilder;
|
||||||
import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages;
|
|
||||||
import org.eclipse.cdt.managedbuilder.internal.core.ResourceChangeHandler;
|
|
||||||
import org.eclipse.cdt.managedbuilder.internal.scannerconfig.ManagedBuildCPathEntryContainer;
|
import org.eclipse.cdt.managedbuilder.internal.scannerconfig.ManagedBuildCPathEntryContainer;
|
||||||
import org.eclipse.cdt.managedbuilder.internal.scannerconfig.ManagedBuildPathEntryContainerInitializer;
|
import org.eclipse.cdt.managedbuilder.internal.scannerconfig.ManagedBuildPathEntryContainerInitializer;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IResourceChangeEvent;
|
import org.eclipse.core.resources.IResourceChangeEvent;
|
||||||
import org.eclipse.core.resources.ISavedState;
|
|
||||||
import org.eclipse.core.resources.IWorkspaceRoot;
|
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IConfigurationElement;
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
import org.eclipse.core.runtime.IExtension;
|
import org.eclipse.core.runtime.IExtension;
|
||||||
import org.eclipse.core.runtime.IExtensionPoint;
|
import org.eclipse.core.runtime.IExtensionPoint;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.core.runtime.Plugin;
|
import org.eclipse.core.runtime.Plugin;
|
||||||
import org.eclipse.core.runtime.Preferences;
|
import org.eclipse.core.runtime.Preferences;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
import org.eclipse.core.runtime.jobs.Job;
|
|
||||||
import org.osgi.framework.BundleContext;
|
import org.osgi.framework.BundleContext;
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,7 +67,7 @@ public class ManagedBuilderCorePlugin extends Plugin {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static ResourceChangeHandler listener;
|
private static ResourceChangeHandler2 listener;
|
||||||
|
|
||||||
private DiscoveredPathManager fDiscoveryPathManager;
|
private DiscoveredPathManager fDiscoveryPathManager;
|
||||||
|
|
||||||
|
@ -119,7 +112,15 @@ public class ManagedBuilderCorePlugin extends Plugin {
|
||||||
// elements
|
// elements
|
||||||
|
|
||||||
// IJobManager jobManager = Platform.getJobManager();
|
// IJobManager jobManager = Platform.getJobManager();
|
||||||
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
|
// IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
|
||||||
|
listener = new ResourceChangeHandler2();
|
||||||
|
|
||||||
|
ResourcesPlugin.getWorkspace().addResourceChangeListener(
|
||||||
|
listener,
|
||||||
|
IResourceChangeEvent.POST_CHANGE
|
||||||
|
| IResourceChangeEvent.PRE_DELETE
|
||||||
|
| IResourceChangeEvent.PRE_CLOSE
|
||||||
|
/*| IResourceChangeEvent.POST_BUILD*/);
|
||||||
/* try {
|
/* try {
|
||||||
jobManager.beginRule(root, null);
|
jobManager.beginRule(root, null);
|
||||||
|
|
||||||
|
@ -133,27 +134,27 @@ public class ManagedBuilderCorePlugin extends Plugin {
|
||||||
//The startResourceChangeHandling() might result in throwing an error
|
//The startResourceChangeHandling() might result in throwing an error
|
||||||
//see bug# 132001
|
//see bug# 132001
|
||||||
//Always schedule a job
|
//Always schedule a job
|
||||||
Job rcJob = new Job(ManagedMakeMessages.getResourceString("ManagedBuilderCorePlugin.resourceChangeHandlingInitializationJob")){ //$NON-NLS-1$
|
// Job rcJob = new Job(ManagedMakeMessages.getResourceString("ManagedBuilderCorePlugin.resourceChangeHandlingInitializationJob")){ //$NON-NLS-1$
|
||||||
protected IStatus run(IProgressMonitor monitor) {
|
// protected IStatus run(IProgressMonitor monitor) {
|
||||||
try{
|
// try{
|
||||||
startResourceChangeHandling();
|
// startResourceChangeHandling();
|
||||||
} catch (CoreException e){
|
// } catch (CoreException e){
|
||||||
CCorePlugin.log(e);
|
// CCorePlugin.log(e);
|
||||||
return e.getStatus();
|
// return e.getStatus();
|
||||||
}
|
// }
|
||||||
return new Status(
|
// return new Status(
|
||||||
IStatus.OK,
|
// IStatus.OK,
|
||||||
ManagedBuilderCorePlugin.getUniqueIdentifier(),
|
// ManagedBuilderCorePlugin.getUniqueIdentifier(),
|
||||||
IStatus.OK,
|
// IStatus.OK,
|
||||||
new String(),
|
// new String(),
|
||||||
null);
|
// null);
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
|
//
|
||||||
rcJob.setRule(root);
|
// rcJob.setRule(root);
|
||||||
rcJob.setPriority(Job.INTERACTIVE);
|
// rcJob.setPriority(Job.INTERACTIVE);
|
||||||
rcJob.setSystem(true);
|
// rcJob.setSystem(true);
|
||||||
rcJob.schedule();
|
// rcJob.schedule();
|
||||||
/*
|
/*
|
||||||
} finally {
|
} finally {
|
||||||
jobManager.endRule(root);
|
jobManager.endRule(root);
|
||||||
|
@ -166,23 +167,23 @@ public class ManagedBuilderCorePlugin extends Plugin {
|
||||||
* Throws CoreException if the methods fails to add a save participant.
|
* Throws CoreException if the methods fails to add a save participant.
|
||||||
* The resource change listener in not added in this case either.
|
* The resource change listener in not added in this case either.
|
||||||
*/
|
*/
|
||||||
private void startResourceChangeHandling() throws CoreException{
|
// private void startResourceChangeHandling() throws CoreException{
|
||||||
// Set up a listener for resource change events
|
// // Set up a listener for resource change events
|
||||||
listener = new ResourceChangeHandler();
|
// listener = new ResourceChangeHandler();
|
||||||
ISavedState lastState =
|
// ISavedState lastState =
|
||||||
ResourcesPlugin.getWorkspace().addSaveParticipant(ManagedBuilderCorePlugin.this, listener);
|
// ResourcesPlugin.getWorkspace().addSaveParticipant(ManagedBuilderCorePlugin.this, listener);
|
||||||
|
//
|
||||||
ResourcesPlugin.getWorkspace().addResourceChangeListener(
|
// ResourcesPlugin.getWorkspace().addResourceChangeListener(
|
||||||
listener,
|
// listener,
|
||||||
IResourceChangeEvent.POST_CHANGE
|
// IResourceChangeEvent.POST_CHANGE
|
||||||
| IResourceChangeEvent.PRE_DELETE
|
// | IResourceChangeEvent.PRE_DELETE
|
||||||
| IResourceChangeEvent.PRE_CLOSE
|
// | IResourceChangeEvent.PRE_CLOSE
|
||||||
/*| IResourceChangeEvent.POST_BUILD*/);
|
// /*| IResourceChangeEvent.POST_BUILD*/);
|
||||||
|
//
|
||||||
if (lastState != null) {
|
// if (lastState != null) {
|
||||||
lastState.processResourceChangeEvents(listener);
|
// lastState.processResourceChangeEvents(listener);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
|
* @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Intel Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Intel Corporation - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.managedbuilder.core;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.settings.model.util.ResourceChangeHandlerBase;
|
||||||
|
import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IResourceChangeEvent;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
|
class ResourceChangeHandler2 extends ResourceChangeHandlerBase{
|
||||||
|
private class RcMoveHandler implements IResourceMoveHandler {
|
||||||
|
|
||||||
|
public void done() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleProjectClose(IProject project) {
|
||||||
|
sendClose(project);
|
||||||
|
try {
|
||||||
|
ManagedBuildManager.setLoaddedBuildInfo(project, null);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean handleResourceMove(IResource fromRc, IResource toRc) {
|
||||||
|
switch(fromRc.getType()){
|
||||||
|
case IResource.PROJECT:
|
||||||
|
IProject fromProject = fromRc.getProject();
|
||||||
|
IProject toProject = toRc.getProject();
|
||||||
|
ManagedBuildInfo info = (ManagedBuildInfo)ManagedBuildManager.getBuildInfo(fromProject, false);
|
||||||
|
if(info != null){
|
||||||
|
info.updateOwner(toRc);
|
||||||
|
ManagedBuildManager.updateLoaddedInfo(fromProject, toProject, info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean handleResourceRemove(IResource rc) {
|
||||||
|
switch(rc.getType()){
|
||||||
|
case IResource.PROJECT:
|
||||||
|
IProject project = rc.getProject();
|
||||||
|
sendClose(project);
|
||||||
|
try {
|
||||||
|
ManagedBuildManager.setLoaddedBuildInfo(project, null);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IResourceMoveHandler createResourceMoveHandler(
|
||||||
|
IResourceChangeEvent event) {
|
||||||
|
return new RcMoveHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendClose(IProject project){
|
||||||
|
sendClose(ManagedBuildManager.getBuildInfo(project,false));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendClose(IManagedBuildInfo info){
|
||||||
|
if(info != null){
|
||||||
|
IManagedProject managedProj = info.getManagedProject();
|
||||||
|
if (managedProj != null) {
|
||||||
|
IConfiguration cfgs[] = managedProj.getConfigurations();
|
||||||
|
|
||||||
|
for(int i = 0; i < cfgs.length; i++)
|
||||||
|
ManagedBuildManager.performValueHandlerEvent(cfgs[i], IManagedOptionValueHandler.EVENT_CLOSE, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,154 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Intel Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Intel Corporation - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.core.settings.model.util;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IResourceChangeEvent;
|
||||||
|
import org.eclipse.core.resources.IResourceChangeListener;
|
||||||
|
import org.eclipse.core.resources.IResourceDelta;
|
||||||
|
import org.eclipse.core.resources.IResourceDeltaVisitor;
|
||||||
|
import org.eclipse.core.resources.IWorkspace;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
|
||||||
|
public abstract class ResourceChangeHandlerBase implements IResourceChangeListener {
|
||||||
|
public interface IResourceMoveHandler {
|
||||||
|
boolean handleResourceMove(IResource fromRc, IResource toRc);
|
||||||
|
|
||||||
|
boolean handleResourceRemove(IResource rc);
|
||||||
|
|
||||||
|
void handleProjectClose(IProject project);
|
||||||
|
|
||||||
|
void done();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IWorkspaceRoot fRoot = ResourcesPlugin.getWorkspace().getRoot();
|
||||||
|
|
||||||
|
private class DeltaVisitor implements IResourceDeltaVisitor{
|
||||||
|
// private IResourceDelta fRootDelta;
|
||||||
|
private Map fMoveMap = new HashMap();
|
||||||
|
private IResourceMoveHandler fHandler;
|
||||||
|
|
||||||
|
public DeltaVisitor(IResourceMoveHandler handler, IResourceDelta rootDelta){
|
||||||
|
fHandler = handler;
|
||||||
|
// fRootDelta = rootDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IResource getResource(IPath path, IResource baseResource){
|
||||||
|
switch(baseResource.getType()){
|
||||||
|
case IResource.FILE:
|
||||||
|
return fRoot.getFile(path);
|
||||||
|
case IResource.FOLDER:
|
||||||
|
return fRoot.getFolder(path);
|
||||||
|
case IResource.PROJECT:
|
||||||
|
return fRoot.getProject(path.segment(0));
|
||||||
|
case IResource.ROOT:
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkInitHandleResourceMove(IResource fromRc, IResource toRc){
|
||||||
|
if(fMoveMap.put(fromRc, toRc) == null){
|
||||||
|
return fHandler.handleResourceMove(fromRc, toRc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean visit(IResourceDelta delta) throws CoreException {
|
||||||
|
IResource dResource = delta.getResource();
|
||||||
|
|
||||||
|
boolean resume = true;
|
||||||
|
boolean removed = false;
|
||||||
|
|
||||||
|
switch (delta.getKind()) {
|
||||||
|
case IResourceDelta.REMOVED :
|
||||||
|
removed = true;
|
||||||
|
case IResourceDelta.CHANGED :
|
||||||
|
int flags = delta.getFlags();
|
||||||
|
if ((flags & IResourceDelta.MOVED_TO) != 0) {
|
||||||
|
IPath path = delta.getMovedToPath();
|
||||||
|
if(path != null){
|
||||||
|
IResource toRc = getResource(path, dResource);
|
||||||
|
resume = checkInitHandleResourceMove(dResource, toRc);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else if((flags & IResourceDelta.MOVED_FROM) != 0){
|
||||||
|
IPath path = delta.getMovedFromPath();
|
||||||
|
if(path != null){
|
||||||
|
IResource fromRc = getResource(path, dResource);
|
||||||
|
resume = checkInitHandleResourceMove(fromRc, dResource);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else if (removed){
|
||||||
|
resume = fHandler.handleResourceRemove(dResource);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return resume; // visit the children
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I R e s o u r c e C h a n g e L i s t e n e r
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* Handle the renaming and deletion of project resources
|
||||||
|
* This is necessary in order to update ResourceConfigurations and AdditionalInputs
|
||||||
|
*
|
||||||
|
* @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
|
||||||
|
*/
|
||||||
|
public void resourceChanged(IResourceChangeEvent event) {
|
||||||
|
if (event.getSource() instanceof IWorkspace) {
|
||||||
|
|
||||||
|
IResourceMoveHandler handler = createResourceMoveHandler(event);
|
||||||
|
switch (event.getType()) {
|
||||||
|
case IResourceChangeEvent.PRE_CLOSE:
|
||||||
|
handler.handleProjectClose((IProject)event.getResource());
|
||||||
|
break;
|
||||||
|
// case IResourceChangeEvent.PRE_DELETE :
|
||||||
|
// handler.handleResourceRemove(event.getResource());
|
||||||
|
// break;
|
||||||
|
case IResourceChangeEvent.POST_CHANGE :
|
||||||
|
IResourceDelta resDelta = event.getDelta();
|
||||||
|
if (resDelta == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
DeltaVisitor rcChecker = new DeltaVisitor(handler, resDelta);
|
||||||
|
resDelta.accept(rcChecker);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
handler.done();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract IResourceMoveHandler createResourceMoveHandler(IResourceChangeEvent event);
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Copyright (c) 2000, 2006 IBM Corporation and others.
|
# Copyright (c) 2000, 2007 IBM Corporation and others.
|
||||||
# All rights reserved. This program and the accompanying materials
|
# All rights reserved. This program and the accompanying materials
|
||||||
# are made available under the terms of the Eclipse Public License v1.0
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
# which accompanies this distribution, and is available at
|
# which accompanies this distribution, and is available at
|
||||||
|
@ -78,3 +78,6 @@ PathEntryManager.5=Referenced project is not accessible
|
||||||
PathEntryManager.6=Referenced project is not a C/C++ project
|
PathEntryManager.6=Referenced project is not a C/C++ project
|
||||||
PathEntryManager.1=Workspace include path inaccessible ({0})
|
PathEntryManager.1=Workspace include path inaccessible ({0})
|
||||||
PathEntryManager.7=Workspace library path inaccessible ({0})
|
PathEntryManager.7=Workspace library path inaccessible ({0})
|
||||||
|
|
||||||
|
CProjectDescriptionManager.startRcChangeHandling=Initiating resource change handling..
|
||||||
|
CProjectDescriptionManager.serializing=Serialing CDT Project settings..
|
||||||
|
|
|
@ -52,6 +52,7 @@ import org.eclipse.cdt.core.resources.IPathEntryStoreListener;
|
||||||
import org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent;
|
import org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent;
|
||||||
import org.eclipse.cdt.core.settings.model.util.PathEntryResolveInfo;
|
import org.eclipse.cdt.core.settings.model.util.PathEntryResolveInfo;
|
||||||
import org.eclipse.cdt.core.settings.model.util.PathEntryResolveInfoElement;
|
import org.eclipse.cdt.core.settings.model.util.PathEntryResolveInfoElement;
|
||||||
|
import org.eclipse.cdt.internal.core.settings.model.AbstractCExtensionProxy;
|
||||||
import org.eclipse.cdt.internal.core.settings.model.ConfigBasedPathEntryStore;
|
import org.eclipse.cdt.internal.core.settings.model.ConfigBasedPathEntryStore;
|
||||||
import org.eclipse.core.resources.IMarker;
|
import org.eclipse.core.resources.IMarker;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
@ -1178,10 +1179,14 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
||||||
|
|
||||||
public synchronized IPathEntryStore getPathEntryStore(IProject project, boolean create) throws CoreException {
|
public synchronized IPathEntryStore getPathEntryStore(IProject project, boolean create) throws CoreException {
|
||||||
IPathEntryStore store = (IPathEntryStore)storeMap.get(project);
|
IPathEntryStore store = (IPathEntryStore)storeMap.get(project);
|
||||||
if (store == null && create == true) {
|
if (store == null) {
|
||||||
store = createPathEntryStore(project);
|
if(create == true){
|
||||||
storeMap.put(project, store);
|
store = createPathEntryStore(project);
|
||||||
store.addPathEntryStoreListener(this);
|
storeMap.put(project, store);
|
||||||
|
store.addPathEntryStoreListener(this);
|
||||||
|
}
|
||||||
|
} else if (store instanceof AbstractCExtensionProxy){
|
||||||
|
((AbstractCExtensionProxy)store).updateProject(project);
|
||||||
}
|
}
|
||||||
return store;
|
return store;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,12 @@ public abstract class AbstractCExtensionProxy implements ICProjectDescriptionLis
|
||||||
checkUpdateProvider(CProjectDescriptionManager.getInstance().getProjectDescription(fProject, false), false, false);
|
checkUpdateProvider(CProjectDescriptionManager.getInstance().getProjectDescription(fProject, false), false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateProject(IProject project){
|
||||||
|
IProject oldProj = fProject;
|
||||||
|
fProject = project;
|
||||||
|
if(oldProj == null || !oldProj.equals(fProject))
|
||||||
|
fInited = false;
|
||||||
|
}
|
||||||
|
|
||||||
private ICExtensionReference getRef(ICConfigurationDescription cfg, boolean update){
|
private ICExtensionReference getRef(ICConfigurationDescription cfg, boolean update){
|
||||||
if(fExtPointId != null){
|
if(fExtPointId != null){
|
||||||
|
@ -151,8 +157,10 @@ public abstract class AbstractCExtensionProxy implements ICProjectDescriptionLis
|
||||||
force = true;
|
force = true;
|
||||||
case CProjectDescriptionEvent.APPLIED:
|
case CProjectDescriptionEvent.APPLIED:
|
||||||
ICProjectDescription des = event.getNewCProjectDescription();
|
ICProjectDescription des = event.getNewCProjectDescription();
|
||||||
if(des != null)
|
if(des != null){
|
||||||
|
updateProject(des.getProject());
|
||||||
return checkUpdateProvider(des, force, true);
|
return checkUpdateProvider(des, force, true);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,10 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
|
||||||
// loadActiveCfgId();
|
// loadActiveCfgId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateProject(IProject project){
|
||||||
|
fProject = project;
|
||||||
|
}
|
||||||
|
|
||||||
void loadDatas(){
|
void loadDatas(){
|
||||||
if(!fIsReadOnly || !fIsLoadding)
|
if(!fIsReadOnly || !fIsLoadding)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -21,6 +21,7 @@ import java.io.InputStream;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
@ -77,13 +78,18 @@ import org.eclipse.cdt.internal.core.CConfigBasedDescriptorManager;
|
||||||
import org.eclipse.cdt.internal.core.envvar.ContributedEnvironment;
|
import org.eclipse.cdt.internal.core.envvar.ContributedEnvironment;
|
||||||
import org.eclipse.cdt.internal.core.model.CElementDelta;
|
import org.eclipse.cdt.internal.core.model.CElementDelta;
|
||||||
import org.eclipse.cdt.internal.core.model.CModelManager;
|
import org.eclipse.cdt.internal.core.model.CModelManager;
|
||||||
|
import org.eclipse.cdt.internal.core.model.CoreModelMessages;
|
||||||
import org.eclipse.core.filesystem.EFS;
|
import org.eclipse.core.filesystem.EFS;
|
||||||
import org.eclipse.core.filesystem.IFileStore;
|
import org.eclipse.core.filesystem.IFileStore;
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IProjectDescription;
|
import org.eclipse.core.resources.IProjectDescription;
|
||||||
import org.eclipse.core.resources.IResource;
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IResourceChangeEvent;
|
||||||
|
import org.eclipse.core.resources.ISavedState;
|
||||||
import org.eclipse.core.resources.IWorkspace;
|
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.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IExtension;
|
import org.eclipse.core.runtime.IExtension;
|
||||||
|
@ -120,7 +126,7 @@ public class CProjectDescriptionManager {
|
||||||
private static final String CONVERTED_CFG_ID_PREFIX = "converted.config"; //$NON-NLS-1$
|
private static final String CONVERTED_CFG_ID_PREFIX = "converted.config"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final String STORAGE_FILE_NAME = ".cproject"; //$NON-NLS-1$
|
private static final String STORAGE_FILE_NAME = ".cproject"; //$NON-NLS-1$
|
||||||
private static final QualifiedName PROJECT_DESCRCIPTION_PROPERTY = new QualifiedName(CCorePlugin.PLUGIN_ID, "projectDescription"); //$NON-NLS-1$
|
// private static final QualifiedName PROJECT_DESCRCIPTION_PROPERTY = new QualifiedName(CCorePlugin.PLUGIN_ID, "projectDescription"); //$NON-NLS-1$
|
||||||
private static final String ROOT_ELEMENT_NAME = "cproject"; //$NON-NLS-1$
|
private static final String ROOT_ELEMENT_NAME = "cproject"; //$NON-NLS-1$
|
||||||
private static final String VERSION_ELEMENT_NAME = "fileVersion"; //$NON-NLS-1$
|
private static final String VERSION_ELEMENT_NAME = "fileVersion"; //$NON-NLS-1$
|
||||||
public static final Version DESCRIPTION_VERSION = new Version("4.0"); //$NON-NLS-1$
|
public static final Version DESCRIPTION_VERSION = new Version("4.0"); //$NON-NLS-1$
|
||||||
|
@ -138,6 +144,8 @@ public class CProjectDescriptionManager {
|
||||||
public static final String DEFAULT_PROVIDER_ID = CCorePlugin.PLUGIN_ID + ".defaultConfigDataProvider"; //$NON-NLS-1$
|
public static final String DEFAULT_PROVIDER_ID = CCorePlugin.PLUGIN_ID + ".defaultConfigDataProvider"; //$NON-NLS-1$
|
||||||
private static final String DEFAULT_CFG_ID_PREFIX = CCorePlugin.PLUGIN_ID + ".default.config"; //$NON-NLS-1$
|
private static final String DEFAULT_CFG_ID_PREFIX = CCorePlugin.PLUGIN_ID + ".default.config"; //$NON-NLS-1$
|
||||||
private static final String DEFAULT_CFG_NAME = "Configuration"; //$NON-NLS-1$
|
private static final String DEFAULT_CFG_NAME = "Configuration"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final QualifiedName SCANNER_INFO_PROVIDER_PROPERTY = new QualifiedName(CCorePlugin.PLUGIN_ID, "scannerInfoProvider"); //$NON-NLS-1$
|
||||||
|
|
||||||
private class CompositeSafeRunnable implements ISafeRunnable {
|
private class CompositeSafeRunnable implements ISafeRunnable {
|
||||||
private List fRunnables = new ArrayList();
|
private List fRunnables = new ArrayList();
|
||||||
|
@ -159,6 +167,8 @@ public class CProjectDescriptionManager {
|
||||||
r.handleException(e);
|
r.handleException(e);
|
||||||
if(fStopOnErr)
|
if(fStopOnErr)
|
||||||
throw e;
|
throw e;
|
||||||
|
else
|
||||||
|
r.handleException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,10 +192,10 @@ public class CProjectDescriptionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
private class ProjectInfoHolder{
|
// private class ProjectInfoHolder{
|
||||||
ICProjectDescription fDescription;
|
// CProjectDescription fDescription;
|
||||||
ScannerInfoProviderProxy fSIProvider;
|
// ScannerInfoProviderProxy fSIProvider;
|
||||||
}
|
// }
|
||||||
|
|
||||||
private class ListenerDescriptor{
|
private class ListenerDescriptor{
|
||||||
ICProjectDescriptionListener fListener;
|
ICProjectDescriptionListener fListener;
|
||||||
|
@ -207,6 +217,8 @@ public class CProjectDescriptionManager {
|
||||||
private Map fPreferenceMap = new HashMap();
|
private Map fPreferenceMap = new HashMap();
|
||||||
private CConfigBasedDescriptorManager fDescriptorManager;
|
private CConfigBasedDescriptorManager fDescriptorManager;
|
||||||
private ThreadLocal fLoaddingDescriptions = new ThreadLocal();
|
private ThreadLocal fLoaddingDescriptions = new ThreadLocal();
|
||||||
|
private Map fDescriptionMap = new HashMap(); //calls to this map are "manually" synchronized with the CProjectDescriptionManager object lock;
|
||||||
|
private ResourceChangeHandler fRcChangeHandler;
|
||||||
|
|
||||||
// private CStorage fPrefCfgStorage;
|
// private CStorage fPrefCfgStorage;
|
||||||
private ICDataProxyContainer fPrefUpdater = new ICDataProxyContainer(){
|
private ICDataProxyContainer fPrefUpdater = new ICDataProxyContainer(){
|
||||||
|
@ -241,9 +253,58 @@ public class CProjectDescriptionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startup(){
|
public void startup(){
|
||||||
if(fDescriptorManager == null){
|
if(fRcChangeHandler == null){
|
||||||
fDescriptorManager = CConfigBasedDescriptorManager.getInstance();
|
fRcChangeHandler = new ResourceChangeHandler();
|
||||||
fDescriptorManager.startup();
|
|
||||||
|
ResourcesPlugin.getWorkspace().addResourceChangeListener(
|
||||||
|
fRcChangeHandler,
|
||||||
|
IResourceChangeEvent.POST_CHANGE
|
||||||
|
| IResourceChangeEvent.PRE_DELETE
|
||||||
|
| IResourceChangeEvent.PRE_CLOSE
|
||||||
|
/*| IResourceChangeEvent.POST_BUILD*/);
|
||||||
|
|
||||||
|
if(fDescriptorManager == null){
|
||||||
|
fDescriptorManager = CConfigBasedDescriptorManager.getInstance();
|
||||||
|
fDescriptorManager.startup();
|
||||||
|
}
|
||||||
|
|
||||||
|
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
|
||||||
|
Job rcJob = new Job(CoreModelMessages.getFormattedString("CProjectDescriptionManager.startRcChangeHandling")){ //$NON-NLS-1$
|
||||||
|
protected IStatus run(IProgressMonitor monitor) {
|
||||||
|
try{
|
||||||
|
startSaveParticipant();
|
||||||
|
} catch (CoreException e){
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
return e.getStatus();
|
||||||
|
}
|
||||||
|
return new Status(
|
||||||
|
IStatus.OK,
|
||||||
|
CCorePlugin.PLUGIN_ID,
|
||||||
|
IStatus.OK,
|
||||||
|
new String(),
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
rcJob.setRule(root);
|
||||||
|
rcJob.setPriority(Job.INTERACTIVE);
|
||||||
|
rcJob.setSystem(true);
|
||||||
|
rcJob.schedule();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This method adds a save participant and resource change listener
|
||||||
|
* Throws CoreException if the methods fails to add a save participant.
|
||||||
|
* The resource change listener in not added in this case either.
|
||||||
|
*/
|
||||||
|
private void startSaveParticipant() throws CoreException{
|
||||||
|
// Set up a listener for resource change events
|
||||||
|
ISavedState lastState =
|
||||||
|
ResourcesPlugin.getWorkspace().addSaveParticipant(CCorePlugin.getDefault(), fRcChangeHandler);
|
||||||
|
|
||||||
|
if (lastState != null) {
|
||||||
|
lastState.processResourceChangeEvents(fRcChangeHandler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,6 +312,10 @@ public class CProjectDescriptionManager {
|
||||||
if(fDescriptorManager != null){
|
if(fDescriptorManager != null){
|
||||||
fDescriptorManager.shutdown();
|
fDescriptorManager.shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(fRcChangeHandler != null){
|
||||||
|
ResourcesPlugin.getWorkspace().removeResourceChangeListener(fRcChangeHandler);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ICProjectDescription getDescriptionLoadding(IProject project){
|
private ICProjectDescription getDescriptionLoadding(IProject project){
|
||||||
|
@ -281,6 +346,10 @@ public class CProjectDescriptionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICProjectDescription getProjectDescription(IProject project, boolean write){
|
public ICProjectDescription getProjectDescription(IProject project, boolean write){
|
||||||
|
return getProjectDescription(project, true, write);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICProjectDescription getProjectDescription(IProject project, boolean load, boolean write){
|
||||||
ICProjectDescription des = null;
|
ICProjectDescription des = null;
|
||||||
des = getLoaddedDescription(project);
|
des = getLoaddedDescription(project);
|
||||||
IProjectDescription eDes = null;
|
IProjectDescription eDes = null;
|
||||||
|
@ -288,7 +357,7 @@ public class CProjectDescriptionManager {
|
||||||
if(des == null)
|
if(des == null)
|
||||||
des = getDescriptionLoadding(project);
|
des = getDescriptionLoadding(project);
|
||||||
|
|
||||||
if(des == null){
|
if(des == null && load && project.isOpen()){
|
||||||
try {
|
try {
|
||||||
des = loadProjectDescription(project);
|
des = loadProjectDescription(project);
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
|
@ -461,8 +530,8 @@ public class CProjectDescriptionManager {
|
||||||
runWspModification(r, monitor);
|
runWspModification(r, monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runWspModification(final ISafeRunnable runnable, IProgressMonitor monitor){
|
public void runWspModification(final ISafeRunnable runnable, IProgressMonitor monitor){
|
||||||
IWorkspace wsp = ResourcesPlugin.getWorkspace();
|
final IWorkspace wsp = ResourcesPlugin.getWorkspace();
|
||||||
boolean scheduleRule = true;
|
boolean scheduleRule = true;
|
||||||
if(!wsp.isTreeLocked()) {
|
if(!wsp.isTreeLocked()) {
|
||||||
ISchedulingRule rule = wsp.getRoot();
|
ISchedulingRule rule = wsp.getRoot();
|
||||||
|
@ -470,11 +539,10 @@ public class CProjectDescriptionManager {
|
||||||
try{
|
try{
|
||||||
mngr.beginRule(rule, monitor);
|
mngr.beginRule(rule, monitor);
|
||||||
scheduleRule = false;
|
scheduleRule = false;
|
||||||
try {
|
|
||||||
runnable.run();
|
runAtomic(runnable);
|
||||||
} catch (Exception e){
|
} catch (CoreException e) {
|
||||||
runnable.handleException(e);
|
CCorePlugin.log(e);
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
} finally {
|
} finally {
|
||||||
mngr.endRule(rule);
|
mngr.endRule(rule);
|
||||||
|
@ -482,12 +550,13 @@ public class CProjectDescriptionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(scheduleRule){
|
if(scheduleRule){
|
||||||
Job job = new Job("info serialization"){
|
Job job = new Job(CoreModelMessages.getFormattedString("CProjectDescriptionManager.serializing")){ //$NON-NLS-1$
|
||||||
protected IStatus run(IProgressMonitor monitor) {
|
protected IStatus run(IProgressMonitor monitor) {
|
||||||
try {
|
try {
|
||||||
runnable.run();
|
runAtomic(runnable);
|
||||||
} catch (Exception e) {
|
} catch (CoreException e) {
|
||||||
runnable.handleException(e);
|
CCorePlugin.log(e);
|
||||||
|
return e.getStatus();
|
||||||
}
|
}
|
||||||
return Status.OK_STATUS;
|
return Status.OK_STATUS;
|
||||||
}
|
}
|
||||||
|
@ -499,6 +568,35 @@ public class CProjectDescriptionManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void runAtomic(final ISafeRunnable r) throws CoreException{
|
||||||
|
IWorkspace wsp = ResourcesPlugin.getWorkspace();
|
||||||
|
|
||||||
|
try {
|
||||||
|
wsp.run(new IWorkspaceRunnable(){
|
||||||
|
|
||||||
|
public void run(IProgressMonitor monitor) throws CoreException {
|
||||||
|
try {
|
||||||
|
r.run();
|
||||||
|
} catch (Exception e){
|
||||||
|
throw new CoreException(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, e.getMessage(), e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, wsp.getRoot(), IWorkspace.AVOID_UPDATE, new NullProgressMonitor());
|
||||||
|
} catch (CoreException e){
|
||||||
|
IStatus status = e.getStatus();
|
||||||
|
if(CCorePlugin.PLUGIN_ID.equals(status.getPlugin())){
|
||||||
|
Throwable t = status.getException();
|
||||||
|
if(t instanceof Exception){
|
||||||
|
r.handleException((Exception)t);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private ICProjectConverter getConverter(IProject project, String oldOwnerId, ICProjectDescription des){
|
private ICProjectConverter getConverter(IProject project, String oldOwnerId, ICProjectDescription des){
|
||||||
CProjectConverterDesciptor[] converterDess = getConverterDescriptors();
|
CProjectConverterDesciptor[] converterDess = getConverterDescriptors();
|
||||||
ICProjectConverter converter = null;
|
ICProjectConverter converter = null;
|
||||||
|
@ -546,90 +644,105 @@ public class CProjectDescriptionManager {
|
||||||
return des;
|
return des;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ICProjectDescription getLoaddedDescription(IProject project){
|
public synchronized ICProjectDescription getLoaddedDescription(IProject project){
|
||||||
try {
|
CProjectDescription des = (CProjectDescription)fDescriptionMap.get(project);
|
||||||
ProjectInfoHolder holder = getInfoHolder(project);
|
if(des != null)
|
||||||
if(holder != null)
|
des.updateProject(project);
|
||||||
return holder.fDescription;
|
|
||||||
} catch (CoreException e) {
|
return des;
|
||||||
}
|
//// try {
|
||||||
return null;
|
// ProjectInfoHolder holder = getInfoHolder(project);
|
||||||
|
// if(holder != null){
|
||||||
|
// CProjectDescription des = holder.fDescription;
|
||||||
|
// if(des != null)
|
||||||
|
// des.updateProject(project);
|
||||||
|
// return des;
|
||||||
|
// }
|
||||||
|
//// } catch (CoreException e) {
|
||||||
|
//// }
|
||||||
|
// return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ProjectInfoHolder getInfoHolder(final IProject project) throws CoreException{
|
// synchronized private ProjectInfoHolder getInfoHolder(final IProject project){
|
||||||
return (ProjectInfoHolder)project.getSessionProperty(PROJECT_DESCRCIPTION_PROPERTY);
|
// return (ProjectInfoHolder)fProjectInfoMap.get(project);
|
||||||
}
|
//// return (ProjectInfoHolder)project.getSessionProperty(PROJECT_DESCRCIPTION_PROPERTY);
|
||||||
|
// }
|
||||||
|
|
||||||
public synchronized ScannerInfoProviderProxy getScannerInfoProviderProxy(IProject project){
|
public synchronized ScannerInfoProviderProxy getScannerInfoProviderProxy(IProject project){
|
||||||
ProjectInfoHolder holder = null;
|
ICProjectDescription des = getProjectDescription(project, false);
|
||||||
try {
|
if(des == null){
|
||||||
holder = getInfoHolder(project);
|
return new ScannerInfoProviderProxy(project);
|
||||||
} catch (CoreException e) {
|
|
||||||
holder = new ProjectInfoHolder();
|
|
||||||
}
|
|
||||||
boolean needSet = false;
|
|
||||||
if(holder == null){
|
|
||||||
holder = new ProjectInfoHolder();
|
|
||||||
needSet = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ScannerInfoProviderProxy provider = holder.fSIProvider;
|
ScannerInfoProviderProxy provider = (ScannerInfoProviderProxy)des.getSessionProperty(SCANNER_INFO_PROVIDER_PROPERTY);
|
||||||
if(provider == null){
|
if(provider == null){
|
||||||
provider = new ScannerInfoProviderProxy(project);
|
provider = new ScannerInfoProviderProxy(project);
|
||||||
holder.fSIProvider = provider;
|
des.setSessionProperty(SCANNER_INFO_PROVIDER_PROPERTY, provider);
|
||||||
|
} else {
|
||||||
|
provider.updateProject(project);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(needSet)
|
|
||||||
setInfoHolder(project, holder);
|
|
||||||
|
|
||||||
return provider;
|
return provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setInfoHolder(final IProject project, final ProjectInfoHolder holder){
|
// synchronized void setInfoHolder(final IProject project, final ProjectInfoHolder holder){
|
||||||
try {
|
// if(holder != null)
|
||||||
project.setSessionProperty(PROJECT_DESCRCIPTION_PROPERTY, holder);
|
// fProjectInfoMap.put(project, holder);
|
||||||
} catch (CoreException e){
|
// else
|
||||||
CCorePlugin.log(e);
|
// fProjectInfoMap.remove(project);
|
||||||
//TODO: externalize
|
//// try {
|
||||||
final ProjectInfoHolder f = holder;
|
//// project.setSessionProperty(PROJECT_DESCRCIPTION_PROPERTY, holder);
|
||||||
Job setDesJob = new Job("Set loadded description job"){ //$NON-NLS-1$
|
//// } catch (CoreException e){
|
||||||
protected IStatus run(IProgressMonitor monitor){
|
//// CCorePlugin.log(e);
|
||||||
try {
|
//// //TODO: externalize
|
||||||
project.setSessionProperty(PROJECT_DESCRCIPTION_PROPERTY, f);
|
//// final ProjectInfoHolder f = holder;
|
||||||
} catch (CoreException e) {
|
//// Job setDesJob = new Job("Set loadded description job"){ //$NON-NLS-1$
|
||||||
return e.getStatus();
|
//// protected IStatus run(IProgressMonitor monitor){
|
||||||
}
|
//// try {
|
||||||
return Status.OK_STATUS;
|
//// project.setSessionProperty(PROJECT_DESCRCIPTION_PROPERTY, f);
|
||||||
}
|
//// } catch (CoreException e) {
|
||||||
};
|
//// return e.getStatus();
|
||||||
|
//// }
|
||||||
setDesJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
|
//// return Status.OK_STATUS;
|
||||||
setDesJob.setPriority(Job.INTERACTIVE);
|
//// }
|
||||||
setDesJob.setSystem(true);
|
//// };
|
||||||
setDesJob.schedule();
|
////
|
||||||
}
|
//// setDesJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
|
||||||
}
|
//// setDesJob.setPriority(Job.INTERACTIVE);
|
||||||
|
//// setDesJob.setSystem(true);
|
||||||
|
//// setDesJob.schedule();
|
||||||
|
//// }
|
||||||
|
// }
|
||||||
|
|
||||||
synchronized boolean setLoaddedDescription(final IProject project, ICProjectDescription des, boolean overwriteIfExists){
|
synchronized boolean setLoaddedDescription(final IProject project, ICProjectDescription des, boolean overwriteIfExists){
|
||||||
try {
|
if(!overwriteIfExists && fDescriptionMap.get(project) != null)
|
||||||
ProjectInfoHolder holder = getInfoHolder(project);
|
return false;
|
||||||
boolean needSet = false;
|
|
||||||
if(holder == null){
|
if(des != null)
|
||||||
holder = new ProjectInfoHolder();
|
fDescriptionMap.put(project, des);
|
||||||
needSet = true;
|
else
|
||||||
}
|
fDescriptionMap.remove(project);
|
||||||
|
|
||||||
boolean shouldOverwrite = overwriteIfExists || holder.fDescription == null;
|
return true;
|
||||||
if(shouldOverwrite){
|
//// try {
|
||||||
holder.fDescription = des;
|
// ProjectInfoHolder holder = getInfoHolder(project);
|
||||||
if(needSet){
|
// boolean needSet = false;
|
||||||
setInfoHolder(project, holder);
|
// if(holder == null){
|
||||||
}
|
// holder = new ProjectInfoHolder();
|
||||||
}
|
// needSet = true;
|
||||||
return shouldOverwrite;
|
// }
|
||||||
} catch (CoreException e) {
|
//
|
||||||
}
|
// boolean shouldOverwrite = overwriteIfExists || holder.fDescription == null;
|
||||||
return false;
|
// if(shouldOverwrite){
|
||||||
|
// holder.fDescription = (CProjectDescription)des;
|
||||||
|
// if(needSet){
|
||||||
|
// setInfoHolder(project, holder);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return shouldOverwrite;
|
||||||
|
//// } catch (CoreException e) {
|
||||||
|
//// }
|
||||||
|
//// return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ICProjectDescription loadProjectDescription(IProject project) throws CoreException{
|
private ICProjectDescription loadProjectDescription(IProject project) throws CoreException{
|
||||||
|
@ -1989,13 +2102,6 @@ public class CProjectDescriptionManager {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean compare(Object o1, Object o2){
|
|
||||||
if(o1 != null)
|
|
||||||
return o1.equals(o2);
|
|
||||||
return o2 == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* public boolean entriesEqual(ICLanguageSettingEntry entries1[], ICLanguageSettingEntry entries2[]){
|
/* public boolean entriesEqual(ICLanguageSettingEntry entries1[], ICLanguageSettingEntry entries2[]){
|
||||||
if(entries1.length != entries2.length)
|
if(entries1.length != entries2.length)
|
||||||
return false;
|
return false;
|
||||||
|
@ -2723,5 +2829,4 @@ public class CProjectDescriptionManager {
|
||||||
|
|
||||||
return data != null && !PathEntryConfigurationDataProvider.isPathEntryData(data);
|
return data != null && !PathEntryConfigurationDataProvider.isPathEntryData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Intel Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Intel Corporation - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.core.settings.model;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
|
||||||
|
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
|
||||||
|
import org.eclipse.cdt.core.settings.model.ICResourceDescription;
|
||||||
|
import org.eclipse.cdt.core.settings.model.WriteAccessException;
|
||||||
|
import org.eclipse.cdt.core.settings.model.util.ResourceChangeHandlerBase;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IResourceChangeEvent;
|
||||||
|
import org.eclipse.core.resources.ISaveContext;
|
||||||
|
import org.eclipse.core.resources.ISaveParticipant;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.ISafeRunnable;
|
||||||
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
|
|
||||||
|
public class ResourceChangeHandler extends ResourceChangeHandlerBase implements ISaveParticipant {
|
||||||
|
CProjectDescriptionManager fMngr = CProjectDescriptionManager.getInstance();
|
||||||
|
|
||||||
|
private class RcMoveHandler implements IResourceMoveHandler {
|
||||||
|
Map fProjDesMap = new HashMap();
|
||||||
|
Set fRemovedProjSet = new HashSet();
|
||||||
|
|
||||||
|
public void handleProjectClose(IProject project) {
|
||||||
|
fMngr.setLoaddedDescription(project, null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean handleResourceMove(IResource fromRc, IResource toRc) {
|
||||||
|
boolean proceed = true;
|
||||||
|
IProject fromProject = fromRc.getProject();
|
||||||
|
IProject toProject = toRc.getProject();
|
||||||
|
switch(toRc.getType()){
|
||||||
|
case IResource.PROJECT:{
|
||||||
|
ICProjectDescription des = getProjectDescription(fromProject, false);
|
||||||
|
fRemovedProjSet.add(fromProject);
|
||||||
|
if(des != null){
|
||||||
|
((CProjectDescription)des).updateProject(toProject);
|
||||||
|
synchronized (fMngr) {
|
||||||
|
fMngr.setLoaddedDescription(fromProject, null, true);
|
||||||
|
fMngr.setLoaddedDescription(toProject, des, true);
|
||||||
|
}
|
||||||
|
fProjDesMap.put(toProject, des);
|
||||||
|
ICConfigurationDescription[] cfgs = des.getConfigurations();
|
||||||
|
for(int i = 0; i < cfgs.length; i++){
|
||||||
|
cfgs[i].getConfigurationData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IResource.FOLDER:
|
||||||
|
case IResource.FILE:{
|
||||||
|
IPath fromRcProjPath = fromRc.getProjectRelativePath();
|
||||||
|
IPath toRcProjPath = toRc.getProjectRelativePath();
|
||||||
|
if(toRcProjPath.equals(fromRcProjPath))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(!toProject.equals(fromProject))
|
||||||
|
break;
|
||||||
|
|
||||||
|
ICProjectDescription des = getProjectDescription(toProject, true);
|
||||||
|
if(des != null){
|
||||||
|
ICConfigurationDescription cfgDess[] = des.getConfigurations();
|
||||||
|
for(int i = 0; i < cfgDess.length; i++){
|
||||||
|
ICResourceDescription rcDescription = cfgDess[i].getResourceDescription(fromRcProjPath, true);
|
||||||
|
if(rcDescription != null){
|
||||||
|
try {
|
||||||
|
rcDescription.setPath(toRcProjPath);
|
||||||
|
} catch (WriteAccessException e) {
|
||||||
|
// } catch (CoreException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return proceed;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ICProjectDescription getProjectDescription(IResource rc, boolean load){
|
||||||
|
IProject project = rc.getProject();
|
||||||
|
ICProjectDescription des = (ICProjectDescription)fProjDesMap.get(project);
|
||||||
|
if(des == null){
|
||||||
|
des = fMngr.getProjectDescription(project, load, true);
|
||||||
|
fProjDesMap.put(project, des);
|
||||||
|
}
|
||||||
|
return des;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean handleResourceRemove(IResource rc) {
|
||||||
|
boolean proceed = true;
|
||||||
|
IProject project = rc.getProject();
|
||||||
|
switch(rc.getType()){
|
||||||
|
case IResource.PROJECT:
|
||||||
|
fMngr.setLoaddedDescription(project, null, true);
|
||||||
|
fRemovedProjSet.add(project);
|
||||||
|
proceed = false;
|
||||||
|
break;
|
||||||
|
case IResource.FOLDER:
|
||||||
|
case IResource.FILE:
|
||||||
|
if(project.exists()){
|
||||||
|
ICProjectDescription des = getProjectDescription(project, true);
|
||||||
|
if(des != null){
|
||||||
|
IPath rcProjPath = rc.getProjectRelativePath();
|
||||||
|
ICConfigurationDescription cfgDess[] = des.getConfigurations();
|
||||||
|
for(int i = 0; i < cfgDess.length; i++){
|
||||||
|
ICResourceDescription rcDescription = cfgDess[i].getResourceDescription(rcProjPath, true);
|
||||||
|
if(rcDescription != null){
|
||||||
|
try {
|
||||||
|
cfgDess[i].removeResourceDescription(rcDescription);
|
||||||
|
} catch (WriteAccessException e) {
|
||||||
|
} catch (CoreException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return proceed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void done() {
|
||||||
|
for(Iterator iter = fProjDesMap.entrySet().iterator(); iter.hasNext();){
|
||||||
|
Map.Entry entry = (Map.Entry)iter.next();
|
||||||
|
if(fRemovedProjSet.contains(entry.getKey())){
|
||||||
|
iter.remove();
|
||||||
|
} else {
|
||||||
|
ICProjectDescription des = (ICProjectDescription)entry.getValue();
|
||||||
|
if(des == null || !des.isModified())
|
||||||
|
iter.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fProjDesMap.size() != 0){
|
||||||
|
fMngr.runWspModification(new ISafeRunnable(){
|
||||||
|
|
||||||
|
public void handleException(Throwable exception) {
|
||||||
|
CCorePlugin.log(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() throws Exception {
|
||||||
|
for(Iterator iter = fProjDesMap.entrySet().iterator(); iter.hasNext();){
|
||||||
|
Map.Entry entry = (Map.Entry)iter.next();
|
||||||
|
IProject project = (IProject)entry.getKey();
|
||||||
|
ICProjectDescription des = (ICProjectDescription)entry.getValue();
|
||||||
|
|
||||||
|
try {
|
||||||
|
fMngr.setProjectDescription(project, des);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, new NullProgressMonitor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected IResourceMoveHandler createResourceMoveHandler(
|
||||||
|
IResourceChangeEvent event) {
|
||||||
|
return new RcMoveHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I S a v e P a r t i c i p a n t
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.resources.ISaveParticipant#saving(org.eclipse.core.resources.ISaveContext)
|
||||||
|
*/
|
||||||
|
public void saving(ISaveContext context) throws CoreException {
|
||||||
|
//Request a resource delta to be used on next activation.
|
||||||
|
context.needDelta();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.resources.ISaveParticipant#doneSaving(org.eclipse.core.resources.ISaveContext)
|
||||||
|
*/
|
||||||
|
public void doneSaving(ISaveContext context) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.resources.ISaveParticipant#prepareToSave(org.eclipse.core.resources.ISaveContext)
|
||||||
|
*/
|
||||||
|
public void prepareToSave(ISaveContext context) throws CoreException {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.resources.ISaveParticipant#rollback(org.eclipse.core.resources.ISaveContext)
|
||||||
|
*/
|
||||||
|
public void rollback(ISaveContext context) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue