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 extends Entry extends K, ? extends V>> i = t.entrySet().iterator();
while (i.hasNext())
{
Entry extends K, ? extends V> 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 extends K, ? extends V> 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