From 628b660a146fea7df9679e9e217aeeed301a6bf1 Mon Sep 17 00:00:00 2001 From: Eike Stepper Date: Fri, 22 Dec 2006 08:37:46 +0000 Subject: Added delegating registries. --- plugins/org.eclipse.net4j/META-INF/MANIFEST.MF | 1 - .../util/registry/AbstractDelegatingRegistry.java | 149 +++++++++++++++++++ .../net4j/util/registry/AbstractRegistry.java | 57 +++---- .../util/registry/HashMapDelegatingRegistry.java | 52 +++++++ .../net4j/util/registry/IRegistryDelta.java | 6 +- .../delegating/AbstractCachingRegistry.java | 163 --------------------- .../registry/delegating/DelegatingRegistry.java | 126 ---------------- .../registry/delegating/HashCacheRegistry.java | 47 ------ 8 files changed, 225 insertions(+), 376 deletions(-) create mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/AbstractDelegatingRegistry.java create mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/HashMapDelegatingRegistry.java delete mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/AbstractCachingRegistry.java delete mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/DelegatingRegistry.java delete mode 100644 plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/HashCacheRegistry.java (limited to 'plugins/org.eclipse.net4j') diff --git a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF index dea782a1a0..c31d41117e 100644 --- a/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j/META-INF/MANIFEST.MF @@ -28,7 +28,6 @@ Export-Package: org.eclipse.internal.net4j.transport;version="0.8.0", org.eclipse.net4j.util.om.log;version="0.8.0", org.eclipse.net4j.util.om.trace;version="0.8.0", org.eclipse.net4j.util.registry;version="0.8.0", - org.eclipse.net4j.util.registry.delegating;version="0.8.0", org.eclipse.net4j.util.stream;version="0.8.0" Eclipse-LazyStart: true Require-Bundle: org.eclipse.core.runtime;resolution:=optional diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/AbstractDelegatingRegistry.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/AbstractDelegatingRegistry.java new file mode 100644 index 0000000000..b4a7b3f0db --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/AbstractDelegatingRegistry.java @@ -0,0 +1,149 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.util.registry; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Implementation note: AbstractDelegatingRegistry does not preserve the + * "modifyable view" contract of {@link Map#entrySet()} as well as of + * {@link Map#keySet()}, i.e. they are disconnected sets and modifications + * applied to them are not applied to their underlying + * AbstractDelegatingRegistry. + *

+ * + * @author Eike Stepper + */ +public abstract class AbstractDelegatingRegistry extends AbstractRegistry +{ + private IRegistry delegate; + + public AbstractDelegatingRegistry(IRegistry delegate) + { + this.delegate = delegate; + } + + public AbstractDelegatingRegistry(IRegistry delegate, boolean autoCommit) + { + super(autoCommit); + this.delegate = delegate; + } + + @Override + public V get(Object key) + { + V result = getMap().get(key); + if (result == null) + { + result = getDelegate().get(key); + } + + return result; + } + + @Override + public Set> entrySet() + { + return mergedEntrySet(); + } + + @Override + public Set keySet() + { + return mergedKeySet(); + } + + @Override + public Collection values() + { + return mergedValues(); + } + + @Override + protected V register(K key, V value) + { + V delegated = getDelegate().get(key); + V old = getMap().put(key, value); + if (old == null) + { + if (delegated != null) + { + // Unhidden delegated element now becomes hidden + getTransaction().rememberDeregistered(key, delegated); + } + + getTransaction().rememberRegistered(key, value); + return delegated; + } + else + { + getTransaction().rememberDeregistered(key, old); + getTransaction().rememberRegistered(key, value); + return old; + } + } + + @Override + protected V deregister(Object key) + { + V delegated = getDelegate().get(key); + V old = getMap().remove(key); + if (old != null) + { + getTransaction().rememberDeregistered(key, old); + if (delegated != null) + { + // Hidden delegated element now becomes unhidden + getTransaction().rememberRegistered((K)key, delegated); + } + } + + return old; + } + + protected Set> mergedEntrySet() + { + final Map merged = new HashMap(); + merged.putAll(getDelegate()); + merged.putAll(getMap()); + return merged.entrySet(); + } + + protected Set mergedKeySet() + { + final Set merged = new HashSet(); + merged.addAll(getDelegate().keySet()); + merged.addAll(getMap().keySet()); + return merged; + } + + protected Collection mergedValues() + { + final List result = new ArrayList(); + for (K key : keySet()) + { + result.add(get(key)); + } + + return result; + } + + protected IRegistry getDelegate() + { + return delegate; + } +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/AbstractRegistry.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/AbstractRegistry.java index 4f7675003c..747fc08c16 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/AbstractRegistry.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/AbstractRegistry.java @@ -108,7 +108,7 @@ public abstract class AbstractRegistry implements IRegistry */ public synchronized V put(K key, V value) { - V result = getTransaction().put(key, value); + V result = register(key, value); autoCommit(); return result; } @@ -121,12 +121,11 @@ public abstract class AbstractRegistry implements IRegistry { if (!t.isEmpty()) { - Transaction transaction = getTransaction(); Iterator> i = t.entrySet().iterator(); while (i.hasNext()) { Entry e = i.next(); - transaction.put(e.getKey(), e.getValue()); + register(e.getKey(), e.getValue()); } autoCommit(); @@ -139,7 +138,7 @@ public abstract class AbstractRegistry implements IRegistry */ public synchronized V remove(Object key) { - V result = getTransaction().remove(key); + V result = deregister(key); autoCommit(); return result; } @@ -152,11 +151,10 @@ public abstract class AbstractRegistry implements IRegistry { if (isEmpty()) { - Transaction transaction = getTransaction(); Set keys = keySet(); for (K key : keys) { - transaction.remove(key); + deregister(key); } autoCommit(); @@ -200,12 +198,26 @@ public abstract class AbstractRegistry implements IRegistry protected V register(K key, V value) { - return getMap().put(key, value); + Transaction transaction = getTransaction(); + V oldValue = getMap().put(key, value); + if (oldValue != null) + { + transaction.rememberDeregistered(key, oldValue); + } + + transaction.rememberRegistered(key, value); + return oldValue; } protected V deregister(Object key) { - return getMap().remove(key); + V value = getMap().remove(key); + if (value != null) + { + getTransaction().rememberDeregistered(key, value); + } + + return value; } protected Transaction getTransaction() @@ -307,29 +319,6 @@ public abstract class AbstractRegistry implements IRegistry ++nesting; } - public V put(K key, V value) - { - V oldValue = register(key, value); - if (oldValue != null) - { - rememberDeregistering(key, oldValue); - } - - rememberRegistered(key, value); - return oldValue; - } - - public V remove(Object key) - { - V value = deregister(key); - if (value != null) - { - rememberDeregistering(key, value); - } - - return value; - } - public void commit(boolean notifications) { if (--nesting == 0) @@ -343,14 +332,14 @@ public abstract class AbstractRegistry implements IRegistry } } - protected void rememberRegistered(K key, V value) + public void rememberRegistered(K key, V value) { deltas.add(new RegistryDelta(key, value, Kind.REGISTERED)); } - protected void rememberDeregistering(Object key, V value) + public void rememberDeregistered(Object key, V value) { - deltas.add(new RegistryDelta(key, value, Kind.DEREGISTERING)); + deltas.add(new RegistryDelta(key, value, Kind.DEREGISTERED)); } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/HashMapDelegatingRegistry.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/HashMapDelegatingRegistry.java new file mode 100644 index 0000000000..8c1764a92f --- /dev/null +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/HashMapDelegatingRegistry.java @@ -0,0 +1,52 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.util.registry; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Eike Stepper + */ +public class HashMapDelegatingRegistry extends AbstractDelegatingRegistry +{ + private Map map; + + public HashMapDelegatingRegistry(IRegistry delegate) + { + super(delegate); + map = new HashMap(); + } + + public HashMapDelegatingRegistry(IRegistry delegate, int initialCapacity) + { + super(delegate); + map = new HashMap(initialCapacity); + } + + public HashMapDelegatingRegistry(IRegistry delegate, int initialCapacity, float loadFactor) + { + super(delegate); + map = new HashMap(initialCapacity, loadFactor); + } + + public HashMapDelegatingRegistry(IRegistry delegate, Map m) + { + super(delegate); + map = new HashMap(m); + } + + @Override + protected Map getMap() + { + return map; + } +} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/IRegistryDelta.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/IRegistryDelta.java index 7276619e79..ae206c2c1b 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/IRegistryDelta.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/IRegistryDelta.java @@ -17,10 +17,6 @@ import java.util.Map; */ public interface IRegistryDelta extends Map.Entry { - // public static final int REGISTERED = 1; - // - // public static final int DEREGISTERING = 2; - public Kind getKind(); /** @@ -28,6 +24,6 @@ public interface IRegistryDelta extends Map.Entry */ public enum Kind { - REGISTERED, DEREGISTERING + REGISTERED, DEREGISTERED } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/AbstractCachingRegistry.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/AbstractCachingRegistry.java deleted file mode 100644 index 7ea2c84bd9..0000000000 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/AbstractCachingRegistry.java +++ /dev/null @@ -1,163 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. - * 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: - * Eike Stepper - initial API and implementation - **************************************************************************/ -package org.eclipse.net4j.util.registry.delegating; - -import org.eclipse.net4j.util.registry.IRegistry; -import org.eclipse.net4j.util.registry.IRegistryElement.Descriptor; -import org.eclipse.net4j.util.registry.IRegistryListener.EventType; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -/** - * TODO Check if all methods of {@link DelegatingRegistry} still do what they - * should. TODO Remove {@link DelegatingRegistry}? - * - * @author Eike Stepper - */ -public abstract class AbstractCachingRegistry> extends - DelegatingRegistry -{ - public AbstractCachingRegistry(IRegistry delegate) - { - this(delegate, DEFAULT_RESOLVING); - } - - public AbstractCachingRegistry(IRegistry delegate, boolean resolving) - { - super(delegate, resolving); - } - - @Override - public synchronized void register(E element) - { - ID id = element.getID(); - E delegatedElement = super.lookup(id, false); - E oldElement = getCache().put(id, element); - - if (oldElement == null) - { - if (delegatedElement != null) - { - // Unhidden delegated element now becomes hidden - fireElementDeregistering(delegatedElement); - } - } - else - { - fireElementDeregistering(oldElement); - } - - fireElementRegistered(element); - } - - @Override - public synchronized void deregister(ID id) - { - E delegatedElement = super.lookup(id, false); - E element = getCache().remove(id); - - if (element != null) - { - fireElementDeregistering(element); - - if (delegatedElement != null) - { - // Hidden delegated element now becomes unhidden - fireElementRegistered(delegatedElement); - } - } - } - - /** - * Synchronized to support {@link #resolveElement(IRegistryElement)} - */ - @Override - public synchronized E lookup(ID id, boolean resolve) - { - E element = getCache().get(id); - if (element == null) - { - if (resolve) - { - return resolveDelegatedElement(id); - } - else - { - return super.lookup(id, false); - } - } - - if (resolve) - { - element = resolveElement(element); - } - - return element; - } - - @Override - public Set getElementIDs() - { - final Set delegateIDs = super.getElementIDs(); - final Set cacheIDs = getCache().keySet(); - final Set ids = new HashSet(delegateIDs.size() + cacheIDs.size()); - - ids.addAll(delegateIDs); - ids.addAll(cacheIDs); - return ids; - } - - @Override - public synchronized void dispose() - { - for (E element : getCache().values()) - { - fireElementDeregistering(element); - } - - getCache().clear(); - super.dispose(); - } - - @Override - protected void replaceElement(ID id, E element) - { - getCache().put(id, element); - } - - @Override - protected synchronized void handleDelegateEvent(EventType eventType, E element) - { - if (!getCache().containsKey(element.getID())) - { - fireRegistryEvent(eventType, element); - } - } - - protected E resolveDelegatedElement(ID id) - { - synchronized (getDelegate()) - { - boolean wasUnresolved = super.lookup(id, false) instanceof Descriptor; - E e = super.lookup(id, true); - if (wasUnresolved) - { - fireElementResolved(e); - } - - return e; - } - } - - protected abstract Map getCache(); -} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/DelegatingRegistry.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/DelegatingRegistry.java deleted file mode 100644 index 4ef308a564..0000000000 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/DelegatingRegistry.java +++ /dev/null @@ -1,126 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. - * 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: - * Eike Stepper - initial API and implementation - **************************************************************************/ -package org.eclipse.net4j.util.registry.delegating; - -import org.eclipse.net4j.util.registry.AbstractRegistry; -import org.eclipse.net4j.util.registry.IRegistry; -import org.eclipse.net4j.util.registry.IRegistryListener; -import org.eclipse.net4j.util.registry.IRegistryListener.EventType; - -import java.util.Set; - -/** - * @author Eike Stepper - */ -public class DelegatingRegistry> extends AbstractRegistry -{ - private IRegistry delegate; - - private IRegistryListener delegateListener = new IRegistryListener() - { - public void notifyRegistryEvent(IRegistry registry, EventType eventType, E element) - { - handleDelegateEvent(eventType, element); - } - }; - - public DelegatingRegistry(IRegistry delegate) - { - this(delegate, DEFAULT_RESOLVING); - } - - public DelegatingRegistry(IRegistry delegate, boolean resolving) - { - super(resolving); - this.delegate = delegate; - delegate.addRegistryListener(delegateListener); - } - - public IRegistry getDelegate() - { - return delegate; - } - - public void register(E element) - { - delegatedRegister(element); - } - - public void deregister(ID id) - { - delegatedDeregister(id); - } - - public E lookup(ID id, boolean resolve) - { - return delegatedLookup(id, resolve); - } - - public Set getElementIDs() - { - return delegatedGetElementIDs(); - } - - @Override - public void dispose() - { - delegate.removeRegistryListener(delegateListener); - } - - protected void delegatedRegister(E element) - { - delegate.register(element); - } - - protected void delegatedDeregister(ID id) - { - delegate.deregister(id); - } - - protected E delegatedLookup(ID id, boolean resolve) - { - return delegate.lookup(id, resolve); - } - - protected Set delegatedGetElementIDs() - { - return delegate.getElementIDs(); - } - - protected int delegatedSize() - { - return delegate.size(); - } - - protected void delegatedDispose() - { - delegate.dispose(); - } - - protected void handleDelegateEvent(EventType eventType, E element) - { - fireRegistryEvent(eventType, element); - } - - @Override - protected void replaceElement(ID id, E element) - { - // Do nothing - } - - /* (non-Javadoc) - * @see org.eclipse.net4j.util.registry.AbstractRegistry#getMap() - */ - protected Map getMap() - { - return null; - } -} diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/HashCacheRegistry.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/HashCacheRegistry.java deleted file mode 100644 index 88ec56299b..0000000000 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/util/registry/delegating/HashCacheRegistry.java +++ /dev/null @@ -1,47 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. - * 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: - * Eike Stepper - initial API and implementation - **************************************************************************/ -package org.eclipse.net4j.util.registry.delegating; - -import org.eclipse.net4j.util.registry.IRegistry; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author Eike Stepper - */ -public class HashCacheRegistry> extends - AbstractCachingRegistry -{ - private Map cache; - - public HashCacheRegistry(IRegistry delegate) - { - this(delegate, DEFAULT_RESOLVING); - } - - public HashCacheRegistry(IRegistry delegate, boolean resolving) - { - super(delegate, resolving); - cache = createCache(); - } - - @Override - protected Map getCache() - { - return cache; - } - - protected Map createCache() - { - return new HashMap(0); - } -} -- cgit v1.2.3