validateNatureSet now reports all problems with the set
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java index 3ed22d8..9dcf925 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java
@@ -491,6 +491,8 @@ int count = natureIds.length; if (count == 0) return ResourceStatus.OK_STATUS; + String msg = Policy.bind("natures.invalidSet"); + MultiStatus result = new MultiStatus(ResourcesPlugin.PI_RESOURCES, IResourceStatus.INVALID_NATURE_SET, msg, null); //set of the nature ids being validated (String (id)) HashSet natures = new HashSet(count * 2); @@ -499,27 +501,31 @@ for (int i = 0; i < count; i++) { String id = natureIds[i]; ProjectNatureDescriptor desc = (ProjectNatureDescriptor)getNatureDescriptor(id); - if (desc == null) - return failure(Policy.bind("natures.missingNature", id)); + if (desc == null) { + result.add(failure(Policy.bind("natures.missingNature", id))); + continue; + } if (desc.hasCycle) - return failure(Policy.bind("natures.hasCycle", id)); + result.add(failure(Policy.bind("natures.hasCycle", id))); if (!natures.add(id)) - return failure(Policy.bind("natures.duplicateNature", id)); + result.add(failure(Policy.bind("natures.duplicateNature", id))); //validate nature set one-of constraint String[] setIds = desc.getNatureSetIds(); for (int j = 0; j < setIds.length; j++) { if (!sets.add(setIds[j])) - return failure(Policy.bind("natures.multipleSetMembers", setIds[j])); + result.add(failure(Policy.bind("natures.multipleSetMembers", setIds[j]))); } } //now walk over the set and ensure all pre-requisite natures are present for (int i = 0; i < count; i++) { IProjectNatureDescriptor desc = getNatureDescriptor(natureIds[i]); + if (desc == null) + continue; String[] required = desc.getRequiredNatureIds(); for (int j = 0; j < required.length; j++) if (!natures.contains(required[j])) - return failure(Policy.bind("natures.missingPrerequisite", natureIds[i], required[j])); + result.add(failure(Policy.bind("natures.missingPrerequisite", natureIds[i], required[j]))); } - return ResourceStatus.OK_STATUS; + return result; } }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/messages.properties b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/messages.properties index 08dc8fc..6a99228 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/messages.properties +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/messages.properties Binary files differ