protected RpcResponse doExecute(RpcRequest request) {
    Connection c = null;
    AccessVerifyConnectionSpec auth = null;
    try {
      try {
        request = validateRequest(request);
        RpcHost host = request.getHost();
        auth = AccessVerifyConnectionSpec.create(request.getCredentials().toString());
        c = this.connectionFactory.getConnection(host, auth);
      } catch (RpcException e) {
        if (getRpcListener() != null) getRpcListener().onRpc(new RpcEvent(request, e));
        throw getExceptionTranslator()
            .translate("open", RpcUriUtils.sanitize(request.getURI(), auth), e);
      }
      try {
        logger.debug("executing {}", RpcUriUtils.sanitize(request.getURI(), auth));

        RpcResponse response = c.send(request);

        logger.debug("received  {}", RpcUriUtils.sanitize(request.getURI(), auth));

        if (getRpcListener() != null) getRpcListener().onRpc(new RpcEvent(request, response));

        return response;
      } catch (RpcException e) {
        if (getRpcListener() != null) getRpcListener().onRpc(new RpcEvent(request, e));
        throw getExceptionTranslator()
            .translate("send", RpcUriUtils.sanitize(request.getURI(), auth), e);
      }
    } catch (DataAccessException e) {
      logger.error("error in  " + RpcUriUtils.sanitize(request.getURI(), auth), e);
      throw e;
    } finally {
      try {
        if (c != null) c.close();
      } catch (RpcException e) {
        if (getRpcListener() != null) getRpcListener().onRpc(new RpcEvent(request, e));
        throw getExceptionTranslator()
            .translate("close", RpcUriUtils.sanitize(request.getURI(), auth), e);
      }
    }
  }
 protected ConnectionSpec createConnectionSpec(RpcRequest request) {
   String credentials = request.getCredentials();
   if (StringUtils.hasText(credentials))
     return AccessVerifyConnectionSpec.create(request.getCredentials());
   else return new AnonymousConnectionSpec();
 }