From 13042ba9d212d3eae79459c631953f8d9f03b73d Mon Sep 17 00:00:00 2001 From: Steven Spungin Date: Wed, 16 Apr 2014 22:28:13 -0400 Subject: Bug 391061 - superfluous @Inject from @Preference Change-Id: Ic4322d37a61e214cbfd44530414a8d5fa16df45e Signed-off-by: Steven Spungin --- .../extensions/PreferencesObjectSupplier.java | 60 ++++++++++++++-------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/bundles/org.eclipse.e4.core.di.extensions/src/org/eclipse/e4/core/di/internal/extensions/PreferencesObjectSupplier.java b/bundles/org.eclipse.e4.core.di.extensions/src/org/eclipse/e4/core/di/internal/extensions/PreferencesObjectSupplier.java index 2ddb30f89..a18000432 100644 --- a/bundles/org.eclipse.e4.core.di.extensions/src/org/eclipse/e4/core/di/internal/extensions/PreferencesObjectSupplier.java +++ b/bundles/org.eclipse.e4.core.di.extensions/src/org/eclipse/e4/core/di/internal/extensions/PreferencesObjectSupplier.java @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Steven Spungin - Bug 391061 *******************************************************************************/ package org.eclipse.e4.core.di.internal.extensions; @@ -37,17 +38,24 @@ public class PreferencesObjectSupplier extends ExtendedObjectSupplier { final private IRequestor requestor; final private IEclipsePreferences node; + final private String key; - public PrefInjectionListener(IEclipsePreferences node, IRequestor requestor) { + public PrefInjectionListener(IEclipsePreferences node, String key, IRequestor requestor) { this.node = node; + this.key = key; this.requestor = requestor; } - public void preferenceChange(PreferenceChangeEvent event) { + public void preferenceChange(final PreferenceChangeEvent event) { if (!requestor.isValid()) { node.removePreferenceChangeListener(this); return; } + + if (!event.getKey().equals(key)) { + return; + } + requestor.resolveArguments(false); requestor.execute(); } @@ -61,7 +69,8 @@ public class PreferencesObjectSupplier extends ExtendedObjectSupplier { } } - private Map> listenerCache = new HashMap>(); + // Hash (nodePath -> Hash (key -> list)) + private Map>> listenerCache = new HashMap>>(); public PreferencesObjectSupplier() { DIEActivator.getDefault().registerPreferencesSupplier(this); @@ -81,7 +90,7 @@ public class PreferencesObjectSupplier extends ExtendedObjectSupplier { if (key == null || nodePath == null || key.length() == 0 || nodePath.length() == 0) return IInjector.NOT_A_VALUE; if (track) - addListener(nodePath, requestor); + addListener(nodePath, key, requestor); if (descriptorsClass.isPrimitive()) { if (descriptorsClass.equals(boolean.class)) @@ -150,40 +159,49 @@ public class PreferencesObjectSupplier extends ExtendedObjectSupplier { return DIEActivator.getDefault().getPreferencesService(); } - private void addListener(String nodePath, final IRequestor requestor) { + private void addListener(String nodePath, String key, final IRequestor requestor) { if (requestor == null) return; synchronized (listenerCache) { if (listenerCache.containsKey(nodePath)) { - for (PrefInjectionListener listener : listenerCache.get(nodePath)) { - IRequestor previousRequestor = listener.getRequestor(); - if (previousRequestor.equals(requestor)) - return; // avoid adding duplicate listeners + HashMap> map = listenerCache.get(nodePath); + if (map.containsKey(key)) { + for (PrefInjectionListener listener : map.get(key)) { + IRequestor previousRequestor = listener.getRequestor(); + if (previousRequestor.equals(requestor)) + return; // avoid adding duplicate listeners + } } } } final IEclipsePreferences node = InstanceScope.INSTANCE.getNode(nodePath); - PrefInjectionListener listener = new PrefInjectionListener(node, requestor); + PrefInjectionListener listener = new PrefInjectionListener(node, key, requestor); node.addPreferenceChangeListener(listener); synchronized (listenerCache) { - if (listenerCache.containsKey(nodePath)) - listenerCache.get(nodePath).add(listener); - else { - List listeningRequestors = new ArrayList(); - listeningRequestors.add(listener); - listenerCache.put(nodePath, listeningRequestors); + HashMap> map = listenerCache.get(nodePath); + if (map == null) { + map = new HashMap>(); + listenerCache.put(nodePath, map); + } + List listeningRequestors = map.get(key); + if (listeningRequestors == null) { + listeningRequestors = new ArrayList(); + map.put(key, listeningRequestors); } + listeningRequestors.add(listener); } } public void removeAllListeners() { synchronized (listenerCache) { - for (List listeners : listenerCache.values()) { - if (listeners == null) - continue; - for (PrefInjectionListener listener : listeners) { - listener.stopListening(); + for (HashMap> map : listenerCache.values()) { + for (List listeners : map.values()) { + if (listeners == null) + continue; + for (PrefInjectionListener listener : listeners) { + listener.stopListening(); + } } } listenerCache.clear(); -- cgit v1.2.3