Loading plugins/org.eclipse.sphinx.emf.validation/src/org/eclipse/sphinx/emf/validation/markers/ValidationMarkerManager.java +39 −31 Original line number Diff line number Diff line Loading @@ -63,6 +63,8 @@ import org.eclipse.sphinx.platform.util.PlatformLogUtil; */ public class ValidationMarkerManager { private static final String URI_FRAGMENT_PARTS_SEPARATOR = "/"; //$NON-NLS-1$ /** * The singleton instance */ Loading Loading @@ -475,38 +477,11 @@ public class ValidationMarkerManager { if (tmp != null && tmp.length > 0) { markerURI = tmp[0]; markerEObjType = tmp.length > 1 ? tmp[1] : null; Integer hash = (Integer) marker.getAttribute(IValidationMarker.HASH_ATTRIBUTE); switch (depth) { case EObjectUtil.DEPTH_ZERO: // FIXME Remove hash code comparison by ResourceSetListener that deletes associated problem // markers when model file gets deleted or reloaded (see ResourceProblemHandler for details) if (URI.createURI(markerURI).fragment().equals(URI.createURI(eObjURI).fragment()) && (markerEObjType == null || eObjType.equals(markerEObjType))) { result.add(marker); } break; case EObjectUtil.DEPTH_ONE: // same treatment, let's modify it later if necessary boolean shouldbeDeleted = true; shouldbeDeleted &= markerURI.contains(eObjURI); if (shouldbeDeleted) { String subPart = markerURI.substring(eObjURI.length()); shouldbeDeleted &= subPart.indexOf('/') == subPart.lastIndexOf('/'); } if (shouldbeDeleted) { boolean showMarker = showMarker(eObjURI, markerURI, eObjType, markerEObjType, depth); if (showMarker) { result.add(marker); } break; case EObjectUtil.DEPTH_INFINITE: if (markerURI.equals(eObjURI) || markerURI.contains(eObjURI + "/")) { //$NON-NLS-1$ result.add(marker); } break; default: // Something is rotten in my kingdom, do nothing break; } } } else { String msg = NLS.bind(Messages.warningNoSuchMarker, marker == null ? "???" : marker.getId()); //$NON-NLS-1$ Loading @@ -518,6 +493,39 @@ public class ValidationMarkerManager { } /** * Internal method, only public to allow testing */ public boolean showMarker(String selectedObjectUri, String markerUri, String selectedEObjectType, String markerEObjType, int depth) { if (depth == EObjectUtil.DEPTH_ZERO) { return markerUri.equals(selectedObjectUri) && (markerEObjType == null || selectedEObjectType.equals(markerEObjType)); } String selectedObjectUriFragment = URI.createURI(selectedObjectUri).fragment(); String markerUriFragment = URI.createURI(markerUri).fragment(); String[] elementUriFragmentParts = selectedObjectUriFragment.split(URI_FRAGMENT_PARTS_SEPARATOR); String[] markerUriFragmentParts = markerUriFragment.split(URI_FRAGMENT_PARTS_SEPARATOR); int indexOfLastElementUriFragmentPart = elementUriFragmentParts.length - 1; // elementURI is prefix of markerURI boolean showMarker = markerUri.startsWith(selectedObjectUri) // last fragment part (String after last '/') has to be equal, // not just prefix of the other String // e.g. fragments "abc/xyz2" and "abc/xyz2/z" are not children of fragment "abc/xyz" && elementUriFragmentParts[indexOfLastElementUriFragmentPart].equals(markerUriFragmentParts[indexOfLastElementUriFragmentPart]); switch (depth) { case EObjectUtil.DEPTH_ONE: return showMarker && elementUriFragmentParts.length + 1 >= markerUriFragmentParts.length; case EObjectUtil.DEPTH_INFINITE: return showMarker && elementUriFragmentParts.length <= markerUriFragmentParts.length; default: return true; } } /** * check if an array of IMarker contains a marker with the status IStatus.ERROR * Loading tests/org.eclipse.sphinx.tests.emf.validation/src/org/eclipse/sphinx/emf/validation/markers/ValidationMarkerManagerUriComparisonTest.java 0 → 100644 +85 −0 Original line number Diff line number Diff line package org.eclipse.sphinx.emf.validation.markers; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; import org.eclipse.sphinx.emf.util.EObjectUtil; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @RunWith(Parameterized.class) public class ValidationMarkerManagerUriComparisonTest { private static final String SELECTED_ELEMENT_URI = "platform:/resource/validation-1/default.arxml#/ARRoot/Adc"; //$NON-NLS-1$ private String markerUri; private boolean showMarkerForDepthZero, showMarkerForDepthOne, showMarkerForDepthInfinite; private static ValidationMarkerManager markerManager; // EObjectUtil.DEPTH_ZERO, EObjectUtil.DEPTH_ONE, EObjectUtil.DEPTH_INFINITE @Parameterized.Parameters public static List<Object[]> markerUriTestData() { // | Marker URI | Show marker for DEPTH_ZERO | DEPTH_ONE | DEPTH_INFINITE | return Arrays.asList(new Object[][] { { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc", true, true, true }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc/AdcConfigSet", false, true, true }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc/AdcConfigSet/Abc", false, false, true }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc2", false, false, false }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc2/AdcConfigSet", false, false, false }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc2/AdcConfigSet/Abc", false, false, false } }); //$NON-NLS-1$ } public ValidationMarkerManagerUriComparisonTest(String markerUri, boolean showMarkerForDepthZero, boolean showMarkerForDepthOne, boolean showMarkerForDepthInfinite) { this.markerUri = markerUri; this.showMarkerForDepthZero = showMarkerForDepthZero; this.showMarkerForDepthOne = showMarkerForDepthOne; this.showMarkerForDepthInfinite = showMarkerForDepthInfinite; } @BeforeClass public static void setUpOnce() { markerManager = ValidationMarkerManager.getInstance(); } @Test public void checkMarkerCorrectlyFilteredForDepthZero() { int depth = EObjectUtil.DEPTH_ZERO; boolean showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", null, depth); //$NON-NLS-1$ assertThat(showMarker, is(showMarkerForDepthZero)); showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", "EObject", depth); //$NON-NLS-1$ //$NON-NLS-2$ assertThat(showMarker, is(showMarkerForDepthZero)); showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", "OtherType", depth); //$NON-NLS-1$ //$NON-NLS-2$ assertThat(showMarker, is(false)); } @Test public void checkMarkerCorrectlyFilteredForDepthOne() { int depth = EObjectUtil.DEPTH_ONE; boolean showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", null, depth); //$NON-NLS-1$ assertThat(showMarker, is(showMarkerForDepthOne)); } @Test public void checkMarkerCorrectlyFilteredForDepthInfinite() { int depth = EObjectUtil.DEPTH_INFINITE; boolean showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", null, depth); //$NON-NLS-1$ assertThat(showMarker, is(showMarkerForDepthInfinite)); } } Loading
plugins/org.eclipse.sphinx.emf.validation/src/org/eclipse/sphinx/emf/validation/markers/ValidationMarkerManager.java +39 −31 Original line number Diff line number Diff line Loading @@ -63,6 +63,8 @@ import org.eclipse.sphinx.platform.util.PlatformLogUtil; */ public class ValidationMarkerManager { private static final String URI_FRAGMENT_PARTS_SEPARATOR = "/"; //$NON-NLS-1$ /** * The singleton instance */ Loading Loading @@ -475,38 +477,11 @@ public class ValidationMarkerManager { if (tmp != null && tmp.length > 0) { markerURI = tmp[0]; markerEObjType = tmp.length > 1 ? tmp[1] : null; Integer hash = (Integer) marker.getAttribute(IValidationMarker.HASH_ATTRIBUTE); switch (depth) { case EObjectUtil.DEPTH_ZERO: // FIXME Remove hash code comparison by ResourceSetListener that deletes associated problem // markers when model file gets deleted or reloaded (see ResourceProblemHandler for details) if (URI.createURI(markerURI).fragment().equals(URI.createURI(eObjURI).fragment()) && (markerEObjType == null || eObjType.equals(markerEObjType))) { result.add(marker); } break; case EObjectUtil.DEPTH_ONE: // same treatment, let's modify it later if necessary boolean shouldbeDeleted = true; shouldbeDeleted &= markerURI.contains(eObjURI); if (shouldbeDeleted) { String subPart = markerURI.substring(eObjURI.length()); shouldbeDeleted &= subPart.indexOf('/') == subPart.lastIndexOf('/'); } if (shouldbeDeleted) { boolean showMarker = showMarker(eObjURI, markerURI, eObjType, markerEObjType, depth); if (showMarker) { result.add(marker); } break; case EObjectUtil.DEPTH_INFINITE: if (markerURI.equals(eObjURI) || markerURI.contains(eObjURI + "/")) { //$NON-NLS-1$ result.add(marker); } break; default: // Something is rotten in my kingdom, do nothing break; } } } else { String msg = NLS.bind(Messages.warningNoSuchMarker, marker == null ? "???" : marker.getId()); //$NON-NLS-1$ Loading @@ -518,6 +493,39 @@ public class ValidationMarkerManager { } /** * Internal method, only public to allow testing */ public boolean showMarker(String selectedObjectUri, String markerUri, String selectedEObjectType, String markerEObjType, int depth) { if (depth == EObjectUtil.DEPTH_ZERO) { return markerUri.equals(selectedObjectUri) && (markerEObjType == null || selectedEObjectType.equals(markerEObjType)); } String selectedObjectUriFragment = URI.createURI(selectedObjectUri).fragment(); String markerUriFragment = URI.createURI(markerUri).fragment(); String[] elementUriFragmentParts = selectedObjectUriFragment.split(URI_FRAGMENT_PARTS_SEPARATOR); String[] markerUriFragmentParts = markerUriFragment.split(URI_FRAGMENT_PARTS_SEPARATOR); int indexOfLastElementUriFragmentPart = elementUriFragmentParts.length - 1; // elementURI is prefix of markerURI boolean showMarker = markerUri.startsWith(selectedObjectUri) // last fragment part (String after last '/') has to be equal, // not just prefix of the other String // e.g. fragments "abc/xyz2" and "abc/xyz2/z" are not children of fragment "abc/xyz" && elementUriFragmentParts[indexOfLastElementUriFragmentPart].equals(markerUriFragmentParts[indexOfLastElementUriFragmentPart]); switch (depth) { case EObjectUtil.DEPTH_ONE: return showMarker && elementUriFragmentParts.length + 1 >= markerUriFragmentParts.length; case EObjectUtil.DEPTH_INFINITE: return showMarker && elementUriFragmentParts.length <= markerUriFragmentParts.length; default: return true; } } /** * check if an array of IMarker contains a marker with the status IStatus.ERROR * Loading
tests/org.eclipse.sphinx.tests.emf.validation/src/org/eclipse/sphinx/emf/validation/markers/ValidationMarkerManagerUriComparisonTest.java 0 → 100644 +85 −0 Original line number Diff line number Diff line package org.eclipse.sphinx.emf.validation.markers; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; import org.eclipse.sphinx.emf.util.EObjectUtil; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @RunWith(Parameterized.class) public class ValidationMarkerManagerUriComparisonTest { private static final String SELECTED_ELEMENT_URI = "platform:/resource/validation-1/default.arxml#/ARRoot/Adc"; //$NON-NLS-1$ private String markerUri; private boolean showMarkerForDepthZero, showMarkerForDepthOne, showMarkerForDepthInfinite; private static ValidationMarkerManager markerManager; // EObjectUtil.DEPTH_ZERO, EObjectUtil.DEPTH_ONE, EObjectUtil.DEPTH_INFINITE @Parameterized.Parameters public static List<Object[]> markerUriTestData() { // | Marker URI | Show marker for DEPTH_ZERO | DEPTH_ONE | DEPTH_INFINITE | return Arrays.asList(new Object[][] { { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc", true, true, true }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc/AdcConfigSet", false, true, true }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc/AdcConfigSet/Abc", false, false, true }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc2", false, false, false }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc2/AdcConfigSet", false, false, false }, //$NON-NLS-1$ { "platform:/resource/validation-1/default.arxml#/ARRoot/Adc2/AdcConfigSet/Abc", false, false, false } }); //$NON-NLS-1$ } public ValidationMarkerManagerUriComparisonTest(String markerUri, boolean showMarkerForDepthZero, boolean showMarkerForDepthOne, boolean showMarkerForDepthInfinite) { this.markerUri = markerUri; this.showMarkerForDepthZero = showMarkerForDepthZero; this.showMarkerForDepthOne = showMarkerForDepthOne; this.showMarkerForDepthInfinite = showMarkerForDepthInfinite; } @BeforeClass public static void setUpOnce() { markerManager = ValidationMarkerManager.getInstance(); } @Test public void checkMarkerCorrectlyFilteredForDepthZero() { int depth = EObjectUtil.DEPTH_ZERO; boolean showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", null, depth); //$NON-NLS-1$ assertThat(showMarker, is(showMarkerForDepthZero)); showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", "EObject", depth); //$NON-NLS-1$ //$NON-NLS-2$ assertThat(showMarker, is(showMarkerForDepthZero)); showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", "OtherType", depth); //$NON-NLS-1$ //$NON-NLS-2$ assertThat(showMarker, is(false)); } @Test public void checkMarkerCorrectlyFilteredForDepthOne() { int depth = EObjectUtil.DEPTH_ONE; boolean showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", null, depth); //$NON-NLS-1$ assertThat(showMarker, is(showMarkerForDepthOne)); } @Test public void checkMarkerCorrectlyFilteredForDepthInfinite() { int depth = EObjectUtil.DEPTH_INFINITE; boolean showMarker = markerManager.showMarker(SELECTED_ELEMENT_URI, markerUri, "EObject", null, depth); //$NON-NLS-1$ assertThat(showMarker, is(showMarkerForDepthInfinite)); } }