@Override public <T> T readObject(ByteBuffer data, Class<T> c) throws IOException { if (c == RemoteObjectDefMessage.class){ return (T) readObjectDefs(data); }else if (c == RemoteMethodCallMessage.class){ return (T) readMethodCall(data); }else if (c == RemoteMethodReturnMessage.class){ return (T) readMethodReturn(data); } return null; }
/** * Callback from InvocationHandler. */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return store.invokeRemoteMethod(this, method, args); }
private ObjectDef makeObjectDef(LocalObject localObj){ ObjectDef def = new ObjectDef(); def.objectName = localObj.objectName; def.objectId = localObj.objectId; def.methods = localObj.methods; return def; }
@Override public void writeObject(ByteBuffer buffer, Object object) throws IOException { // int p = buffer.position(); if (object instanceof RemoteObjectDefMessage){ RemoteObjectDefMessage def = (RemoteObjectDefMessage) object; writeObjectDefs(buffer, def); }else if (object instanceof RemoteMethodCallMessage){ RemoteMethodCallMessage call = (RemoteMethodCallMessage) object; writeMethodCall(buffer, call); }else if (object instanceof RemoteMethodReturnMessage){ RemoteMethodReturnMessage ret = (RemoteMethodReturnMessage) object; writeMethodReturn(buffer, ret); } // p = buffer.position() - p; // System.out.println(object+": uses " + p + " bytes"); }
private MethodDef readMethod(ByteBuffer buffer) throws IOException{ String name = readString(buffer); Class<?> retType = readType(buffer); int numParams = buffer.get() & 0xff; Class<?>[] paramTypes = new Class<?>[numParams]; for (int i = 0; i < numParams; i++){ paramTypes[i] = readType(buffer); } MethodDef def = new MethodDef(); def.name = name; def.paramTypes = paramTypes; def.retType = retType; return def; }
private ObjectDef readObjectDef(ByteBuffer buffer) throws IOException{ ObjectDef def = new ObjectDef(); def.objectId = buffer.getShort(); def.objectName = readString(buffer); int numMethods = buffer.get() & 0xff; MethodDef[] methodDefs = new MethodDef[numMethods]; for (int i = 0; i < numMethods; i++){ methodDefs[i] = readMethod(buffer); } def.methodDefs = methodDefs; return def; }
public void exposeObject(String name, Object obj) throws IOException{ // Create a local object LocalObject localObj = new LocalObject(); localObj.objectName = name; localObj.objectId = objectIdCounter++; localObj.theObject = obj; //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 localObjects.put(localObj.objectId, localObj); // Inform the others of its existence RemoteObjectDefMessage defMsg = new RemoteObjectDefMessage(); defMsg.objects = new ObjectDef[]{ makeObjectDef(localObj) }; if (client != null) { client.send(defMsg); logger.log(Level.FINE, "Client: Sending {0}", defMsg); } else { server.broadcast(defMsg); logger.log(Level.FINE, "Server: Sending {0}", defMsg); } }
private RemoteObjectDefMessage readObjectDefs(ByteBuffer buffer) throws IOException{ RemoteObjectDefMessage defMsg = new RemoteObjectDefMessage(); int numObjs = buffer.get() & 0xff; ObjectDef[] defs = new ObjectDef[numObjs]; for (int i = 0; i < numObjs; i++){ defs[i] = readObjectDef(buffer); } defMsg.objects = defs; return defMsg; }
private void writeObjectDef(ByteBuffer buffer, ObjectDef def) throws IOException{ buffer.putShort((short)def.objectId); writeString(buffer, def.objectName); Method[] methods = def.methods; buffer.put( (byte) methods.length ); for (Method method : methods){ writeMethod(buffer, method); } }
private void writeMethod(ByteBuffer buffer, Method method) throws IOException{ String name = method.getName(); Class<?>[] paramTypes = method.getParameterTypes(); Class<?> returnType = method.getReturnType(); writeString(buffer, name); writeType(buffer, returnType); buffer.put((byte)paramTypes.length); for (Class<?> paramType : paramTypes) writeType(buffer, paramType); }
private void onConnection(HostedConnection conn) { if (localObjects.size() > 0){ // send a object definition message ObjectDef[] defs = new ObjectDef[localObjects.size()]; int i = 0; for (Entry<LocalObject> entry : localObjects){ defs[i] = makeObjectDef(entry.getValue()); i++; } RemoteObjectDefMessage defMsg = new RemoteObjectDefMessage(); defMsg.objects = defs; if (this.client != null){ this.client.send(defMsg); logger.log(Level.FINE, "Client: Sending {0}", defMsg); } else{ conn.send(defMsg); logger.log(Level.FINE, "Server: Sending {0}", defMsg); } } }
RemoteObject remoteObject = new RemoteObject(this, source); remoteObject.objectId = (short)def.objectId; remoteObject.methodDefs = def.methodDefs; RemoteMethodReturnMessage retMsg = new RemoteMethodReturnMessage(); retMsg.invocationID = call.invocationId; retMsg.retVal = ret;
short objectId = remoteObj.objectId; short methodId = methodIdInt.shortValue(); RemoteMethodCallMessage call = new RemoteMethodCallMessage(); call.methodId = methodId; call.objectId = objectId; if (needReturn){ call.invocationId = invocationIdCounter++; invoke = new Invocation();
private void writeObjectDefs(ByteBuffer buffer, RemoteObjectDefMessage defMsg) throws IOException{ ObjectDef[] defs = defMsg.objects; buffer.put( (byte) defs.length ); for (ObjectDef def : defs) writeObjectDef(buffer, def); }
private RemoteMethodReturnMessage readMethodReturn(ByteBuffer buffer) throws IOException{ RemoteMethodReturnMessage ret = new RemoteMethodReturnMessage(); ret.invocationID = buffer.getShort(); if (buffer.get() == (byte)0x01){ ret.retVal = Serializer.readClassAndObject(buffer); } return ret; }
private RemoteMethodCallMessage readMethodCall(ByteBuffer buffer) throws IOException{ RemoteMethodCallMessage call = new RemoteMethodCallMessage(); call.objectId = buffer.getShort(); call.methodId = buffer.getShort(); call.invocationId = buffer.getShort(); int numArgs = buffer.get() & 0xff; if (numArgs > 0){ Object[] args = new Object[numArgs]; for (int i = 0; i < numArgs; i++){ if (buffer.get() == (byte)0x01){ args[i] = Serializer.readClassAndObject(buffer); } } call.args = args; } return call; }
public <T> T getExposedObject(String name, Class<T> type, boolean waitFor) throws InterruptedException{ RemoteObject ro = remoteObjects.get(name); if (ro == null){ if (!waitFor) throw new RuntimeException("Cannot find remote object named: " + name); else{ do { synchronized (receiveObjectLock){ receiveObjectLock.wait(); } } while ( (ro = remoteObjects.get(name)) == null ); } } Object proxy = Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ type }, ro); ro.loadMethods(type); return (T) proxy; }
if (methodEquals(methodDef, method)){ methodMap.put(method, i); continue mapping_search;
public static void createServer(){ serverApp = new SimpleApplication() { @Override public void simpleInitApp() { } }; serverApp.start(); try { Server server = Network.createServer(5110); server.start(); ObjectStore store = new ObjectStore(server); store.exposeObject("access", new ServerAccessImpl()); } catch (IOException ex) { ex.printStackTrace(); } }
public static void main(String[] args) throws IOException, InterruptedException{ Serializer.registerClass(Savable.class, new SavableSerializer()); createServer(); Client client = Network.connectToServer("localhost", 5110); client.start(); ObjectStore store = new ObjectStore(client); ServerAccess access = store.getExposedObject("access", ServerAccess.class, true); boolean result = access.attachChild("Models/Oto/Oto.mesh.xml"); System.out.println(result); } }