class RpcResponseFuture {
    /** rpc server address */
    private String       addr;

    /** rpc server port */
    private InvokeFuture future;

    /**
     * Constructor
     */
    public RpcResponseFuture(String addr, InvokeFuture future) {
        this.addr = addr;
        this.future = future;
    }

    /**
     * Whether the future is done.
     */
    public boolean isDone() {
        return this.future.isDone();
    }

    /**
     * get result with timeout specified
     * 
     * if request done, resolve normal responseObject
     * if request not done, throws InvokeTimeoutException
     */
    public Object get(int timeoutMillis) throws InvokeTimeoutException, RemotingException,
                                        InterruptedException {<FILL_FUNCTION_BODY>}

    public Object get() throws RemotingException, InterruptedException {
        ResponseCommand responseCommand = (ResponseCommand) this.future.waitResponse();
        responseCommand.setInvokeContext(this.future.getInvokeContext());
        return RpcResponseResolver.resolveResponseObject(responseCommand, addr);
    }

}

        this.future.waitResponse(timeoutMillis);
        if (!isDone()) {
            throw new InvokeTimeoutException("Future get result timeout!");
        }
        ResponseCommand responseCommand = (ResponseCommand) this.future.waitResponse();
        responseCommand.setInvokeContext(this.future.getInvokeContext());
        return RpcResponseResolver.resolveResponseObject(responseCommand, addr);
    
<no_super_class>