diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionBasicTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionBasicTests.java
index db73e98882c..2b5ff5b2807 100644
--- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionBasicTests.java
+++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionBasicTests.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007 Intel Corporation and others.
+ * Copyright (c) 2007, 2010 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
@@ -127,6 +127,28 @@ public class CProjectDescriptionBasicTests extends BaseTestCase{
}
+ public void testCreateProjectDescriptionInvalidProject() throws Exception {
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("someProject");
+ assertTrue(!project.isAccessible());
+
+ ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager();
+ boolean exception = false;
+ try {
+ mngr.createProjectDescription(null, false, true);
+ } catch (CoreException e) {
+ exception = true;
+ }
+ assertTrue(exception);
+
+ exception = false;
+ try {
+ mngr.createProjectDescription(project, false, true);
+ } catch (CoreException e) {
+ exception = true;
+ }
+ assertTrue(exception);
+ }
+
public void testSetInvalidCreatingDescription() throws Exception {
IWorkspace wsp = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = wsp.getRoot();
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICProjectDescriptionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICProjectDescriptionManager.java
index f8cb7401c6b..f4c7b09dc8d 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICProjectDescriptionManager.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICProjectDescriptionManager.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2008 Intel Corporation and others.
+ * Copyright (c) 2007, 2010 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
@@ -73,6 +73,7 @@ public interface ICProjectDescriptionManager {
* and returns a writable project description which is either empty or a copy of the previous configuration description
* if loadIfExists == true.
* @see #createProjectDescription(IProject, boolean, boolean)
+ * @throws CoreException if the Project doesn't exist, or the storage couldn't be found
*/
ICProjectDescription createProjectDescription(IProject project, boolean loadIfExists) throws CoreException;
@@ -89,7 +90,7 @@ public interface ICProjectDescriptionManager {
*
* NOTE: changes made to the returned project description will not be applied until the {@link #setProjectDescription(IProject, ICProjectDescription)} is called
* @return {@link ICProjectDescription}
- * @throws CoreException
+ * @throws CoreException if the Project doesn't exist, or the storage couldn't be found
*/
ICProjectDescription createProjectDescription(IProject project, boolean loadIfExists, boolean creating) throws CoreException;
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java
index def75c9452d..f2baa81284c 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java
@@ -390,19 +390,28 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
}
public ICProjectDescription getProjectDescription(IProject project, int flags) {
- AbstractCProjectDescriptionStorage storage = getProjectDescriptionStorage(project);
- if (storage != null) {
- try {
- return storage.getProjectDescription(flags, new NullProgressMonitor());
- } catch (CoreException e) {
- // FIXME Currently the resource change handler ResourceChangeHandler.getProjectDescription(...)
- // Does this when the project is closed. Don't log an error or the tests will fail
+ try {
+ return getProjectDescriptionInternal(project, flags);
+ } catch (CoreException e) {
+ // FIXME Currently the resource change handler ResourceChangeHandler.getProjectDescription(...)
+ // Does this when the project is closed. Don't log an error or the tests will fail
// CCorePlugin.log(e);
- }
}
return null;
}
+ /**
+ * Base method for getting a Project's Description
+ * @param project
+ * @param flags
+ * @return ICProjectDescription
+ * @throws CoreException if project description isn't available
+ */
+ private ICProjectDescription getProjectDescriptionInternal(IProject project, int flags) throws CoreException {
+ AbstractCProjectDescriptionStorage storage = getProjectDescriptionStorage(project);
+ return storage.getProjectDescription(flags, new NullProgressMonitor());
+ }
+
/**
* Run the workspace modification in the current thread using the workspace scheduling rule
* Equivalent to: runWspModification(IWorkspaceRunnable, ResourcecPlugin.getWorkspace().getRoot(), IProgressMonitor)
@@ -587,7 +596,7 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
flags |= loadIfExists ? 0 : ICProjectDescriptionManager.GET_EMPTY_PROJECT_DESCRIPTION;
flags |= creating ? ICProjectDescriptionManager.PROJECT_CREATING : 0;
- return getProjectDescription(project, flags);
+ return getProjectDescriptionInternal(project, flags);
}
public ScannerInfoProviderProxy getScannerInfoProviderProxy(IProject project){
@@ -816,8 +825,19 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return settingProjectDescription.get();
}
- private AbstractCProjectDescriptionStorage getProjectDescriptionStorage(IProject project) {
- return CProjectDescriptionStorageManager.getInstance().getProjectDescriptionStorage(project);
+ /**
+ * Base for getting a project desc's storage. project must be accessible.
+ * @param project
+ * @return ProjectDescription storage
+ * @throws CoreException if Project isn't accessible
+ */
+ private AbstractCProjectDescriptionStorage getProjectDescriptionStorage(IProject project) throws CoreException {
+ if (project == null || !project.isAccessible())
+ throw ExceptionFactory.createCoreException(MessageFormat.format(CCorePlugin.getResourceString("ProjectDescription.ProjectNotAccessible"), new Object[] {project != null ? project.getName() : ""})); //$NON-NLS-1$ //$NON-NLS-2$
+ AbstractCProjectDescriptionStorage storage = CProjectDescriptionStorageManager.getInstance().getProjectDescriptionStorage(project);
+ if (storage == null)
+ throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.FailedToGetStorage") + project.getName()); //$NON-NLS-1$
+ return storage;
}
/**
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsModelMessages.properties b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsModelMessages.properties
index 01cdf7f8d6c..e10c8489b3a 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsModelMessages.properties
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsModelMessages.properties
@@ -31,13 +31,14 @@ CProjectDescriptionManager.9=invalid project file format
CProjectDescriptionManager.0=Initiating resource change handling..
CProjectDescriptionManager.10=invalid project file format
CProjectDescriptionManager.11=storage file not found
-CProjectDescriptionManager.12=Serialing CDT Project settings..
+CProjectDescriptionManager.12=Serializing CDT Project settings..
CProjectDescriptionManager.13=Refreshing the project settings
CProjectDescriptionManager.14=workspace info element does not exist
CProjectDescriptionManager.15=Preference Configuration
CProjectDescriptionManager.16=attempt to set description for the non-openned project
CProjectDescriptionManager.17=unable to apply the invalid project description for project
CProjectDescriptionManager.cfgIDAlreadyExists=Configuration with ID: {0} already exists in passed in settings storage
+CProjectDescriptionManager.FailedToGetStorage=Failed to get storage for project:
CProjectDescriptionManager.illegalDeltaKind=Illegal delta kind
CProjectDescriptionManager.wrongTypeOfResourceDescription=Wrong type of resource description:
CFolderDescription.0=data was not created