package org.jwebsocket.plugins.rpc;
import java.util.List;
import javolution.util.FastList;
import org.jwebsocket.token.Token;
import org.jwebsocket.token.TokenFactory;
public abstract class AbstractRpc {
private static boolean defaultSpawnThread = false ;
public static void setDefaultSpanwThread (boolean aDefaultValue) {
defaultSpawnThread = aDefaultValue;
}
private Boolean mSpawnThread = null;
private String mClassname;
private String mMethod;
private List mArg = null;
protected AbstractRpc () {};
public AbstractRpc (String aClassname, String aMethod) {
this(aClassname, aMethod, defaultSpawnThread);
}
/**
* @param aClassname the classname to call
* @param aMethod the method to call
*/
public AbstractRpc (String aClassname, String aMethod, boolean aSpawnTread) {
mClassname = aClassname;
mMethod = aMethod;
mSpawnThread = aSpawnTread ;
}
/**
* The token should contains all the necessary informations.
* Can be usefull to create a direct call from an already-created token
* @param aToken
* @throws RrpcRightNotGrantedException
* @throws RrpcConnectorNotFoundException
*/
public AbstractRpc (Token aToken) {
mClassname = aToken.getString(CommonRpcPlugin.RRPC_KEY_CLASSNAME);
mMethod = aToken.getString(CommonRpcPlugin.RRPC_KEY_METHOD);
mSpawnThread = aToken.getBoolean(CommonRpcPlugin.RRPC_KEY_SPAWNTHREAD, defaultSpawnThread);
//First try to get a list of arguments
List lListOfArg = aToken.getList(CommonRpcPlugin.RRPC_KEY_ARGS);
if (lListOfArg != null) {
mArg = lListOfArg ;
} else {
//If there is no list, get a simple object as argument
Object lObject = aToken.getObject(CommonRpcPlugin.RRPC_KEY_ARGS);
if (lObject != null) {
mArg = new FastList();
mArg.add(lObject);
}
}
}
/**
* Send the Objects you want to the remote procedure.
* Create a list from these objects.
* @param aArg objects you want to send to the client.
* @return
*/
public AbstractRpc send (Object... aArg){
if (aArg != null) {
mArg = new FastList();
for (int i = 0; i<aArg.length; i++) {
mArg.add(aArg[i]);
}
}
return this ;
}
/**
* Directly send this list of object to the remote procedure
* @param aArgs a List of arguments already built
* @return
*/
public AbstractRpc sendListOfArgs (List aArgs){
mArg = aArgs;
return this;
}
/**
* Make the call.
*/
public Token call() {
Token rpcToken = TokenFactory.createToken("rpc");
rpcToken.setNS(CommonRpcPlugin.NS_RPC_DEFAULT);
rpcToken.setString(CommonRpcPlugin.RRPC_KEY_CLASSNAME, mClassname);
rpcToken.setString(CommonRpcPlugin.RRPC_KEY_METHOD, mMethod);
rpcToken.setList(CommonRpcPlugin.RRPC_KEY_ARGS, mArg);
boolean lSpawnThread ;
if (mSpawnThread == null) {
lSpawnThread = defaultSpawnThread;
} else {
lSpawnThread = mSpawnThread ;
}
rpcToken.setBoolean("spawnThread", lSpawnThread);
return rpcToken ;
}
}