fix validator list reinitialisation on preference changes
diff --git a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/IValidatorChangedListener.java b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/IValidatorChangedListener.java
index 48694b6..3902290 100644
--- a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/IValidatorChangedListener.java
+++ b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/IValidatorChangedListener.java
@@ -11,9 +11,11 @@
 package org.eclipse.dltk.validators.core;
 
 public interface IValidatorChangedListener {
-	public void validatorChanged(IValidator validator);
+	// public void validatorChanged(IValidator validator);
 
-	public void validatorAdded(IValidator validator);
+	// public void validatorAdded(IValidator validator);
 
-	public void validatorRemoved(IValidator validator);
+	// public void validatorRemoved(IValidator validator);
+
+	void validatorChanged();
 }
diff --git a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/ValidatorRuntime.java b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/ValidatorRuntime.java
index 8b06418..8090436 100644
--- a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/ValidatorRuntime.java
+++ b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/core/ValidatorRuntime.java
@@ -157,15 +157,13 @@
 	/**
 	 * Perform Interpreter type and Interpreter install initialization. Does not
 	 * hold locks while performing change notification.
-	 * 
-	 * 
 	 */
 	private static void initializeValidators() {
 		ValidatorDefinitionsContainer validatorDefs = null;
 		boolean setPref = false;
 		synchronized (fgValidatorLock) {
 			if (isInitialized) {
-				// return;
+				return;
 			}
 			isInitialized = true;
 			try {
@@ -196,16 +194,18 @@
 			} catch (CoreException e1) {
 				return;
 			}
-			for (int i = 0; i < validatorTypes.length; i++) {
-				final IValidatorType type = validatorTypes[i];
-				final IValidator[] validators = type.getValidators();
-				if (validators != null) {
-					for (int j = 0; j < validators.length; j++) {
-						final IValidator validator = validators[j];
-						if (type.findValidator(validator.getID()) == null) {
-							type.addValidator(validator);
+			// register loaded validators with corresponding types
+			for (Iterator i = validatorDefs.getValidatorList().iterator(); i
+					.hasNext();) {
+				final IValidator validator = (IValidator) i.next();
+				final String typeId = validator.getValidatorType().getID();
+				for (int j = 0; j < validatorTypes.length; ++j) {
+					final IValidatorType validatorType = validatorTypes[j];
+					if (typeId.equals(validatorType.getID())) {
+						if (validatorType.findValidator(validator.getID()) == null) {
+							validatorType.addValidator(validator);
 						}
-						fireValidatorAdded(validator);
+						break;
 					}
 				}
 			}
@@ -241,8 +241,9 @@
 	public static void fireValidatorChanged(IValidator validator) {
 		Object[] listeners = fgValidatorListeners.getListeners();
 		for (int i = 0; i < listeners.length; i++) {
-			IValidatorChangedListener listener = (IValidatorChangedListener) listeners[i];
-			listener.validatorChanged(validator);
+			// IValidatorChangedListener listener = (IValidatorChangedListener)
+			// listeners[i];
+			// listener.validatorChanged(validator);
 		}
 	}
 
@@ -250,8 +251,9 @@
 		if (!fgInitializingValidators) {
 			Object[] listeners = fgValidatorListeners.getListeners();
 			for (int i = 0; i < listeners.length; i++) {
-				IValidatorChangedListener listener = (IValidatorChangedListener) listeners[i];
-				listener.validatorAdded(Interpreter);
+				// IValidatorChangedListener listener =
+				// (IValidatorChangedListener) listeners[i];
+				// listener.validatorAdded(Interpreter);
 			}
 		}
 	}
@@ -259,8 +261,9 @@
 	public static void fireValidatorRemoved(IValidator Interpreter) {
 		Object[] listeners = fgValidatorListeners.getListeners();
 		for (int i = 0; i < listeners.length; i++) {
-			IValidatorChangedListener listener = (IValidatorChangedListener) listeners[i];
-			listener.validatorRemoved(Interpreter);
+			// IValidatorChangedListener listener = (IValidatorChangedListener)
+			// listeners[i];
+			// listener.validatorRemoved(Interpreter);
 		}
 	}
 
@@ -492,4 +495,15 @@
 		}
 	}
 
+	public static void fireValidatorChanged() {
+		synchronized (fgValidatorLock) {
+			isInitialized = false;
+		}
+		Object[] listeners = fgValidatorListeners.getListeners();
+		for (int i = 0; i < listeners.length; i++) {
+			IValidatorChangedListener listener = (IValidatorChangedListener) listeners[i];
+			listener.validatorChanged();
+		}
+	}
+
 }
diff --git a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/internal/core/ValidatorsCore.java b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/internal/core/ValidatorsCore.java
index 6d5e305..a40a464 100644
--- a/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/internal/core/ValidatorsCore.java
+++ b/core/plugins/org.eclipse.dltk.validators.core/src/org/eclipse/dltk/validators/internal/core/ValidatorsCore.java
@@ -49,12 +49,6 @@
 
 	private boolean fIgnoreValidatorDefPropertyChangeEvents = false;
 
-	// private boolean fBatchingChanges;
-
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
-	private String fOldInterpreterPrefString = EMPTY_STRING;
-
 	/**
 	 * The constructor
 	 */
@@ -81,6 +75,7 @@
 	 * org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
 	 */
 	public void stop(BundleContext context) throws Exception {
+		getPluginPreferences().removePropertyChangeListener(this);
 		plugin = null;
 		super.stop(context);
 	}
@@ -143,7 +138,7 @@
 	}
 
 	private ValidatorDefinitionsContainer getValidatorDefinitions(String xml) {
-		if (xml.length() > 0) {
+		if (xml != null && xml.length() > 0) {
 			try {
 				return ValidatorDefinitionsContainer
 						.createFromXML(new StringReader(xml));
@@ -157,68 +152,32 @@
 	}
 
 	protected void processValidatorPrefsChanged(String oldValue, String newValue) {
-
-		// batch changes
-		// fBatchingChanges = true;
-		try {
-
-			String oldPrefString;
-			String newPrefString;
-
-			// If empty new value, save the old value and wait for 2nd
-			// propertyChange notification
-			if (newValue == null || newValue.equals(EMPTY_STRING)) {
-				fOldInterpreterPrefString = oldValue;
-				return;
-			}
-			// An empty old value signals the second notification in the import
-			// preferences
-			// sequence. Now that we have both old & new prefs, we can parse and
-			// compare them.
-			else if (oldValue == null || oldValue.equals(EMPTY_STRING)) {
-				oldPrefString = fOldInterpreterPrefString;
-				newPrefString = newValue;
-			}
-			// If both old & new values are present, this is a normal user
-			// change
-			else {
-				oldPrefString = oldValue;
-				newPrefString = newValue;
-			}
-
-			// Generate the previous Validators
-			ValidatorDefinitionsContainer oldResults = getValidatorDefinitions(oldPrefString);
-
-			// Generate the current
-			ValidatorDefinitionsContainer newResults = getValidatorDefinitions(newPrefString);
-
-			// Determine the deleted validators
-			List deleted = new ArrayList(oldResults.getValidatorList());
-			deleted.removeAll(newResults.getValidatorList());
-
-			// Dispose deleted Validators. The 'disposeInterpreterInstall'
-			// method fires notification of the
-			// deletion.
-			Iterator deletedIterator = deleted.iterator();
-			while (deletedIterator.hasNext()) {
-				IValidator deletedValidatorStandin = (IValidator) deletedIterator
-						.next();
-				deletedValidatorStandin.getValidatorType().disposeValidator(
-						deletedValidatorStandin.getID());
-			}
-
-			// Iterator currentIterator = current.iterator();
-			//			
-			// while(currentIterator.hasNext()){
-			// IValidator currentValidatorStandin = (IValidator)
-			// currentIterator.next();
-			// currentValidatorStandin.getValidatorType().createValidator(
-			// currentValidatorStandin.getID());
-			// }
-		} finally {
-			// stop batch changes
-			// fBatchingChanges = false;
+		if (oldValue == null && newValue == null) {
+			return;
 		}
+		if (oldValue != null && oldValue.equals(newValue)) {
+			return;
+		}
+
+		// Generate the previous Validators
+		ValidatorDefinitionsContainer oldResults = getValidatorDefinitions(oldValue);
+
+		// Generate the current
+		ValidatorDefinitionsContainer newResults = getValidatorDefinitions(newValue);
+
+		// Determine the deleted validators
+		List deleted = new ArrayList(oldResults.getValidatorList());
+		deleted.removeAll(newResults.getValidatorList());
+
+		// Dispose ALL but built-in validators
+		for (Iterator i = deleted.iterator(); i.hasNext();) {
+			IValidator validator = (IValidator) i.next();
+			validator.getValidatorType().disposeValidator(validator.getID());
+		}
+
+		// fire event and reset initialized flag - during next call new
+		// validators would be loaded and added to the validatorType
+		ValidatorRuntime.fireValidatorChanged();
 	}
 
 	public static void log(IStatus status) {