package network.thunder.core.communication.objects.lightning.subobjects;
import network.thunder.core.mesh.LNConfiguration;
import java.util.ArrayList;
import java.util.List;
/**
* Created by matsjerratsch on 16/12/2015.
*/
public class ChannelStatus implements Cloneable {
public long amountClient;
public long amountServer;
public List<PaymentData> remainingPayments = new ArrayList<>();
public List<PaymentData> newPayments = new ArrayList<>();
public List<PaymentData> refundedPayments = new ArrayList<>();
public List<PaymentData> redeemedPayments = new ArrayList<>();
public int feePerByte;
public long csvDelay;
public void applyConfiguration (LNConfiguration configuration) {
this.feePerByte = configuration.DEFAULT_FEE_PER_BYTE;
this.csvDelay = configuration.DEFAULT_REVOCATION_DELAY;
}
@Override
protected Object clone () throws CloneNotSupportedException {
return super.clone();
}
public ChannelStatus getClone () {
try {
ChannelStatus status = (ChannelStatus) this.clone();
status.remainingPayments = clonePaymentList(this.remainingPayments);
status.newPayments = clonePaymentList(this.newPayments);
status.redeemedPayments = clonePaymentList(this.redeemedPayments);
status.refundedPayments = clonePaymentList(this.refundedPayments);
status.csvDelay = this.csvDelay;
status.feePerByte = this.feePerByte;
return status;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public ChannelStatus getCloneReversed () {
ChannelStatus status = getClone();
long temp = status.amountServer;
status.amountServer = status.amountClient;
status.amountClient = temp;
reverseSending(status.newPayments);
reverseSending(status.remainingPayments);
reverseSending(status.redeemedPayments);
reverseSending(status.refundedPayments);
return status;
}
private List<PaymentData> reverseSending (List<PaymentData> paymentDataList) {
for (PaymentData payment : paymentDataList) {
payment.sending = !payment.sending;
}
return paymentDataList;
}
private List<PaymentData> clonePaymentList (List<PaymentData> paymentList) {
List<PaymentData> list = new ArrayList<>(this.remainingPayments.size());
for (PaymentData data : paymentList) {
try {
list.add((PaymentData) data.clone());
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
return list;
}
@Override
public String toString () {
return "ChannelStatus{" +
", amountClient=" + amountClient +
", amountServer=" + amountServer +
", newPayments=" + listToString(newPayments) +
", remainingPayments=" + listToString(remainingPayments) +
", refundedPayments=" + listToString(refundedPayments) +
", redeemedPayments=" + listToString(redeemedPayments) +
", csvDelay=" + csvDelay +
'}';
}
private static String listToString (List list) {
String s = list.size() + " ";
if (list.size() > 0) {
for (Object o : list) {
s += o.toString() + " - ";
}
}
s = s.substring(0, s.length() - 2);
return s;
}
}