diff --git a/src/dorkbox/network/rmi/ConnectionRmiImplSupport.java b/src/dorkbox/network/rmi/ConnectionRmiImplSupport.java index 14953311..cd835fc9 100644 --- a/src/dorkbox/network/rmi/ConnectionRmiImplSupport.java +++ b/src/dorkbox/network/rmi/ConnectionRmiImplSupport.java @@ -48,12 +48,9 @@ class ConnectionRmiImplSupport implements ConnectionRmiSupport { private final LockFreeIntMap rmiRegistrationCallbacks; private volatile int rmiCallbackId = 0; - final ConnectionImpl connection; protected final Logger logger; - - protected ConnectionRmiImplSupport(final ConnectionImpl connection, final RmiBridge rmiGlobalBridge) { this.connection = connection; @@ -194,16 +191,68 @@ class ConnectionRmiImplSupport implements ConnectionRmiSupport { return false; } + void runCallback(final Class interfaceClass, final int callbackId, final Object remoteObject) { + RemoteObjectCallback callback = rmiRegistrationCallbacks.remove(callbackId); + + try { + //noinspection unchecked + callback.created(remoteObject); + } catch (Exception e) { + logger.error("Error getting or creating the remote object " + interfaceClass, e); + } + } + + /** + * Used by RMI by the LOCAL side when setting up the to fetch an object for the REMOTE side + * + * @return the registered ID for a specific object, or RmiBridge.INVALID_RMI if there was no ID. + */ + public + int getRegisteredId(final T object) { + // always check global before checking local, because less contention on the synchronization + int objectId = rmiGlobalBridge.getRegisteredId(object); + if (objectId != RmiBridge.INVALID_RMI) { + return objectId; + } + else { + // might return RmiBridge.INVALID_RMI; + return rmiLocalBridge.getRegisteredId(object); + } + } + + /** + * This is used by RMI for the REMOTE side, to get the implementation + * + * @param objectId this is the RMI object ID + */ + public + Object getImplementationObject(final int objectId) { + if (RmiBridge.isGlobal(objectId)) { + return rmiGlobalBridge.getRegisteredObject(objectId); + } else { + return rmiLocalBridge.getRegisteredObject(objectId); + } + } + + /** + * Removes a proxy object from the system + */ + void removeProxyObject(final RmiProxyHandler rmiProxyHandler) { + proxyListeners.remove(rmiProxyHandler.getListener()); + proxyIdCache.remove(rmiProxyHandler.rmiObjectId); + } + /** * For network connections, the interface class kryo ID == implementation class kryo ID, so they switch automatically. * For local connections, we have to switch it appropriately in the LocalRmiProxy */ - public - RmiRegistration createNewRmiObject(final NetworkSerializationManager serialization, final Class interfaceClass, final Class implementationClass, final int callbackId) { + RmiRegistration createNewRmiObject(final NetworkSerializationManager serialization, final Class interfaceClass, final int callbackId) { KryoExtra kryo = null; Object object = null; int rmiId = 0; + Class implementationClass = serialization.getRmiImpl(interfaceClass); + try { kryo = serialization.takeKryo(); @@ -293,50 +342,6 @@ class ConnectionRmiImplSupport implements ConnectionRmiSupport { return new RmiRegistration(interfaceClass, rmiId, callbackId, object); } - public - void runCallback(final Class interfaceClass, final int callbackId, final Object remoteObject) { - RemoteObjectCallback callback = rmiRegistrationCallbacks.remove(callbackId); - - try { - //noinspection unchecked - callback.created(remoteObject); - } catch (Exception e) { - logger.error("Error getting or creating the remote object " + interfaceClass, e); - } - } - - /** - * Used by RMI by the LOCAL side when setting up the to fetch an object for the REMOTE side - * - * @return the registered ID for a specific object, or RmiBridge.INVALID_RMI if there was no ID. - */ - public - int getRegisteredId(final T object) { - // always check global before checking local, because less contention on the synchronization - int objectId = rmiGlobalBridge.getRegisteredId(object); - if (objectId != RmiBridge.INVALID_RMI) { - return objectId; - } - else { - // might return RmiBridge.INVALID_RMI; - return rmiLocalBridge.getRegisteredId(object); - } - } - - /** - * This is used by RMI for the REMOTE side, to get the implementation - * - * @param objectId this is the RMI object ID - */ - public - Object getImplementationObject(final int objectId) { - if (RmiBridge.isGlobal(objectId)) { - return rmiGlobalBridge.getRegisteredObject(objectId); - } else { - return rmiLocalBridge.getRegisteredObject(objectId); - } - } - /** * Warning. This is an advanced method. You should probably be using {@link Connection#createRemoteObject(Class, RemoteObjectCallback)} *

diff --git a/src/dorkbox/network/rmi/ConnectionRmiLocalSupport.java b/src/dorkbox/network/rmi/ConnectionRmiLocalSupport.java index 5bc05eee..fa83b001 100644 --- a/src/dorkbox/network/rmi/ConnectionRmiLocalSupport.java +++ b/src/dorkbox/network/rmi/ConnectionRmiLocalSupport.java @@ -136,9 +136,7 @@ class ConnectionRmiLocalSupport extends ConnectionRmiImplSupport { EndPoint endPoint = connection.getEndPoint(); NetworkSerializationManager serialization = endPoint.getSerialization(); - Class rmiImpl = serialization.getRmiImpl(registration.interfaceClass); - - RmiRegistration registrationResult = createNewRmiObject(serialization, interfaceClass, rmiImpl, callbackId); + RmiRegistration registrationResult = createNewRmiObject(serialization, interfaceClass, callbackId); connection.send(registrationResult); // connection transport is flushed in calling method (don't need to do it here) } diff --git a/src/dorkbox/network/rmi/ConnectionRmiNetworkSupport.java b/src/dorkbox/network/rmi/ConnectionRmiNetworkSupport.java index e8a8ffff..6a1c958f 100644 --- a/src/dorkbox/network/rmi/ConnectionRmiNetworkSupport.java +++ b/src/dorkbox/network/rmi/ConnectionRmiNetworkSupport.java @@ -54,11 +54,8 @@ class ConnectionRmiNetworkSupport extends ConnectionRmiImplSupport { // have to lookup the implementation class NetworkSerializationManager serialization = connection.getEndPoint().getSerialization(); - Class rmiImpl = serialization.getRmiImpl(interfaceClass); - - // For network connections, the interface class kryo ID == implementation class kryo ID, so they switch automatically. - RmiRegistration registrationResult = createNewRmiObject(serialization, interfaceClass, rmiImpl, callbackId); + RmiRegistration registrationResult = createNewRmiObject(serialization, interfaceClass, callbackId); connection.send(registrationResult); // connection transport is flushed in calling method (don't need to do it here) } diff --git a/src/dorkbox/network/rmi/RmiProxyHandler.java b/src/dorkbox/network/rmi/RmiProxyHandler.java index fcd577b8..98a67ed5 100644 --- a/src/dorkbox/network/rmi/RmiProxyHandler.java +++ b/src/dorkbox/network/rmi/RmiProxyHandler.java @@ -168,7 +168,7 @@ class RmiProxyHandler implements InvocationHandler { String name = method.getName(); if (name.equals("close")) { - rmiSupport.removeAllListeners(); + rmiSupport.removeProxyObject(this); return null; } else if (name.equals("setResponseTimeout")) {