Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMickael Istria2017-11-06 15:57:23 +0000
committerMickael Istria2017-11-10 15:45:32 +0000
commit1044120af43f20f81f1153298dd71eb16701f106 (patch)
tree85ca22ded6a4119fd40a2f554882a9c84547042c
parente05cc9f9f98d0ccafa822d604c6a0b9a34f991ed (diff)
downloadeclipse.platform.resources-1044120af43f20f81f1153298dd71eb16701f106.tar.gz
eclipse.platform.resources-1044120af43f20f81f1153298dd71eb16701f106.tar.xz
eclipse.platform.resources-1044120af43f20f81f1153298dd71eb16701f106.zip
Change-Id: Ib48a3f17c4f277a96c388f56885ad7cc680267fb Signed-off-by: Mickael Istria <mistria@redhat.com>
-rw-r--r--bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CheckMissingNaturesListener.java63
-rw-r--r--bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PreferenceInitializer.java4
-rw-r--r--tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java39
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));
}

Back to the top