You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gd...@apache.org on 2004/05/24 15:02:55 UTC
cvs commit: incubator-geronimo/sandbox/messaging/src/test/org/apache/geronimo/messaging/reference ReferenceManagerImplTest.java MockReferenceableImpl.java
gdamour 2004/05/24 06:02:55
Modified: sandbox/messaging/src/java/org/apache/geronimo/messaging/reference
ReferenceableManager.java
ReferenceableManagerImpl.java
sandbox/messaging/src/test/org/apache/geronimo/messaging/reference
ReferenceManagerImplTest.java
MockReferenceableImpl.java
Log:
When a Referenceable is registered twice, the returned
ReferenceableInfo have the same (Referenceable) identifier.
Revision Changes Path
1.2 +8 -1 incubator-geronimo/sandbox/messaging/src/java/org/apache/geronimo/messaging/reference/ReferenceableManager.java
Index: ReferenceableManager.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/sandbox/messaging/src/java/org/apache/geronimo/messaging/reference/ReferenceableManager.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReferenceableManager.java 11 May 2004 12:06:42 -0000 1.1
+++ ReferenceableManager.java 24 May 2004 13:02:55 -0000 1.2
@@ -42,6 +42,13 @@
/**
* Registers a Referenceable.
+ * <BR>
+ * If the same Referenceable is registered twice, then the returned
+ * ReferenceableInfos have the same identifier.
+ * <BR>
+ * If a Referenceable is equal to another Referenceable via the equals
+ * contract, then the ReferenceableInfos have distinct Referenceable
+ * identifiers.
*
* @param aReference Referenceable to be registered.
* @return Referenceable meta-data.
1.2 +34 -18 incubator-geronimo/sandbox/messaging/src/java/org/apache/geronimo/messaging/reference/ReferenceableManagerImpl.java
Index: ReferenceableManagerImpl.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/sandbox/messaging/src/java/org/apache/geronimo/messaging/reference/ReferenceableManagerImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReferenceableManagerImpl.java 11 May 2004 12:06:42 -0000 1.1
+++ ReferenceableManagerImpl.java 24 May 2004 13:02:55 -0000 1.2
@@ -18,6 +18,7 @@
package org.apache.geronimo.messaging.reference;
import java.util.HashMap;
+import java.util.IdentityHashMap;
import java.util.Map;
import org.apache.geronimo.messaging.AbstractEndPoint;
@@ -41,13 +42,20 @@
/**
* Used to generate reference identifiers.
*/
- private static int seqID = 0;
+ private int seqID = 0;
+ private final Object mapsLock = new Object();
+
/**
* identifier to Referenceable map.
*/
- private final Map registered;
-
+ private final Map idToReferenceable;
+
+ /**
+ * Referenceable to ReferenceableInfo map.
+ */
+ private final IdentityHashMap referenceableToID;
+
/**
* Creates a manager mounted by the specified node and having the specified
* identifier.
@@ -58,7 +66,9 @@
public ReferenceableManagerImpl(Node aNode, Object anID) {
super(aNode, anID);
- registered = new HashMap();
+ idToReferenceable = new HashMap();
+ referenceableToID = new IdentityHashMap();
+
// Adds the ReferenceReplacerResolver to the current chain.
node.getReplacerResolver().append(new ReferenceReplacerResolver(this));
}
@@ -70,8 +80,8 @@
// The referenceble is contained by this EndPoint. Returns it.
Integer refID = new Integer(aReferenceInfo.getRefID());
Object opaque;
- synchronized(registered) {
- opaque = registered.get(refID);
+ synchronized(idToReferenceable) {
+ opaque = idToReferenceable.get(refID);
}
if ( null == opaque ) {
throw new IllegalArgumentException("Referenceable {" +
@@ -86,26 +96,32 @@
}
public ReferenceableInfo register(Referenceable aReference) {
- Integer refID;
- synchronized(registered) {
- refID = new Integer(++seqID);
- registered.put(refID, aReference);
+ ReferenceableInfo info;
+ synchronized(mapsLock) {
+ // Checks if the Referenceable has already been registered.
+ info = (ReferenceableInfo) referenceableToID.get(aReference);
+ if ( null == info ) {
+ Integer refID = new Integer(++seqID);
+ info = new ReferenceableInfo(node.getNodeInfo(), id,
+ aReference.getClass().getInterfaces(), refID.intValue());
+ idToReferenceable.put(refID, aReference);
+ referenceableToID.put(aReference, info);
+ }
}
- return new ReferenceableInfo(node.getNodeInfo(), id,
- aReference.getClass().getInterfaces(),
- refID.intValue());
+ return info;
}
public void unregister(ReferenceableInfo aReferenceInfo) {
- synchronized(registered) {
- registered.remove(new Integer(aReferenceInfo.getRefID()));
+ synchronized(mapsLock) {
+ idToReferenceable.remove(new Integer(aReferenceInfo.getRefID()));
+ referenceableToID.remove(aReferenceInfo);
}
}
public Object invoke(int anId, Request aRequest) throws Exception {
Referenceable reference;
- synchronized(registered) {
- reference = (Referenceable) registered.get(new Integer(anId));
+ synchronized(mapsLock) {
+ reference = (Referenceable) idToReferenceable.get(new Integer(anId));
}
if ( null == reference ) {
throw new IllegalArgumentException("Unknown Reference.");
1.3 +20 -1 incubator-geronimo/sandbox/messaging/src/test/org/apache/geronimo/messaging/reference/ReferenceManagerImplTest.java
Index: ReferenceManagerImplTest.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/sandbox/messaging/src/test/org/apache/geronimo/messaging/reference/ReferenceManagerImplTest.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ReferenceManagerImplTest.java 24 May 2004 12:03:34 -0000 1.2
+++ ReferenceManagerImplTest.java 24 May 2004 13:02:55 -0000 1.3
@@ -67,4 +67,23 @@
Object opaque = manager.factoryProxy(info);
assertTrue(reference == opaque);
}
+
+ public void testRegister() throws Exception {
+ InetAddress address = InetAddress.getLocalHost();
+ NodeInfo nodeInfo = new NodeInfo("Node", address, 8081);
+ MockNode node = new MockNode();
+ node.setNodeInfo(nodeInfo);
+
+ ReferenceableManager manager = new ReferenceableManagerImpl(node, "A");
+ MockReferenceableImpl reference1 = new MockReferenceableImpl();
+
+ ReferenceableInfo info1 = manager.register(reference1);
+ ReferenceableInfo info2 = manager.register(reference1);
+ assertTrue(info1.getRefID() == info2.getRefID());
+
+ MockReferenceableImpl reference2 = new MockReferenceableImpl();
+ ReferenceableInfo info3 = manager.register(reference2);
+ assertTrue(info1.getRefID() != info3.getRefID());
+ }
+
}
1.2 +11 -0 incubator-geronimo/sandbox/messaging/src/test/org/apache/geronimo/messaging/reference/MockReferenceableImpl.java
Index: MockReferenceableImpl.java
===================================================================
RCS file: /home/cvs/incubator-geronimo/sandbox/messaging/src/test/org/apache/geronimo/messaging/reference/MockReferenceableImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- MockReferenceableImpl.java 11 May 2004 12:06:43 -0000 1.1
+++ MockReferenceableImpl.java 24 May 2004 13:02:55 -0000 1.2
@@ -31,4 +31,15 @@
return param;
}
+ public int hashCode() {
+ return 1;
+ }
+
+ public boolean equals(Object obj) {
+ if ( false == obj instanceof MockReferenceableImpl ) {
+ return false;
+ }
+ return true;
+ }
+
}