package io.emax.cosigner.bitcoin;
import com.googlecode.jsonrpc4j.JsonRpcHttpClient;
import com.googlecode.jsonrpc4j.ProxyUtil;
import io.emax.cosigner.bitcoin.bitcoindrpc.BitcoindRpc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URL;
/**
* Static connection to a bitcoind RPC server.
*
* @author Tom
*/
public class BitcoinResource {
private static final Logger LOGGER = LoggerFactory.getLogger(BitcoinResource.class);
private static final BitcoinResource serverResource = new BitcoinResource();
private BitcoinConfiguration config;
private JsonRpcHttpClient client;
private BitcoindRpc bitcoindRpc;
public static BitcoinResource getResource() {
return serverResource;
}
private BitcoinResource() {
this.config = new BitcoinConfiguration();
try {
// Set up our RPC authentication
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(config.getDaemonUser(),
config.getDaemonPassword().toCharArray());
}
});
this.client = new JsonRpcHttpClient(new URL(config.getDaemonConnectionString()));
} catch (MalformedURLException e) {
LOGGER.error(null, e);
}
}
public BitcoinResource(BitcoindRpc rpc) {
this.bitcoindRpc = rpc;
}
public void setBitcoindRpc(BitcoindRpc rpc) {
this.bitcoindRpc = rpc;
}
/**
* Get an RPC object that is connected to a bitcoind node.
*
* @return RPC object
*/
public BitcoindRpc getBitcoindRpc() {
if (bitcoindRpc == null) {
this.bitcoindRpc =
ProxyUtil.createClientProxy(getClass().getClassLoader(), BitcoindRpc.class, client);
}
return this.bitcoindRpc;
}
}