diff options
| author | Mickael Istria | 2017-11-06 15:57:23 +0000 |
|---|---|---|
| committer | Mickael Istria | 2017-11-10 15:45:32 +0000 |
| commit | 1044120af43f20f81f1153298dd71eb16701f106 (patch) | |
| tree | 85ca22ded6a4119fd40a2f554882a9c84547042c | |
| parent | e05cc9f9f98d0ccafa822d604c6a0b9a34f991ed (diff) | |
| download | eclipse.platform.resources-1044120af43f20f81f1153298dd71eb16701f106.tar.gz eclipse.platform.resources-1044120af43f20f81f1153298dd71eb16701f106.tar.xz eclipse.platform.resources-1044120af43f20f81f1153298dd71eb16701f106.zip | |
Bug 526820 - Polish: Warning for unknown nature referenced by projectI20171122-2000I20171121-2000I20171121-0020I20171120-2225I20171120-2000I20171119-2000I20171118-1500I20171117-2000I20171116-2000I20171115-2000I20171115-0115I20171115-0025I20171114-2000I20171113-2000I20171112-2000I20171111-1500I20171111-0410I20171111-0155I20171110-2000
Change-Id: Ib48a3f17c4f277a96c388f56885ad7cc680267fb
Signed-off-by: Mickael Istria <mistria@redhat.com>
3 files changed, 94 insertions, 12 deletions
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CheckMissingNaturesListener.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CheckMissingNaturesListener.java index 603ea60ae..d507c023e 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CheckMissingNaturesListener.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CheckMissingNaturesListener.java @@ -10,7 +10,11 @@ *******************************************************************************/ package org.eclipse.core.internal.resources; +import java.io.*; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.eclipse.core.internal.utils.FileUtil; import org.eclipse.core.internal.utils.Messages; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; @@ -145,7 +149,7 @@ public class CheckMissingNaturesListener implements IResourceChangeListener, IPr } final Set<IMarker> toRemove = new HashSet<>(); - for (IMarker existingMarker : getRelatedMarkers(project)) { + for (IMarker existingMarker : getRelatedProjectMarkers(project)) { String markerNature = existingMarker.getAttribute(NATURE_ID_ATTRIBUTE, ""); //$NON-NLS-1$ if (!missingNatures.contains(markerNature)) { toRemove.add(existingMarker); @@ -162,11 +166,18 @@ public class CheckMissingNaturesListener implements IResourceChangeListener, IPr for (IMarker marker : toRemove) { marker.delete(); } + IResource targetResource = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME); + if (!targetResource.isAccessible()) { + targetResource = project; + } for (String natureId : missingNatures) { - IMarker marker = project.createMarker(MARKER_TYPE); + IMarker marker = targetResource.createMarker(MARKER_TYPE); marker.setAttribute(IMarker.SEVERITY, getMissingNatureSeverity(project)); marker.setAttribute(IMarker.MESSAGE, NLS.bind(Messages.natures_missingNature, natureId)); marker.setAttribute(NATURE_ID_ATTRIBUTE, natureId); + if (targetResource.getType() == IResource.FILE) { + updateRange(marker, natureId, (IFile) targetResource); + } } return Status.OK_STATUS; } @@ -188,12 +199,54 @@ public class CheckMissingNaturesListener implements IResourceChangeListener, IPr } } - protected Collection<IMarker> getRelatedMarkers(IContainer workspaceRootOrProject) { - if (!workspaceRootOrProject.isAccessible()) { + protected void updateRange(IMarker marker, String natureId, IFile file) { + if (!file.isAccessible()) { + return; + } + Pattern pattern = Pattern.compile(".*<" + IModelObjectConstants.NATURE + ">\\s*(" + natureId.replace(".", "\\.") + ")\\s*</" + IModelObjectConstants.NATURE + ">.*", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ + Pattern.DOTALL); + try (InputStream input = file.getContents(); ByteArrayOutputStream output = new ByteArrayOutputStream();) { + FileUtil.transferStreams(input, output, file.getLocation().toString(), new NullProgressMonitor()); + String content = output.toString(); + Matcher matcher = pattern.matcher(content); + if (matcher.matches() && matcher.groupCount() > 0) { + marker.setAttribute(IMarker.CHAR_START, matcher.start(1)); + marker.setAttribute(IMarker.CHAR_END, matcher.end(1) - 1); + } + } catch (IOException e) { + ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, e.getMessage(), e)); + } catch (CoreException e) { + ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, e.getMessage(), e)); + } + } + + protected Collection<IMarker> getRelatedMarkers(IContainer rootOrProject) { + switch (rootOrProject.getType()) { + case IResource.ROOT : + return getRelatedRootMarkers((IWorkspaceRoot) rootOrProject); + case IResource.PROJECT : + return getRelatedProjectMarkers((IProject) rootOrProject); + } + return Collections.emptyList(); + } + + protected Collection<IMarker> getRelatedRootMarkers(IWorkspaceRoot root) { + if (!root.isAccessible()) { + return Collections.emptyList(); + } + Set<IMarker> res = new HashSet<>(); + for (IProject project : root.getProjects()) { + res.addAll(getRelatedProjectMarkers(project)); + } + return res; + } + + protected Collection<IMarker> getRelatedProjectMarkers(IProject project) { + if (!project.isAccessible()) { return Collections.emptyList(); } try { - return Arrays.asList(workspaceRootOrProject.findMarkers(MARKER_TYPE, true, workspaceRootOrProject.getType() == IResource.ROOT ? IResource.DEPTH_ONE : IResource.DEPTH_ZERO)); + return Arrays.asList(project.findMarkers(MARKER_TYPE, true, IResource.DEPTH_ONE)); } catch (CoreException e) { ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, e.getMessage(), e)); return Collections.emptyList(); diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PreferenceInitializer.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PreferenceInitializer.java index 8cd0510b5..5521deaab 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PreferenceInitializer.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PreferenceInitializer.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.eclipse.core.internal.resources; +import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.preferences.*; @@ -41,11 +42,10 @@ public class PreferenceInitializer extends AbstractPreferenceInitializer { public static final long PREF_DELTA_EXPIRATION_DEFAULT = 30 * 24 * 3600 * 1000l; // 30 days /** * Default setting for {@value ResourcesPlugin#PREF_MISSING_NATURE_MARKER_SEVERITY}. - * Currently -1/ignore, but very likely to change. * * @since 3.12 */ - public static final int PREF_MISSING_NATURE_MARKER_SEVERITY_DEFAULT = -1; + public static final int PREF_MISSING_NATURE_MARKER_SEVERITY_DEFAULT = IMarker.SEVERITY_WARNING; public PreferenceInitializer() { super(); diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java index e7f99b2d1..8ea9f9d13 100644 --- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java +++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java @@ -433,10 +433,39 @@ public class NatureTest extends ResourceTest { project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); project.build(IncrementalProjectBuilder.FULL_BUILD, getMonitor()); Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor()); - IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO); + IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE); Assert.assertEquals(1, markers.length); IMarker marker = markers[0]; Assert.assertEquals(NATURE_MISSING, marker.getAttribute("natureId")); + Assert.assertNotEquals(-42, marker.getAttribute(IMarker.CHAR_START, -42)); + Assert.assertNotEquals(-42, marker.getAttribute(IMarker.CHAR_END, -42)); + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); InputStream input = ((IFile) marker.getResource()).getContents()) { + FileUtil.transferStreams(input, bos, "whatever", getMonitor()); + String marked = bos.toString().substring(marker.getAttribute(IMarker.CHAR_START, -42), marker.getAttribute(IMarker.CHAR_END, -42) + 1); + Assert.assertEquals(NATURE_MISSING, marked); + } + } + + public void testMissingNatureWithWhitespacesSetChars() throws Exception { + ensureExistsInWorkspace(project, true); + InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putInt(ResourcesPlugin.PREF_MISSING_NATURE_MARKER_SEVERITY, IMarker.SEVERITY_WARNING); + InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).flush(); + IFile dotProjectFile = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME); + dotProjectFile.setContents(new ByteArrayInputStream(("<projectDescription><name>" + project.getName() + "</name><natures><nature> " + NATURE_MISSING + " </nature></natures></projectDescription>").getBytes()), false, false, getMonitor()); + project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); + project.build(IncrementalProjectBuilder.FULL_BUILD, getMonitor()); + Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor()); + IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE); + Assert.assertEquals(1, markers.length); + IMarker marker = markers[0]; + Assert.assertEquals(NATURE_MISSING, marker.getAttribute("natureId")); + Assert.assertNotEquals(-42, marker.getAttribute(IMarker.CHAR_START, -42)); + Assert.assertNotEquals(-42, marker.getAttribute(IMarker.CHAR_END, -42)); + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); InputStream input = ((IFile) marker.getResource()).getContents()) { + FileUtil.transferStreams(input, bos, "whatever", getMonitor()); + String marked = bos.toString().substring(marker.getAttribute(IMarker.CHAR_START, -42), marker.getAttribute(IMarker.CHAR_END, -42) + 1); + Assert.assertEquals(NATURE_MISSING, marked); + } } public void testKnownNatureDoesntAddMarker() throws Exception { @@ -449,7 +478,7 @@ public class NatureTest extends ResourceTest { project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); project.build(IncrementalProjectBuilder.FULL_BUILD, getMonitor()); Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor()); - Assert.assertEquals(0, project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO).length); + Assert.assertEquals(0, project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE).length); } public void testListenToPreferenceChange() throws Exception { @@ -458,20 +487,20 @@ public class NatureTest extends ResourceTest { InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putInt(ResourcesPlugin.PREF_MISSING_NATURE_MARKER_SEVERITY, IMarker.SEVERITY_INFO); InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).flush(); Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor()); - IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO); + IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE); Assert.assertEquals(1, markers.length); Assert.assertEquals(IMarker.SEVERITY_INFO, markers[0].getAttribute(IMarker.SEVERITY, -42)); // to IGNORE InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putInt(ResourcesPlugin.PREF_MISSING_NATURE_MARKER_SEVERITY, -1); InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).flush(); Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor()); - markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO); + markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE); Assert.assertEquals(0, markers.length); // to ERROR InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putInt(ResourcesPlugin.PREF_MISSING_NATURE_MARKER_SEVERITY, IMarker.SEVERITY_ERROR); InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).flush(); Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor()); - markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO); + markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE); Assert.assertEquals(1, markers.length); Assert.assertEquals(IMarker.SEVERITY_ERROR, markers[0].getAttribute(IMarker.SEVERITY, -42)); } |
