package config;
import PBFT.PBFTCohort;
import com.google.common.base.Optional;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import java.lang.reflect.Constructor;
import java.net.InetSocketAddress;
import java.security.PrivateKey;
import java.security.PublicKey;
/**
* Created by andrew on 12/4/14.
*/
public class NetworkedNonSigningGroupMember<T extends PBFTCohort.Client> implements GroupMember<T> {
public static final int TIMEOUT = 5000;
private final Constructor<? extends T> clientCtor;
private InetSocketAddress address;
private final PublicKey publicKey;
private final Optional<PrivateKey> privateKey;
private final int id;
private final String name;
// private final GenericObjectPool<T> clientPool;
public NetworkedNonSigningGroupMember(String name, int id, InetSocketAddress address, Class<? extends T> impl, PublicKey publicKey, Optional<PrivateKey> privateKey) throws NoSuchMethodException {
this.name = name;
this.publicKey = publicKey;
this.id = id;
this.privateKey = privateKey;
this.clientCtor = impl.getConstructor(TProtocol.class);
this.address = address;
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMinIdle(10);
genericObjectPoolConfig.setMaxIdle(200);
genericObjectPoolConfig.setBlockWhenExhausted(true);
// this.clientPool = new GenericObjectPool<T>(new ThriftConnectionFactory<T>(getAddress(), TIMEOUT, clientCtor));
// clientPool.setConfig(genericObjectPoolConfig);
}
@Override
public PrivateKey getPrivateKey() {
return privateKey.get();
}
@Override
public int getReplicaID() {
return id;
}
@Override
public T getThriftConnection() throws Exception {
TSocket trans = new TSocket(address.getHostName(), address.getPort(), TIMEOUT);
trans.open();
return clientCtor.newInstance(new TBinaryProtocol(trans));
}
@Override
public void returnThriftConnection(T connection) {
connection.getInputProtocol().getTransport().close();
connection.getOutputProtocol().getTransport().close();
}
@Override
public boolean verifySignature(Object message, byte[] signatureToVerify) {
return true;
// try {
// Signature newSig = Signature.getInstance(CryptoUtil.ALGORITHM, CryptoUtil.PROVIDER);
// newSig.initVerify(publicKey);
// byte[] byteRep = CryptoUtil.convertToJsonByteArray(message);
// newSig.update(byteRep);
// newSig.verify(signatureToVerify);
//
// } catch (NoSuchAlgorithmException e) {
// e.printStackTrace();
// } catch (NoSuchProviderException e) {
// e.printStackTrace();
// } catch (InvalidKeyException e) {
// e.printStackTrace();
// } catch (SignatureException e) {
// e.printStackTrace();
// return false;
// }
//
// return true;
}
@Override
public String getName() {
return name;
}
@Override
public InetSocketAddress getAddress() {
return address;
}
@Override
public InetSocketAddress getWebsocketAddress() {
return null;
}
}