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) {