You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2006/11/03 11:14:32 UTC
svn commit: r470747 -
/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java
Author: tripod
Date: Fri Nov 3 02:14:31 2006
New Revision: 470747
URL: http://svn.apache.org/viewvc?view=rev&rev=470747
Log:
JCR-618 Replace WeakIdentityCollection in StateChangeDispacher
Modified:
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java?view=diff&rev=470747&r1=470746&r2=470747
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/StateChangeDispatcher.java Fri Nov 3 02:14:31 2006
@@ -16,11 +16,12 @@
*/
package org.apache.jackrabbit.core.state;
-import org.apache.jackrabbit.util.WeakIdentityCollection;
-import org.apache.jackrabbit.name.QName;
+import EDU.oswego.cs.dl.util.concurrent.CopyOnWriteArrayList;
import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.name.QName;
import java.util.Collection;
+import java.util.Iterator;
/**
* Component that holds weak references to listeners interested in changes to item states and dispatches notifications.
@@ -30,27 +31,24 @@
/**
* Simple item state listeners (weak references)
*/
- private final transient Collection listeners = new WeakIdentityCollection(5);
+ private final Collection listeners = new CopyOnWriteArrayList();
/**
* Node state listeners (weak references)
*/
- private final transient Collection nsListeners = new WeakIdentityCollection(5);
+ private final transient Collection nsListeners = new CopyOnWriteArrayList();
/**
* Add an <code>ItemStateListener</code>.
* @param listener the new listener to be informed on modifications
*/
public void addListener(ItemStateListener listener) {
- synchronized (listeners) {
- assert (!listeners.contains(listener));
- listeners.add(listener);
- }
+ assert (!listeners.contains(listener));
+ listeners.add(listener);
+
if (listener instanceof NodeStateListener) {
- synchronized (nsListeners) {
- assert (!nsListeners.contains(listener));
- nsListeners.add(listener);
- }
+ assert (!nsListeners.contains(listener));
+ nsListeners.add(listener);
}
}
@@ -60,13 +58,9 @@
*/
public void removeListener(ItemStateListener listener) {
if (listener instanceof NodeStateListener) {
- synchronized (nsListeners) {
- nsListeners.remove(listener);
- }
- }
- synchronized (listeners) {
- listeners.remove(listener);
+ nsListeners.remove(listener);
}
+ listeners.remove(listener);
}
/**
@@ -74,14 +68,9 @@
* @param created created state.
*/
public void notifyStateCreated(ItemState created) {
- ItemStateListener[] la;
- synchronized (listeners) {
- la = (ItemStateListener[]) listeners.toArray(new ItemStateListener[listeners.size()]);
- }
- for (int i = 0; i < la.length; i++) {
- if (la[i] != null) {
- la[i].stateCreated(created);
- }
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ ((ItemStateListener) iter.next()).stateCreated(created);
}
}
@@ -90,14 +79,9 @@
* @param modified modified state.
*/
public void notifyStateModified(ItemState modified) {
- ItemStateListener[] la;
- synchronized (listeners) {
- la = (ItemStateListener[]) listeners.toArray(new ItemStateListener[listeners.size()]);
- }
- for (int i = 0; i < la.length; i++) {
- if (la[i] != null) {
- la[i].stateModified(modified);
- }
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ ((ItemStateListener) iter.next()).stateModified(modified);
}
}
@@ -106,14 +90,9 @@
* @param destroyed destroyed state.
*/
public void notifyStateDestroyed(ItemState destroyed) {
- ItemStateListener[] la;
- synchronized (listeners) {
- la = (ItemStateListener[]) listeners.toArray(new ItemStateListener[listeners.size()]);
- }
- for (int i = 0; i < la.length; i++) {
- if (la[i] != null) {
- la[i].stateDestroyed(destroyed);
- }
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ ((ItemStateListener) iter.next()).stateDestroyed(destroyed);
}
}
@@ -122,14 +101,9 @@
* @param discarded discarded state.
*/
public void notifyStateDiscarded(ItemState discarded) {
- ItemStateListener[] la;
- synchronized (listeners) {
- la = (ItemStateListener[]) listeners.toArray(new ItemStateListener[listeners.size()]);
- }
- for (int i = 0; i < la.length; i++) {
- if (la[i] != null) {
- la[i].stateDiscarded(discarded);
- }
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ ((ItemStateListener) iter.next()).stateDiscarded(discarded);
}
}
@@ -141,17 +115,9 @@
* @param id id of new node
*/
public void notifyNodeAdded(NodeState state, QName name, int index, NodeId id) {
- // small optimization as there are only a few clients interested in node state modifications
- if (!nsListeners.isEmpty()) {
- NodeStateListener[] la;
- synchronized (nsListeners) {
- la = (NodeStateListener[]) nsListeners.toArray(new NodeStateListener[nsListeners.size()]);
- }
- for (int i = 0; i < la.length; i++) {
- if (la[i] != null) {
- la[i].nodeAdded(state, name, index, id);
- }
- }
+ Iterator iter = nsListeners.iterator();
+ while (iter.hasNext()) {
+ ((NodeStateListener) iter.next()).nodeAdded(state, name, index, id);
}
}
@@ -160,17 +126,9 @@
* @param state node state that changed
*/
public void notifyNodesReplaced(NodeState state) {
- // small optimization as there are only a few clients interested in node state modifications
- if (!nsListeners.isEmpty()) {
- NodeStateListener[] la;
- synchronized (nsListeners) {
- la = (NodeStateListener[]) nsListeners.toArray(new NodeStateListener[nsListeners.size()]);
- }
- for (int i = 0; i < la.length; i++) {
- if (la[i] != null) {
- la[i].nodesReplaced(state);
- }
- }
+ Iterator iter = nsListeners.iterator();
+ while (iter.hasNext()) {
+ ((NodeStateListener) iter.next()).nodesReplaced(state);
}
}
@@ -179,17 +137,9 @@
* @param state node state that changed
*/
public void notifyNodeModified(NodeState state) {
- // small optimization as there are only a few clients interested in node state modifications
- if (!nsListeners.isEmpty()) {
- NodeStateListener[] la;
- synchronized (nsListeners) {
- la = (NodeStateListener[]) nsListeners.toArray(new NodeStateListener[nsListeners.size()]);
- }
- for (int i = 0; i < la.length; i++) {
- if (la[i] != null) {
- la[i].nodeModified(state);
- }
- }
+ Iterator iter = nsListeners.iterator();
+ while (iter.hasNext()) {
+ ((NodeStateListener) iter.next()).nodeModified(state);
}
}
@@ -201,17 +151,9 @@
* @param id id of new node
*/
public void notifyNodeRemoved(NodeState state, QName name, int index, NodeId id) {
- // small optimization as there are only a few clients interested in node state modifications
- if (!nsListeners.isEmpty()) {
- NodeStateListener[] la;
- synchronized (nsListeners) {
- la = (NodeStateListener[]) nsListeners.toArray(new NodeStateListener[nsListeners.size()]);
- }
- for (int i = 0; i < la.length; i++) {
- if (la[i] != null) {
- la[i].nodeRemoved(state, name, index, id);
- }
- }
+ Iterator iter = nsListeners.iterator();
+ while (iter.hasNext()) {
+ ((NodeStateListener) iter.next()).nodeRemoved(state, name, index, id);
}
}
}