@ -32,12 +32,14 @@
package com.jme3.network.rmi ;
package com.jme3.network.rmi ;
import com.jme3.network.Client ;
import com.jme3.network.connection.Client ;
import com.jme3.network.ClientStateListener ;
import com.jme3.network.connection.Server ;
import com.jme3.network.ClientStateListener.DisconnectInfo ;
import com.jme3.network.events.ConnectionListener ;
import com.jme3.network.ConnectionListener ;
import com.jme3.network.events.MessageListener ;
import com.jme3.network.HostedConnection ;
import com.jme3.network.message.Message ;
import com.jme3.network.Message ;
import com.jme3.network.MessageListener ;
import com.jme3.network.Server ;
import com.jme3.network.serializing.Serializer ;
import com.jme3.network.serializing.Serializer ;
import com.jme3.util.IntMap ;
import com.jme3.util.IntMap ;
import com.jme3.util.IntMap.Entry ;
import com.jme3.util.IntMap.Entry ;
@ -45,11 +47,12 @@ import java.io.IOException;
import java.lang.reflect.InvocationTargetException ;
import java.lang.reflect.InvocationTargetException ;
import java.lang.reflect.Method ;
import java.lang.reflect.Method ;
import java.lang.reflect.Proxy ;
import java.lang.reflect.Proxy ;
import java.util.ArrayList ;
import java.util.HashMap ;
import java.util.HashMap ;
import java.util.logging.Level ;
import java.util.logging.Level ;
import java.util.logging.Logger ;
import java.util.logging.Logger ;
public class ObjectStore implements MessageListener , ConnectionListener {
public class ObjectStore {
private static final Logger logger = Logger . getLogger ( ObjectStore . class . getName ( ) ) ;
private static final Logger logger = Logger . getLogger ( ObjectStore . class . getName ( ) ) ;
@ -67,6 +70,9 @@ public class ObjectStore implements MessageListener, ConnectionListener {
private Client client ;
private Client client ;
private Server server ;
private Server server ;
private ClientEventHandler clientEventHandler = new ClientEventHandler ( ) ;
private ServerEventHandler serverEventHandler = new ServerEventHandler ( ) ;
// Local object ID counter
// Local object ID counter
private volatile short objectIdCounter = 0 ;
private volatile short objectIdCounter = 0 ;
@ -85,6 +91,38 @@ public class ObjectStore implements MessageListener, ConnectionListener {
private final Object receiveObjectLock = new Object ( ) ;
private final Object receiveObjectLock = new Object ( ) ;
public class ServerEventHandler implements MessageListener < HostedConnection > ,
ConnectionListener {
public void messageReceived ( HostedConnection source , Message m ) {
onMessage ( source , m ) ;
}
public void connectionAdded ( Server server , HostedConnection conn ) {
onConnection ( conn ) ;
}
public void connectionRemoved ( Server server , HostedConnection conn ) {
}
}
public class ClientEventHandler implements MessageListener ,
ClientStateListener {
public void messageReceived ( Object source , Message m ) {
onMessage ( null , m ) ;
}
public void clientConnected ( Client c ) {
onConnection ( null ) ;
}
public void clientDisconnected ( Client c , DisconnectInfo info ) {
}
}
static {
static {
Serializer s = new RmiSerializer ( ) ;
Serializer s = new RmiSerializer ( ) ;
Serializer . registerClass ( RemoteObjectDefMessage . class , s ) ;
Serializer . registerClass ( RemoteObjectDefMessage . class , s ) ;
@ -94,18 +132,20 @@ public class ObjectStore implements MessageListener, ConnectionListener {
public ObjectStore ( Client client ) {
public ObjectStore ( Client client ) {
this . client = client ;
this . client = client ;
client . addMessageListener ( this , RemoteObjectDefMessage . class ,
client . addMessageListener ( clientEventHandler ,
RemoteObjectDefMessage . class ,
RemoteMethodCallMessage . class ,
RemoteMethodCallMessage . class ,
RemoteMethodReturnMessage . class ) ;
RemoteMethodReturnMessage . class ) ;
client . addConnectionListener ( this ) ;
client . addClientStateListener ( clientEventHandler ) ;
}
}
public ObjectStore ( Server server ) {
public ObjectStore ( Server server ) {
this . server = server ;
this . server = server ;
server . addMessageListener ( this , RemoteObjectDefMessage . class ,
server . addMessageListener ( serverEventHandler ,
RemoteObjectDefMessage . class ,
RemoteMethodCallMessage . class ,
RemoteMethodCallMessage . class ,
RemoteMethodReturnMessage . class ) ;
RemoteMethodReturnMessage . class ) ;
server . addConnectionListener ( this ) ;
server . addConnectionListener ( serverEventHandler ) ;
}
}
private ObjectDef makeObjectDef ( LocalObject localObj ) {
private ObjectDef makeObjectDef ( LocalObject localObj ) {
@ -122,7 +162,15 @@ public class ObjectStore implements MessageListener, ConnectionListener {
localObj . objectName = name ;
localObj . objectName = name ;
localObj . objectId = objectIdCounter + + ;
localObj . objectId = objectIdCounter + + ;
localObj . theObject = obj ;
localObj . theObject = obj ;
localObj . methods = obj . getClass ( ) . getMethods ( ) ;
//localObj.methods = obj.getClass().getMethods();
ArrayList < Method > methodList = new ArrayList < Method > ( ) ;
for ( Method method : obj . getClass ( ) . getMethods ( ) ) {
if ( method . getDeclaringClass ( ) = = obj . getClass ( ) ) {
methodList . add ( method ) ;
}
}
localObj . methods = methodList . toArray ( new Method [ methodList . size ( ) ] ) ;
// Put it in the store
// Put it in the store
localObjects . put ( localObj . objectId , localObj ) ;
localObjects . put ( localObj . objectId , localObj ) ;
@ -180,7 +228,6 @@ public class ObjectStore implements MessageListener, ConnectionListener {
pendingInvocations . put ( call . invocationId , invoke ) ;
pendingInvocations . put ( call . invocationId , invoke ) ;
}
}
try {
if ( server ! = null ) {
if ( server ! = null ) {
remoteObj . client . send ( call ) ;
remoteObj . client . send ( call ) ;
logger . log ( Level . INFO , "Server: Sending {0}" , call ) ;
logger . log ( Level . INFO , "Server: Sending {0}" , call ) ;
@ -188,9 +235,6 @@ public class ObjectStore implements MessageListener, ConnectionListener {
client . send ( call ) ;
client . send ( call ) ;
logger . log ( Level . INFO , "Client: Sending {0}" , call ) ;
logger . log ( Level . INFO , "Client: Sending {0}" , call ) ;
}
}
} catch ( IOException ex ) {
ex . printStackTrace ( ) ;
}
if ( invoke ! = null ) {
if ( invoke ! = null ) {
synchronized ( invoke ) {
synchronized ( invoke ) {
@ -210,7 +254,7 @@ public class ObjectStore implements MessageListener, ConnectionListener {
}
}
}
}
public void messageReceived ( Message message ) {
private void onMessage ( HostedConnection source , Message message ) {
// Might want to do more strict validation of the data
// Might want to do more strict validation of the data
// in the message to prevent crashes
// in the message to prevent crashes
@ -219,7 +263,7 @@ public class ObjectStore implements MessageListener, ConnectionListener {
ObjectDef [ ] defs = defMsg . objects ;
ObjectDef [ ] defs = defMsg . objects ;
for ( ObjectDef def : defs ) {
for ( ObjectDef def : defs ) {
RemoteObject remoteObject = new RemoteObject ( this , message . getClient ( ) ) ;
RemoteObject remoteObject = new RemoteObject ( this , source ) ;
remoteObject . objectId = ( short ) def . objectId ;
remoteObject . objectId = ( short ) def . objectId ;
remoteObject . methodDefs = def . methodDefs ;
remoteObject . methodDefs = def . methodDefs ;
remoteObjects . put ( def . objectName , remoteObject ) ;
remoteObjects . put ( def . objectName , remoteObject ) ;
@ -257,17 +301,13 @@ public class ObjectStore implements MessageListener, ConnectionListener {
RemoteMethodReturnMessage retMsg = new RemoteMethodReturnMessage ( ) ;
RemoteMethodReturnMessage retMsg = new RemoteMethodReturnMessage ( ) ;
retMsg . invocationID = call . invocationId ;
retMsg . invocationID = call . invocationId ;
retMsg . retVal = ret ;
retMsg . retVal = ret ;
try {
if ( server ! = null ) {
if ( server ! = null ) {
call . getClient ( ) . send ( retMsg ) ;
source . send ( retMsg ) ;
logger . log ( Level . INFO , "Server: Sending {0}" , retMsg ) ;
logger . log ( Level . INFO , "Server: Sending {0}" , retMsg ) ;
} else {
} else {
client . send ( retMsg ) ;
client . send ( retMsg ) ;
logger . log ( Level . INFO , "Client: Sending {0}" , retMsg ) ;
logger . log ( Level . INFO , "Client: Sending {0}" , retMsg ) ;
}
}
} catch ( IOException ex ) {
ex . printStackTrace ( ) ;
}
}
}
} else if ( message instanceof RemoteMethodReturnMessage ) {
} else if ( message instanceof RemoteMethodReturnMessage ) {
RemoteMethodReturnMessage retMsg = ( RemoteMethodReturnMessage ) message ;
RemoteMethodReturnMessage retMsg = ( RemoteMethodReturnMessage ) message ;
@ -285,7 +325,7 @@ public class ObjectStore implements MessageListener, ConnectionListener {
}
}
}
}
public void clientConnected ( Client client ) {
private void onConnection ( HostedConnection conn ) {
if ( localObjects . size ( ) > 0 ) {
if ( localObjects . size ( ) > 0 ) {
// send a object definition message
// send a object definition message
ObjectDef [ ] defs = new ObjectDef [ localObjects . size ( ) ] ;
ObjectDef [ ] defs = new ObjectDef [ localObjects . size ( ) ] ;
@ -297,31 +337,14 @@ public class ObjectStore implements MessageListener, ConnectionListener {
RemoteObjectDefMessage defMsg = new RemoteObjectDefMessage ( ) ;
RemoteObjectDefMessage defMsg = new RemoteObjectDefMessage ( ) ;
defMsg . objects = defs ;
defMsg . objects = defs ;
try {
if ( this . client ! = null ) {
if ( this . client ! = null ) {
this . client . send ( defMsg ) ;
this . client . send ( defMsg ) ;
logger . log ( Level . INFO , "Client: Sending {0}" , defMsg ) ;
logger . log ( Level . INFO , "Client: Sending {0}" , defMsg ) ;
} else {
} else {
client . send ( defMsg ) ;
conn . send ( defMsg ) ;
logger . log ( Level . INFO , "Server: Sending {0}" , defMsg ) ;
logger . log ( Level . INFO , "Server: Sending {0}" , defMsg ) ;
}
}
} catch ( IOException ex ) {
ex . printStackTrace ( ) ;
}
}
}
}
}
public void clientDisconnected ( Client client ) {
}
public void messageSent ( Message message ) {
}
public void objectReceived ( Object object ) {
}
public void objectSent ( Object object ) {
}
}
}