Fixed bug 440952: Basic Marker Updater should be executed before other contributed markers
Signed-off-by: Sarika Sinha <sarika.sinha@in.ibm.com>
diff --git a/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF b/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF
index 4a19d59..7696fa4 100644
--- a/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF
@@ -1,8 +1,9 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.editors.tests
+Bundle-SymbolicName: org.eclipse.ui.editors.tests;singleton:=true
Bundle-Version: 3.8.300.qualifier
+Bundle-Activator: org.eclipse.ui.editors.tests.EditorTestPlugin
Bundle-Vendor: %Plugin.providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.ui.editors.tests
@@ -20,3 +21,4 @@
org.eclipse.text.tests;bundle-version="[3.5.0,4.0.0)"
Bundle-RequiredExecutionEnvironment: J2SE-1.4
Eclipse-BundleShape: dir
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorTestPlugin.java b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorTestPlugin.java
new file mode 100644
index 0000000..3550478
--- /dev/null
+++ b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorTestPlugin.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2014 IBM 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.editors.tests;
+
+import java.io.BufferedInputStream;
+import java.lang.reflect.Field;
+
+import org.osgi.framework.BundleContext;
+
+import org.eclipse.core.runtime.ContributorFactorySimple;
+import org.eclipse.core.runtime.IContributor;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+
+public class EditorTestPlugin extends Plugin {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
+ */
+ public static String PLUGIN_ID= "org.eclipse.ui.editors.tests";
+
+ // The shared instance
+ private static EditorTestPlugin fgPlugin;
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static EditorTestPlugin getDefault() {
+ return fgPlugin;
+ }
+
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ fgPlugin= this;
+ IExtensionRegistry registry= Platform.getExtensionRegistry();
+ IContributor pointContributor= ContributorFactorySimple.createContributor(Long.toString(fgPlugin.getBundle().getBundleId()));
+
+ try{
+ BufferedInputStream bis= new BufferedInputStream(getClass().getResourceAsStream("plugin.xml"));
+
+ Field field=
+ org.eclipse.core.internal.registry.ExtensionRegistry.class
+ .getDeclaredField("masterToken");
+ field.setAccessible(true);
+ Object masterToken= field.get(registry);
+ registry.addContribution(bis, pointContributor, true, null, null, masterToken);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+
+ }
+
+ public EditorTestPlugin() {
+ super();
+ }
+
+}
diff --git a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorsTestSuite.java b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorsTestSuite.java
index d719014..2c4a13a 100644
--- a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorsTestSuite.java
+++ b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorsTestSuite.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 IBM 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
@@ -27,6 +27,7 @@
suite.addTest(EncodingChangeTests.suite());
suite.addTest(GotoLineTest.suite());
suite.addTest(SegmentedModeTest.suite());
+ suite.addTest(MarkerAnnotationOrderTest.suite());
//$JUnit-END$
return suite;
}
diff --git a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/MarkerAnnotationOrderTest.java b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/MarkerAnnotationOrderTest.java
new file mode 100644
index 0000000..84d0115
--- /dev/null
+++ b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/MarkerAnnotationOrderTest.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2014 IBM 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.editors.tests;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.ILog;
+import org.eclipse.core.runtime.ILogListener;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+
+import org.eclipse.core.resources.IMarker;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+
+import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel;
+
+import org.eclipse.ui.editors.text.EditorsUI;
+
+public class MarkerAnnotationOrderTest extends TestCase {
+
+ public static Test suite() {
+ return new TestSuite(MarkerAnnotationOrderTest.class);
+ }
+
+ public void testDirectDependency() {
+ final ArrayList list= new ArrayList(2);
+ Bundle bundle= Platform.getBundle(EditorsUI.PLUGIN_ID);
+ ILog log= Platform.getLog(bundle);
+ log.addLogListener(new ILogListener() {
+
+ public void logging(IStatus status, String plugin) {
+ list.add(status);
+ }
+ });
+
+ TestMarkerAnnotationModel t1= new TestMarkerAnnotationModel();
+ Position position= new Position(0);
+ position.delete();
+ IDocument d= null;
+ try {
+ t1.updateMarker(d, null, position);
+ } catch (CoreException e) {
+ fail("update marker failed to execute");
+ EditorTestPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, EditorTestPlugin.PLUGIN_ID, e.getMessage()));
+ }
+
+ assertEquals("Wrong number of messages", 2, list.size());
+ assertEquals(
+ "Wrong Message for first status",
+ "Marker Updater org.eclipse.ui.texteditor.BasicMarkerUpdaterTest2 and org.eclipse.ui.texteditor.BasicMarkerUpdaterTest1 depend on each other, org.eclipse.ui.texteditor.BasicMarkerUpdaterTest2 will run before org.eclipse.ui.texteditor.BasicMarkerUpdaterTest1",
+ ((Status)list.get(0)).getMessage());
+ assertEquals(
+ "Wrong Message for second status",
+ "Marker Updater org.eclipse.ui.texteditor.BasicMarkerUpdaterTest4 and org.eclipse.ui.texteditor.BasicMarkerUpdaterTest1 depend on each other, org.eclipse.ui.texteditor.BasicMarkerUpdaterTest4 will run before org.eclipse.ui.texteditor.BasicMarkerUpdaterTest1",
+ ((Status)list.get(1)).getMessage());
+
+ }
+
+ public class TestMarkerAnnotationModel extends AbstractMarkerAnnotationModel {
+ protected IMarker[] retrieveMarkers() throws CoreException {
+ return null;
+ }
+
+ protected void deleteMarkers(IMarker[] markers) throws CoreException {
+ }
+
+ protected void listenToMarkerChanges(boolean listen) {
+ }
+
+ protected boolean isAcceptable(IMarker marker) {
+ return false;
+ }
+
+ }
+
+}
diff --git a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/plugin.xml b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/plugin.xml
new file mode 100644
index 0000000..024b89a
--- /dev/null
+++ b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.editors.markerUpdaters">
+ <updater
+ class="org.eclipse.ui.texteditor.BasicMarkerUpdater"
+ id="org.eclipse.ui.texteditor.BasicMarkerUpdaterTest1"
+ markerType="org.eclipse.ui.editors.test.DummyMarkerType">
+ <required-updater id="org.eclipse.ui.texteditor.BasicMarkerUpdaterTest2"/>
+ </updater>
+ <updater
+ class="org.eclipse.ui.texteditor.BasicMarkerUpdater"
+ id="org.eclipse.ui.texteditor.BasicMarkerUpdaterTest2"
+ markerType="org.eclipse.ui.editors.test.DummyMarkerType">
+ <required-updater id="org.eclipse.ui.texteditor.BasicMarkerUpdaterTest1"/>
+ <required-updater id="org.eclipse.ui.texteditor.BasicMarkerUpdaterTest3"/>
+ </updater>
+ <updater
+ class="org.eclipse.ui.texteditor.BasicMarkerUpdater"
+ id="org.eclipse.ui.texteditor.BasicMarkerUpdaterTest3"
+ markerType="org.eclipse.ui.editors.test.DummyMarkerType">
+ <required-updater id="org.eclipse.ui.texteditor.BasicMarkerUpdaterTest4"/>
+ </updater>
+ <updater
+ class="org.eclipse.ui.texteditor.BasicMarkerUpdater"
+ id="org.eclipse.ui.texteditor.BasicMarkerUpdaterTest4"
+ markerType="org.eclipse.ui.editors.test.DummyMarkerType">
+ <required-updater id="org.eclipse.ui.texteditor.BasicMarkerUpdaterTest1"/>
+ </updater>
+ </extension>
+</plugin>
\ No newline at end of file
diff --git a/org.eclipse.ui.editors/schema/markerUpdaters.exsd b/org.eclipse.ui.editors/schema/markerUpdaters.exsd
index 2ccb5aa..d27f3b7 100644
--- a/org.eclipse.ui.editors/schema/markerUpdaters.exsd
+++ b/org.eclipse.ui.editors/schema/markerUpdaters.exsd
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.editors">
+<schema targetNamespace="org.eclipse.ui.editors" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.ui.editors" id="markerUpdaters" name="Marker Updaters"/>
@@ -11,6 +11,11 @@
</annotation>
<element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
<complexType>
<sequence>
<element ref="updater" minOccurs="1" maxOccurs="unbounded"/>
@@ -44,6 +49,9 @@
<element name="updater">
<complexType>
+ <sequence>
+ <element ref="required-updater" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
@@ -74,6 +82,21 @@
</complexType>
</element>
+ <element name="required-updater">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ The fully-qualified id of a marker updater which is required for this updater.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="identifier" basedOn="org.eclipse.ui.editors.markerUpdaters/updater/@id"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
<annotation>
<appInfo>
<meta.section type="since"/>
@@ -94,12 +117,13 @@
id="org.eclipse.jdt.ui.markerUpdaters.JavaSearchMarkerUpdater"
class="org.eclipse.jdt.internal.ui.search.JavaSearchMarkerUpdater"
markerType="org.eclipse.search.searchmarker">
- </updater>
+ <required-updater id="org.eclipse.ui.texteditor.BasicMarkerUpdater"/>
+ </updater>
</extension>
</pre>
<p>
This example registers <samp>org.eclipse.jdt.internal.ui.search.JavaSearchMarkerUpdater</samp> as a marker updater for all markers of the
-type <samp>org.eclipse.search.searchmarker</samp> including all its derived types.
+type <samp>org.eclipse.search.searchmarker</samp> including all its derived types. This marker updater requires BasicMarkerUpdater to execute first.
</p>
<pre>
<extension point= "org.eclipse.ui.editors.markerUpdaters">
@@ -110,7 +134,8 @@
</extension>
</pre>
<p>
-This example registers <samp>org.eclipse.ui.texteditor.BasicMarkerUpdater</samp> as a marker updater independent from the type of the marker.
+This example registers <samp>org.eclipse.ui.texteditor.BasicMarkerUpdater</samp> as a marker updater independent from the type of the marker. This marker updater does not require any other updater
+to run first.
</p>
</documentation>
</annotation>
@@ -124,21 +149,13 @@
</documentation>
</annotation>
- <annotation>
- <appInfo>
- <meta.section type="implementation"/>
- </appInfo>
- <documentation>
-
- </documentation>
- </annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
- Copyright (c) 2001, 2008 IBM Corporation and others.<br>
+ Copyright (c) 2001, 2014 IBM Corporation and others.<br>
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 <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>
</documentation>
</annotation>
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractMarkerAnnotationModel.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractMarkerAnnotationModel.java
index 0d36866..59479cf 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractMarkerAnnotationModel.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/AbstractMarkerAnnotationModel.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 IBM 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
@@ -11,7 +11,9 @@
package org.eclipse.ui.texteditor;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import org.osgi.framework.Bundle;
@@ -38,6 +40,8 @@
import org.eclipse.jface.text.source.IAnnotationMap;
import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.editors.text.EditorsPlugin;
+import org.eclipse.ui.internal.editors.text.NLSUtility;
import org.eclipse.ui.editors.text.EditorsUI;
@@ -72,6 +76,7 @@
/** List of registered but not yet instantiated marker updaters */
private List fMarkerUpdaterSpecifications= null;
+ private static final String ID= "id"; //$NON-NLS-1$
/**
* Retrieves all markers from this model.
@@ -256,15 +261,71 @@
private void installMarkerUpdaters() {
// initialize lists - indicates that the initialization happened
- fMarkerUpdaterSpecifications= new ArrayList(2);
fInstantiatedMarkerUpdaters= new ArrayList(2);
+ HashMap markerUpdaterOrderMap = new HashMap(2);
+ LinkedList markerUpdaterSpecificationsLinkedList= new LinkedList();
// populate list
IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(EditorsUI.PLUGIN_ID, "markerUpdaters"); //$NON-NLS-1$
if (extensionPoint != null) {
IConfigurationElement[] elements= extensionPoint.getConfigurationElements();
- for (int i= 0; i < elements.length; i++)
- fMarkerUpdaterSpecifications.add(elements[i]);
+ for (int i= 0; i < elements.length; i++) {
+ markerUpdaterSpecificationsLinkedList.add(elements[i]);
+ markerUpdaterOrderMap.put(elements[i].getAttribute(ID), new Integer(i));
+ }
+ //start sorting based on required-updater definition
+ HashMap markerUpdaterRequiredByOrderMap= new HashMap(2);
+ for (int i= 0; i < elements.length; i++) {
+ // Required marker should execute before other updater markers
+ IConfigurationElement[] requiredUpdaters= elements[i].getChildren("required-updater"); //$NON-NLS-1$
+ if (requiredUpdaters.length > 0) {
+ //ArrayList requiredUpdaters= new ArrayList(2);
+ for (int j= 0; j < requiredUpdaters.length; j++) { // If required updaters have been defined
+ String requiredID= requiredUpdaters[j].getAttribute(ID);
+ // If required ID is not a valid id
+ if (requiredID == null || (markerUpdaterOrderMap.get(requiredID) == null)) { // ID missing or invalid - log the message and move to next contribution
+ String msg= NLSUtility.format(TextEditorMessages.AbstractMarkerAnnotationModel_updaterInvalidDefinition, new Object[] { elements[i].getAttribute(ID), requiredID });
+ EditorsPlugin.log(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, msg));
+ continue;
+ }
+ // Updating requiredByUpdaters to identify and log error for cyclic Dependency like A required B, B required C, C required D and D required A
+ // or A requires B and B requires A
+
+ ArrayList requiredByUpdaters;
+ if (markerUpdaterRequiredByOrderMap.get(requiredID) == null) {
+ requiredByUpdaters= new ArrayList(2);
+ }
+ else {
+ requiredByUpdaters= (ArrayList)markerUpdaterRequiredByOrderMap.get(requiredID);
+ }
+ // Build up extended required id list to identify Case 2
+ if (markerUpdaterRequiredByOrderMap.get(elements[i].getAttribute(ID)) != null) {
+ ArrayList requiredByList= (ArrayList)markerUpdaterRequiredByOrderMap.get(elements[i].getAttribute(ID));
+ requiredByUpdaters.addAll(requiredByList);
+ }
+ if (requiredByUpdaters.contains(requiredID)) { //log error if marker ID is in the required list of required ID
+ String msg= NLSUtility.format(TextEditorMessages.AbstractMarkerAnnotationModel_markerUpdaterCyclicDefinition, new Object[] { elements[i].getAttribute(ID), requiredID });
+ EditorsPlugin.log(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, msg));
+ continue;
+ }
+ requiredByUpdaters.add(elements[i].getAttribute(ID));
+ markerUpdaterRequiredByOrderMap.put(requiredID, requiredByUpdaters);
+
+ Integer requiredLocation= (Integer)markerUpdaterOrderMap.get(requiredID);
+ if (requiredLocation.intValue() > ((Integer)markerUpdaterOrderMap.get(elements[i].getAttribute(ID))).intValue()) { // If required marker is not ordered before
+ int newLocation= (((Integer)markerUpdaterOrderMap.get(elements[i].getAttribute(ID))).intValue() == 0) ? 0 : (((Integer)markerUpdaterOrderMap.get(elements[i]
+ .getAttribute(ID))).intValue() - 1);
+ Object requiredMarker= markerUpdaterSpecificationsLinkedList.remove(requiredLocation.intValue());
+ markerUpdaterSpecificationsLinkedList.add(newLocation, requiredMarker); // Put the required location before the marker
+ markerUpdaterOrderMap.put(requiredID, new Integer(newLocation));
+ markerUpdaterOrderMap.put(elements[i].getAttribute(ID), new Integer(newLocation + 1));
+ }
+ }
+ }
+ }
+ fMarkerUpdaterSpecifications= new ArrayList(markerUpdaterSpecificationsLinkedList);
+ //end sorting
+
}
}
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.java b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.java
index c0e32be..d4433bd 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.java
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2014 IBM 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
@@ -49,6 +49,8 @@
public static String AbstractMarkerAnnotationModel_connected;
public static String AbstractMarkerAnnotationModel_createMarkerUpdater;
public static String AbstractMarkerAnnotationModel_removeAnnotations;
+ public static String AbstractMarkerAnnotationModel_updaterInvalidDefinition;
+ public static String AbstractMarkerAnnotationModel_markerUpdaterCyclicDefinition;
public static String DocumentProviderRegistry_error_extension_point_not_found;
public static String ChangeEncodingAction_message_noEncodingSupport;
public static String ChangeEncodingAction_button_apply_label;
diff --git a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.properties b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.properties
index 3cdd936..ad9bb83 100644
--- a/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.properties
+++ b/org.eclipse.ui.editors/src/org/eclipse/ui/texteditor/TextEditorMessages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2000, 2010 IBM Corporation and others.
+# Copyright (c) 2000, 2014 IBM 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
@@ -18,6 +18,8 @@
AbstractMarkerAnnotationModel_connected=AbstractMarkerAnnotationModel.connected
AbstractMarkerAnnotationModel_createMarkerUpdater=AbstractMarkerAnnotationModel.createMarkerUpdater
AbstractMarkerAnnotationModel_removeAnnotations=AbstractMarkerAnnotationModel.removeAnnotations
+AbstractMarkerAnnotationModel_updaterInvalidDefinition=Marker Updater ''{0}'' has invalid entry for required updater ''{1}''
+AbstractMarkerAnnotationModel_markerUpdaterCyclicDefinition=Marker Updater ''{0}'' and ''{1}'' depend on each other, ''{0}'' will run before ''{1}''
DocumentProviderRegistry_error_extension_point_not_found=Extension point: {0}.documentProviders not found
ChangeEncodingAction_message_noEncodingSupport=No encoding support installed