package io.craft.atom.rpc; import io.craft.atom.protocol.rpc.model.RpcBody; import io.craft.atom.protocol.rpc.model.RpcHeader; import io.craft.atom.protocol.rpc.model.RpcMessage; import io.craft.atom.protocol.rpc.model.RpcMethod; import io.craft.atom.protocol.rpc.model.RpcOption; import java.util.concurrent.atomic.AtomicLong; /** * Factory and utility methods for {@link RpcMessage} * * @author mindwind * @version 1.0, Aug 12, 2014 */ public class RpcMessages { private static final AtomicLong ID_GENERATOR = new AtomicLong(0); private static RpcMessage newRpcMessage() { RpcMessage rm = new RpcMessage(); RpcHeader rh = new RpcHeader(); RpcBody rb = new RpcBody(); rm.setHeader(rh); rm.setBody(rb); return rm; } // ~ ---------------------------------------------------------------------------------------------- rpc req message public static RpcMessage newHbRequestRpcMessage() { RpcMessage req = newRpcMessage(); RpcBody body = req.getBody(); body.setRpcOption(new RpcOption()); req.setId(ID_GENERATOR.incrementAndGet()); req.setHeartbeat(true); return req; } public static RpcMessage newRequestRpcMessage(Class<?> rpcInterface, String methodName, Class<?>[] parameterTypes, Object[] parameters) { RpcMessage req = newRpcMessage(); req.setId(ID_GENERATOR.incrementAndGet()); RpcBody body = req.getBody(); body.setRpcInterface(rpcInterface); body.setRpcOption(new RpcOption()); RpcMethod method = new RpcMethod(); method.setName(methodName); method.setParameterTypes(parameterTypes); method.setParameters(parameters); body.setRpcMethod(method); return req; } // ~ ---------------------------------------------------------------------------------------------- rpc rsp message public static RpcMessage newHbResponseRpcMessage(long id) { RpcMessage rsp = newRpcMessage(); rsp.setId(id); rsp.setHeartbeat(true); rsp.setResponse(true); return rsp; } public static RpcMessage newRsponseRpcMessage(long id, Exception e) { // Clear server side exception stack trace to avoid propagating to client side e.setStackTrace(new StackTraceElement[] {}); RpcMessage rsp = newRpcMessage(); rsp.setId(id); rsp.setResponse(true); rsp.setException(e); return rsp; } public static RpcMessage newRsponseRpcMessage(long id, Object returnObject) { RpcMessage rsp = newRpcMessage(); rsp.setId(id); rsp.setResponse(true); rsp.setReturnObject(returnObject); return rsp; } public static Object unpackResponseMessage(RpcMessage rsp) throws Exception { // void if (rsp == null) { return null; } // exception Exception e = rsp.getException(); if (e != null) { throw e; } // return object return rsp.getReturnObject(); } }